Модель доменной модели GraphCool - атрибут ModifiedBy создает проблемы

Я пытаюсь использовать Graphcool для разработки бэкенда для нашего продукта. У нас уже есть модель домена для продукта.

Проблема, с которой я сталкиваюсь, связана с нескалярными атрибутами, где я вынужден использовать @relation (это тоже двустороннее отношение).

Помогите мне разработать следующий случай

# projectId: cj4dsyc7ur8cc0142s3hesy1r
# version: 2

type File implements Node {
  contentType: String!
  createdAt: DateTime!
  id: ID! @isUnique
  name: String!
  secret: String! @isUnique
  size: Int!
  updatedAt: DateTime!
  url: String! @isUnique
}

type User implements Node {
  createdAt: DateTime!
  email: String @isUnique
  id: ID! @isUnique
  password: String
  updatedAt: DateTime!
}

type Record implements Node {
  createdAt: DateTime!  
  id: ID! @isUnique
  name: String!
  description: String!
  createdBy: User!
  modifiedBy: User!
}

За это я получаю ошибку

Errors
createdBy: The relation field `createdBy` must specify a `@relation` directive: `@relation(name: "MyRelation")`
modifiedBy: The relation field `modifiedBy` must specify a `@relation` directive: `@relation(name: "MyRelation")`

Затем, когда я пытаюсь добавить отношение, я вынужден сделать следующее

# projectId: cj4dsyc7ur8cc0142s3hesy1r
# version: 2

type File implements Node {
  contentType: String!
  createdAt: DateTime!
  id: ID! @isUnique
  name: String!
  secret: String! @isUnique
  size: Int!
  updatedAt: DateTime!
  url: String! @isUnique
}

type User implements Node {
  createdAt: DateTime!
  email: String @isUnique
  id: ID! @isUnique
  password: String
  updatedAt: DateTime!
}

type Record implements Node {
  createdAt: DateTime!  
  id: ID! @isUnique
  name: String!
  description: String!
  createdBy: User! @relation(name: "createdBy")
  modifiedBy: User! @relation(name: "modifiedBy")
}

Что приводит к следующей ошибке

Errors
createdBy: A relation directive with a name must appear exactly 2 times.
modifiedBy: A relation directive with a name must appear exactly 2 times.

Я понимаю, что для каждого не скалярного исходящего Graphcool предполагается установить двусторонние отношения. Но рассмотрим вариант использования для updatedBy и createBy (User), я не могу установить отношение к объекту User для каждой добавляемой мной сущности.

Какой лучший способ сделать это на GraphCool?

Кроме того, почему это ограничение установлено GraphCool, GraphQL не диктует это ограничение?

Ура Рохит

1 ответ

Решение

Спасибо за использование Graphcool!

Обо всем по порядку. Как вы заметили, Graphcool применяет двусторонние отношения, когда вы хотите соединять типы. В некоторых случаях вы заранее знаете, что хотите запрашивать данные только в одном направлении, поэтому может показаться неинтуитивным, что вам нужно создать двустороннюю связь.

Причина этого заключается в том, что система разрешений Graphcool позволяет вам кратко определять правила разрешений, основанные на структуре ваших данных. В вашем случае вы можете указать, что только создатель поста может удалить запись.

На практике оказывается, что очень часто вам в конечном итоге понадобится обратное отношение при реализации ваших правил разрешения. Применение двухсторонних отношений упрощает понимание всей модели программирования и позволяет легко реализовать правила разрешений.

Для вашей схемы решением было бы расширить тип User следующим образом:

type User implements Node {
  createdAt: DateTime!
  email: String @isUnique
  id: ID! @isUnique
  password: String
  updatedAt: DateTime!
  createdRecords: [Record!]! @relation(name: "CreatedBy")
  modifiedRecords: [Record!]! @relation(name: "UpdatedBy")
}

(обратите внимание, что имена отношений должны начинаться с заглавной буквы)

Надеюсь, это поможет:-)

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