Федерация Аполлона: заменяет ли Федерация delegateToSchema?

Краткая версия: Могу ли я использовать Apollo Federation для замены функциональностиdelegateToSchema, и если да, то как? Идея состоит в том, чтобы повторно использовать логику преобразователя из другого сервиса, который является черным ящиком.

Длинная версия:

Я часами рыскал по Интернету, пытаясь понять, как объединить две службы без явного написания нового преобразователя. Аполлон неопределенно говорит, что вы можете перейти от сшивки схемы к федерации, но рассмотрим этот пример:

type User @key(fields: "username"){
  username: ID!
  photos: [Photo] @provides(fields: "created_by")
}

extend type Photo @key(fields: "id") {
  id: ID! @external
  created_by: ID! @external # I want to match this with username
}

Я использую PostGraphile для преобразования моей базы данных в схему GraphQL со всеми необходимыми преобразователями для CRUD. Уже есть запрос, с помощью которого я могу получить фотографии для конкретного пользователя:

allPhotos(condition: {created_by: $username}) { ... }

Это существует в другом сервисе, который я рассматриваю как черный ящик. Не идеально (или просто) написать новый преобразователь вручную, тем более, что данные есть, мне просто нужно сказать Apollo, как их получить. Я подумал, может, я смогу использоватьdelegateToSchema:

delegateToSchema({
  schema: pgSchema,
  operation: 'query',
  fieldName: 'allPhotos(condition: {created_by: $username})',
  args: { username: args.username },
  context: context,
  info: info
})

Но из того, что я вижу в документах и ​​статьях, это сшивание схемы, которое предполагается заменить федерацией. В идеале я бы хотел использовать для этого только федерацию, если это возможно. Является ли это возможным? В документации это не проясняется, и каждый пример, который я видел с федерацией, по-прежнему требует, чтобы вы написали собственный преобразователь. Это почти как если бы директивы просто подсказывали, чтобы убедиться, что у вас есть правильные поля в ваших преобразователях, вместо того, чтобы фактически выполнять какую-либо логику.

Любая помощь приветствуется!

1 ответ

Возможно. Твойcreated_by должен быть User, а не ID!, и вам нужно исключить User в сервисе, реализующем Photo.

Другие вопросы по тегам