advanced

GraphQL schema and operations

Осознанно моделируйте types, fields, queries, mutations, subscriptions, nullability, input types и operation contracts.

GraphQL предоставляет типизированную schema, которую клиенты запрашивают через один endpoint. Operations: **Query** (чтение), **Mutation** (запись), **Subscription** (push).

					type Order {
  id: ID!
  status: OrderStatus!
  total: Money!
  customer: Customer!
}

enum OrderStatus { PENDING SHIPPED CANCELLED }

input CreateOrderInput {
  customerId: ID!
  lineItems: [LineItemInput!]!
}

type Mutation {
  createOrder(input: CreateOrderInput!): CreateOrderPayload!
}

type Query {
  order(id: ID!): Order
  orders(first: Int!, after: String): OrderConnection!
}
				

Решения проектирования:

  • **Nullability**: `!` только когда сервер всегда резолвит; nullable для частичных сбоев в списках.
  • **Input types** отдельно от output; не раскрывайте внутреннюю форму хранения.
  • **Connections** (Relay-style) для pagination: `edges { node cursor }`, `pageInfo`.
  • **Payload types** для mutations: `{ order, errors }` или union results для domain failures.

На интервью: когда GraphQL лучше REST (гибкие чтения, mobile), цена неограниченных запросов, эволюция schema (deprecated fields, @oneOf).

Типовые ошибки: зеркало таблиц БД в графе, всё non-null, mutations как RPC без validation input, breaking clients удалением полей без deprecation.

Компромисс: гибкость клиента против предсказуемости сервера — complexity limits и persisted operations в production.

Чеклист:

  • Моделируйте domain types, не tables.
  • Осознанная nullability и pagination.
  • Deprecate перед удалением; additive changes.
  • Валидация inputs на границе API.