Tutorial do schema
Tutorial do schemaLição 7: Adaptando conteúdo em massa

Lição 7: Adaptando conteúdo em massa

Esta lição do tutorial adapta conteúdo em massa, atualizando o título, o conteúdo e o resumo de múltiplos posts com uma única requisição GraphQL.

Para que esta query GraphQL funcione, a Configuração do Schema aplicada ao endpoint precisa ter as Mutations Aninhadas habilitadas

A query GraphQL abaixo recupera os dados de múltiplos posts, executa uma busca e substituição nos campos title, content e excerpt de cada um deles, adapta-os como inputs para a mutation e exporta uma única variável dinâmica $postInputs com todos os resultados como um dicionário, no formato:

{
  "${post ID}": {
    "title": "${adapted post title}",
    "excerpt": "${adapted post excerpt}"
  },
  // repeat for all other posts ...
}

Na operação mutation, cada uma dessas entradas é recuperada via _objectProperty (usando ${post ID} como chave) e passada como input para atualizar o post:

query TransformAndExportData(
  $limit: Int! = 5,
  $offset: Int! = 0,
  $replaceFrom: [String!]!
  $replaceTo: [String!]!
) {
  posts: posts(
    pagination: { limit: $limit, offset: $offset }
    sort: { by: ID, order: ASC }
  ) {
    rawTitle
    rawContent
    rawExcerpt
      @strReplaceMultiple(
        search: $replaceFrom
        replaceWith: $replaceTo
        affectAdditionalFieldsUnderPos: [1, 2]
      )
      @deferredExport(
        as: "postAdaptedSources"
        type: DICTIONARY
        affectAdditionalFieldsUnderPos: [1, 2]
      )
  }
}
 
query AdaptDataForMutationInput
  @depends(on: "TransformAndExportData")
{
  postInputs: _echo(value: $postAdaptedSources)
    @underEachJSONObjectProperty(
      passValueOnwardsAs: "adaptedSource",
      affectDirectivesUnderPos: [1, 2, 3, 4]
    )
      @applyField(
        name: "_objectProperty",
        arguments: {
          object: $adaptedSource,
          by: {
            key: "rawTitle"
          }
        },
        passOnwardsAs: "adaptedTitle"
      )
      @applyField(
        name: "_objectProperty",
        arguments: {
          object: $adaptedSource,
          by: {
            key: "rawExcerpt"
          }
        },
        passOnwardsAs: "adaptedExcerpt"
      )
      @applyField(
        name: "_objectProperty",
        arguments: {
          object: $adaptedSource,
          by: {
            key: "rawContent"
          }
        },
        passOnwardsAs: "adaptedContent"
      )
      @applyField(
        name: "_echo",
        arguments: {
          value: {
            title: $adaptedTitle,
            excerpt: $adaptedExcerpt,
            contentAs: {
              html: $adaptedContent
            }
          }
        },
        setResultInResponse: true
      )
    @export(as: "postInputs")
}
 
mutation UpdatePost(
  $limit: Int! = 5,
  $offset: Int! = 0
)
  @depends(on: "AdaptDataForMutationInput")
{
  adaptedPosts: posts(
    pagination: { limit: $limit, offset: $offset }
    sort: { by: ID, order: ASC }
  ) {
    id
    postInput: _objectProperty(
      object: $postInputs,
      by: { key: $__id }
    ) @remove
    update(input: $__postInput) {
      status
      errors {
        __typename
        ...on ErrorPayload {
          message
        }
      }
      post {
        title
        content
        excerpt
      }
    }
  }
}
  • A extensão Field on Field fornece a diretiva @applyField que, invocada com _objectProperty, extrai as propriedades de cada item no objeto JSON (passado como $adaptedSource), e então com _echo, cria o input JSON correspondente com essas propriedades
  • Além dos campos de função, a extensão PHP Functions via Schema também fornece funcionalidades por meio das correspondentes "diretivas de função", como @strReplaceMultiple
  • Quando as Diretivas Multi-Campo estão habilitadas, podemos aplicar uma diretiva a mais de um campo, indicando a(s) posição(ões) relativa(s) do(s) campo(s) adicional(is) via argumento affectAdditionalFieldsUnderPos
  • Ao aplicar uma diretiva a algum campo e em seguida exportar seu valor, é necessário usar @deferredExport em vez de @export
  • Ao usar Diretivas Multi-Campo com @export (ou @deferredExport), o valor exportado é um objeto JSON contendo todos os campos
  • A mutation Post.update está disponível no schema somente quando a funcionalidade Mutations Aninhadas está habilitada