Blog

🚀 Lançada a nova versão 0.8 do Gato GraphQL!

Leonardo Losoviz
Por Leonardo Losoviz ·

A versão 0.8 do Gato GraphQL está agora disponível para download! 🎉

Esta é uma versão enorme, que se concentra em três áreas:

  1. Refatoração do código para habilitar extensões
  2. Maior conformidade com a especificação GraphQL
  3. Conclusão do schema GraphQL

Além disso, suporta o novo WordPress 5.8 e contém diversas correções de bugs e melhorias.

Observe que esta versão contém breaking changes!

Abaixo estão as notas de lançamento. Links rápidos:


Suporte ao WordPress 5.8

O WordPress 5.8 deprecou vários filter hooks, incluindo allowed_block_types e block_categories (usados por este plugin).

Os hooks afetados foram substituídos:

  1. allowed_block_types => allowed_block_types_all
  2. block_categories => block_categories_all

Suporte aprimorado ao PHP 8.0

Esta versão corrige alguns problemas ao usar PHP 8.0.

Código simplificado, usando container services em todo lugar

O código do servidor GraphQL foi refatorado para usar um service container ao registrar todos os elementos do schema (type resolvers, field resolvers, interface resolvers, custom scalar resolvers e outros).

Este é um marco importante, que introduz uma abordagem única para desenvolver o plugin e suas extensões, simplificando bastante o código e a documentação.

A documentação sobre como criar extensões personalizadas para o Gato GraphQL pode finalmente ser escrita. O trabalho nela começará em breve e será publicado na seção de guias.

O cache é salvo em wp-content

O plugin armazena resultados em cache no disco para otimizar o desempenho.

Os arquivos em cache eram anteriormente armazenados em uma pasta do sistema, fora da visão do usuário administrador. A partir de agora, eles são armazenados em wp-content/graphql-api/cache/.

Um endpoint GraphQL de "schema fixo" foi introduzido para alimentar o editor do WordPress

Agora existem 2 endpoints no wp-admin:

  1. GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINT
  2. GRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT

Com GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINT, o schema GraphQL é modificado pelas preferências do usuário, como ser namespaced ou não, ter tipos/directives habilitados ou não, entre outros.

Com GRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT, o schema GraphQL não é modificado pelas preferências do usuário, expondo sempre todos os tipos, campos e directives, incluindo os campos admin "unrestricted".

O endpoint fixo permite que os blocos Gutenberg consultem todos os campos, independentemente de estarem habilitados ou não pelo usuário, e com acesso irrestrito.

Suporte adicional a tipos de campo no schema

O suporte para listas como tipos de campo foi expandido, agora suportando os seguintes recursos:

  • Listas com itens não nulos: [String!]
  • Listas de listas: [[String]]
  • Qualquer combinação delas: [[String!]!]

Input coercion: aceitar um único valor quando uma lista é esperada

Agora podemos inserir um único valor na query GraphQL onde uma lista é esperada, como definido na especificação GraphQL.

Por exemplo, estas queries agora são equivalentes:

query InputSingleValue {
  posts(filter: { ids: 1 }) {
    title
  }
}
 
query InputListOfSingleItem {
  posts(filter: { ids: [1] }) {
    title
  }
}

Schema WordPress mais completo

Entidades adicionais do modelo de dados do WordPress foram adicionadas ao schema GraphQL:

Schema GraphQL

Vamos ver quais novos elementos foram adicionados.

Categorias

As categorias foram mapeadas, por meio do novo tipo PostCategory, e os novos campos:

  • Root.postCategories: [PostCategory]
  • Root.postCategory: PostCategory
  • Post.categories: [PostCategory]

Por exemplo, esta query recupera as categorias dos posts:

{
  posts {
    id
    title
    categories {
      id
      name
      url
    }
  }
}

Um campo mutation, para atribuir categorias aos posts, também foi adicionado:

  • MutationRoot.setCategoriesOnPost: Post

E um input categories foi adicionado aos campos mutation para posts:

  • MutationRoot.createPost
  • MutationRoot.updatePost
  • Post.update (quando nested mutations estão habilitadas)

Meta

Valores meta de custom post, usuário, comentário e taxonomia agora podem ser consultados, por meio dos novos campos:

  • Post.metaValue: AnyScalar
  • Post.metaValues: [AnyScalar]
  • User.metaValue: AnyScalar
  • User.metaValues: [AnyScalar]
  • Comment.metaValue: AnyScalar
  • Comment.metaValues: [AnyScalar]
  • PostCategory.metaValue: AnyScalar
  • PostCategory.metaValues: [AnyScalar]
  • PostTag.metaValue: AnyScalar
  • PostTag.metaValues: [AnyScalar]

Por exemplo, esta query recupera o meta last_name para os usuários:

{
  users {
    id
    lastName: metaValue(key: "last_name")
  }
}

Como os valores meta podem ser qualquer coisa (string, integer, float ou boolean), eles foram mapeados por meio do novo tipo escalar genérico AnyScalar.

Os valores meta podem ser públicos ou privados. As meta keys que podem ser consultadas devem ser configuradas explicitamente na página de configurações:

Definindo as entradas
Definindo as entradas

Por padrão, a lista de meta keys permitidas está vazia.

Os menus foram mapeados, por meio do novo tipo Menu, e o novo campo Root.menu.

{
  menu(by: { id: 176 }) {
    itemDataEntries
  }
}

Settings

As configurações do site (armazenadas na tabela wp_options) podem ser consultadas por meio do novo campo Root.option: AnyScalar.

Por exemplo, esta query recupera o nome do site:

{
  siteName: optionValue(name: "blogname")
}

As opções que podem ser acessadas devem ser configuradas explicitamente na página de configurações:

Definindo as entradas para os Settings

Por padrão, apenas as seguintes opções podem ser consultadas:

  • "home"
  • "blogname"
  • "blogdescription"

User posts

Usuários autenticados podem recuperar seus próprios posts, para qualquer status (publish, pending, draft ou trash), por meio dos novos campos:

  • Root.myPosts: [Post]
  • Root.myPostCount: Int
  • Root.myPost: Post

Por exemplo, agora podemos executar esta query:

# Log yourself in first
mutation LogIn {
  loginUser(usernameOrEmail: "test", password: "pass") {
    id
    name
  }
}
 
# Then retrieve your posts
query GetMyPosts {
  myPosts {
    id
    title
    url
    status
    author {
      name
    }
  }
}

Adicionados campos admin "unrestricted" ao schema GraphQL

O schema GraphQL deve encontrar um equilíbrio entre campos públicos e privados, a fim de evitar expor informações privadas em uma API pública.

O novo módulo Schema for the Admin adiciona campos admin "unrestricted" ao schema GraphQL, que podem expor dados privados:

Root:

  • unrestrictedPost
  • unrestrictedPosts
  • unrestrictedPostCount
  • unrestrictedCustomPost
  • unrestrictedCustomPosts
  • unrestrictedCustomPostCount
  • unrestrictedGenericCustomPost
  • unrestrictedGenericCustomPosts
  • unrestrictedGenericCustomPostCount
  • unrestrictedPage
  • unrestrictedPages
  • unrestrictedPageCount
  • unrestrictedUsers
  • roles
  • capabilities

User:

  • unrestrictedPosts
  • unrestrictedPostCount
  • unrestrictedCustomPosts
  • unrestrictedCustomPostCount
  • roles
  • capabilities

PostCategory:

  • unrestrictedPosts
  • unrestrictedPostCount

PostTag:

  • unrestrictedPosts
  • unrestrictedPostCount

Por exemplo, para acessar dados de posts, atualmente temos o campo posts, que expõe apenas dados públicos, buscando posts publicados.

A partir de agora, também podemos acessar dados de posts por meio do campo unrestrictedPosts, que expõe dados públicos e privados, buscando posts com qualquer status ("publish", "draft", "pending", "trash").

{
  unrestrictedPosts(status: [draft, pending]) {
    id
    title
    status
    author {
      id
      name
    }
  }
}

Introdução do tipo escalar AnyScalar

O tipo escalar AnyScalar representa qualquer um dos escalares integrados (String, Int, Boolean, Float ou ID).

Ele é usado nos campos option e metaValue(s) recém-introduzidos, pois não conhecemos antecipadamente o tipo dos dados retornados, e a união de tipos escalares ainda não é suportada pela especificação GraphQL.

Settings em formato longo

As opções na página Settings são divididas por abas. A partir da v0.8 também é possível visualizá-las todas juntas em uma única página longa.

Para habilitar este comportamento, desmarque o item "Have all options in this Settings page be organized under tabs, one tab per module." nas Settings, e clique em "Save Changes":

Caixa de seleção para habilitar/desabilitar abas nas Settings

Em seguida, todas as configurações serão exibidas juntas no formato longo:

Settings em formato longo


Breaking changes

A versão v0.8 introduz breaking changes em relação à versão anterior.

Breaking changes de configuração

Os seguintes CPTs tiveram seu bloco "Options" reconstruído:

  • Schema Configurations
  • Custom Endpoints
  • Persisted Queries

Na versão anterior v0.7, um único bloco Options para essas entidades continha muitos itens de configuração. Desde a v0.8, esse bloco foi desacoplado em vários blocos independentes, cada um contendo sua própria configuração.

Por exemplo, na v0.7, (além de habilitar/desabilitar o endpoint) o bloco Custom Endpoint Options permitia configurar os clientes GraphiQL e Interactive Schema:

Options in Custom Endpoint

Desde a v0.8, essa configuração é adicionada por meio dos blocos GraphiQL e Interactive Schema:

Options in Custom Endpoint

A configuração armazenada nos blocos Options para todos os 3 CPTs não é migrada automaticamente para o novo formato. Portanto, antes de atualizar para a v0.8, anote sua configuração armazenada e replique-a após a atualização para a nova versão.

Pedimos desculpas pelo inconveniente.

Além disso, você precisará clicar no botão "Reset the template" exibido no editor do WordPress, para todas as entradas dos 3 CPTs.

Reset the template no editor do WordPress

Directives não padrão removidas

As directives não padrão foram removidas do plugin:

  • @default
  • @removeIfNull
  • @export

Módulos removidos

Os seguintes módulos foram removidos do plugin:

  • Field Deprecation
  • Configuration Cache
  • Schema Cache
  • Multiple Query Execution
  • Proactive Feedback
  • Schema Editing Access
  • Embeddable fields

Roadmap futuro

Agora que a v0.8 foi lançada, podemos começar a planejar o caminho à frente.

O plano atual é o seguinte:

Lançar a v0.9 em setembro de 2021, incluindo:

  • Custom scalars
  • Um schema GraphQL atualizado, usando custom scalars quando apropriado (ex: Post.date retornará o tipo Date em vez de String)
  • Melhorias adicionais para suporte a extensões

E então, lançar a v1.0 no final do ano ou no início de 2022, incluindo:

  • Uma demonstração de um plugin de extensão
  • Guias de documentação completos sobre a criação de extensões
  • Lançamento do plugin Gato GraphQL no wp.org

Para receber notificações sobre o status atual, você pode se inscrever na newsletter.


Encontrou problemas?

Se você tiver algum problema ao instalar ou executar a v0.8, crie uma issue no repositório.


Assine nossa newsletter

Fique por dentro de todas as atualizações do Gato GraphQL.