Модель доменной модели 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")
}
(обратите внимание, что имена отношений должны начинаться с заглавной буквы)
Надеюсь, это поможет:-)