У меня есть понятие «контекст просмотра» на моем сервере GraphQL.Для большинства объектов загрузчик просто отказывается загружать объект, если «контекст просмотра» решает, что объект не должен быть видимым.Это хороший способ реализовать конфиденциальность на уровне объекта, но мне нужно реализовать конфиденциальность на уровне поля для некоторых объектов в системе.В частности, у меня есть тип Challenge
, который включает в себя поле senderArmy
.senderArmy
должен быть виден, когда зритель является отправителем, но не когда зритель является получателем.Другие поля объекта Challenge
должны быть видны обеим сторонам.
Я обдумал несколько вариантов:
- Мой объект базы данных может "замаскировать" это полеотказываясь загружать этот столбец.Это приводит к проблемам, когда я пытаюсь обновить запись, так как я не хочу, чтобы обновление фактически устанавливало поле в null, когда оно сохраняется.
- Я могу сделать так, чтобы мой распознаватель полей реализовал проверку видимости поля.Это приводит к неловкому расщеплению логики, когда конфиденциальность на уровне поля реализована в резольверах, а конфиденциальность на уровне объектов реализована в моделях.
- Я могу сделать так, чтобы мой родительский преобразователь "маскировал" поле с помощью конфиденциальностиметод получения.Это приводит к рискованному сценарию, когда забыв использовать этот метод для распознавателя, вы получаете запрос, который работает идеально, но не учитывает конфиденциальность на уровне поля.
Я думаю, что идеальным сценарием было бы, если бы яможет установить преобразователь уровня объекта.Нечто подобное было бы идеально:
const schema = gql`
type Challenge {
senderArmy: String
}
type User {
challenges: [Challenge!]
}
`;
const resolver = {
Challenge: (obj) => obj.getFilteredFields(),
User: {
challenges: (obj) => obj.getChallenges(),
}
};
При таком кодировании makeExecutableSchema
игнорирует мой распознаватель Challenge
уровня объекта.Есть ли способ выполнить то, что я ищу, не вызывая getFilteredFields
на каждом распознавателе, который возвращает объект Challenge
?
Спасибо!