Недавно я сделал нечто подобное, и мне показалось, что лучше всего создать интерфейс для базового типа пользователя.
interface UserInformation {
id: ID!
userName: String
firstName: String!
lastName: String
avatarImage: String
city: String
...
}
Тогда у вас будет две отдельные реализации:
type UserPublic implements UserInformation {
id: ID!
userName: String
firstName: String!
lastName: String
avatarImage: String
...
}
type UserPrivate implements UserInformation {
id: ID!
userName: String
firstName: String!
lastName: String
avatarImage: String
friends: [UserInformation!]
pendingFriends: [UserInformation!]
phone: String
email: String
birthday: DateTime
...
}
Все остальные ваши запросы и типы используют базовый тип интерфейса UserInformation
при отображении Пользователей. Тогда ваш сервер graphql просто возвращает либо UserPublic
, либо UserPrivate
в зависимости от того, какой тип доступа имеет пользователь.
На стороне клиента вы запрашиваете его следующим образом:
query SomeQuery {
getSomeData {
user {
id
userName
firstName
lastName
avatarImage
...on UserPrivate {
email
phone
}
...
Вы Затем можно проверить на стороне клиента, был ли возвращенный тип поля (__typename
) UserPublic
или UserPrivate
и действовать соответственно.