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
@applyFieldque, 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
@deferredExportem 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.updateestá disponível no schema somente quando a funcionalidade Mutations Aninhadas está habilitada