Контекст
У меня есть GraphQL API и приложение NodeJS & Angular с базой данных MongoDB, в которой содержатся пользователи. Для каждого пользователя есть общедоступная страница с общедоступной информацией, например id
и username
. Когда пользователь входит в систему, появляется личная страница профиля с расширенной информацией, например email
.
Просто для контекста я использую jsonwebtoken с accesscontrol для аутентификации и авторизации пользователя. Информация хранится в контексте каждой функции разрешения GraphQL, поэтому доступно все, что необходимо для идентификации вошедшего в систему пользователя.
У меня есть запрос GraphQL, который извлекает общедоступного пользователя следующим образом:
query getUserById($id: ID!) {
getUserById(id: $id) {
id,
username
}
}
Я пытаюсь придумать правильную реализацию для извлечения публичного или частного пользователя. Поскольку GraphQL строго типизирован, у меня возникли проблемы с поиском правильного решения.
Вопрос
Как провести различие между общедоступным и частным пользователем?
Рекомендации
1. Отдельный запрос
Таким образом, один из вариантов - создать отдельный запрос как для общедоступных, так и для частных полей:
общедоступный запрос
query getUserById($id: ID!) {
getUserById(id: $id) {
id,
username
}
}
частный запрос
query getMe {
getMe {
id,
username,
email
}
}
2. Использование интерфейсов GraphQL
Я наткнулся на этот носитель статья, в которой объясняется, как интерфейсы GraphQL используются для возврата различных типов на основе resolveType
функции. Я бы сказал примерно так:
query getUser($id: ID!) {
getUser(id: $id) {
... on UserPrivate {
id,
username
}
... on UserPublic {
id,
username,
email
}
}
}
Я не нашел подходящего решения, и я не уверен ни в одном из соображений, которые у меня есть.
Любая помощь высоко ценится!