Передайте аргумент ввода Graphql в директиву

У меня есть простой запрос graphql и директива

directive @isOwner(postID: String!) on FIELD_DEFINITION

type Query {
  post(postID: String!): Post! @isOwner(postID: postID)
}

Проблема в том, что я использую GQLGen для генерации стандартного кода для Go, а директивы обрабатываются иначе, чем входные значения. Это представляет собой уникальную проблему, когда логика авторизации почти изолирована от фактического чтения БД, что делает логику очень неэффективной, поскольку мне приходится либо делать чтение базы данных дважды: во время проверки и фактического чтения БД. Данные, необходимые для проверки, также требуются для чтения db, и мне пришлось бы отредактировать весь мой код, чтобы вставить эти данные в контекст. Есть ли способ динамически передавать аргументы ввода в директиву и выполнять проверку динамически, и является ли это хорошей практикой в ​​первую очередь?

1 ответ

Решение

Аргументы, передаваемые в директивы схемы, оцениваются при первоначальном построении схемы, поэтому они не могут быть динамическими. В этом конкретном случае вам вообще не нужен аргумент - вы можете просто прочитать значение аргументов поля.

visitFieldDefinition(field) {
  const { resolve = defaultFieldResolver } = field
  field.resolve = async function (parent, args, context, info) {
    console.log(args.postID)    

    return resolve.apply(this, [parent, args, context, info])
  }
}

Однако, если имя аргумента зависит от поля, то вы можете передать, что в качестве аргумента в вашу директиву

directive @isOwner(argName: String!) on FIELD_DEFINITION
visitFieldDefinition(field) {
  const { resolve = defaultFieldResolver } = field
  const { argName } = this.args
  field.resolve = async function (parent, args, context, info) {
    console.log(args[argName])    

    return resolve.apply(this, [parent, args, context, info])
  }
}

Другие вопросы по тегам