Давайте представим, что у нас есть простой тип в graphql
type Coupon {
id: ID!
code: String!
}
Я бы хотел показывать поле id только в том случае, если у пользователя есть определенное условие. Затем я создам директиву
directive IncludeWhen(cond: String!) on FIELD_DEFINITION
и отредактирую код как
type Coupon {
id: ID! @IncludeWhen(cond: "ADMIN")
code: String!
}
Я проверю в преобразователе директив, есть ли у пользователя необходимые привилегии:
export class IncludeWhenDirective extends SchemaDirectiveVisitor {
public visitFieldDefinition(field) {
const { resolve = defaultFieldResolver } = field;
const requiredCond = this.args.cond;
field.resolve = async function (...args) {
const context = args[2];
const currentUser = context.currentUser;
let result;
if (currentUser.hasCond(requiredCond) {
throw new AuthenticationError();
result = await resolve.apply(this, args);
}
return result;
};
}
}
Ну, это неправильно. Конечная точка возвращает ошибку, такую как
Cannot return null for non-nullable field Coupon.ID
при запросе от пользователя без обязательных условий.
Можно ли полностью пропустить это поле? Может быть, получить доступ к распознавателю и удалить поля, не разбивая все это?