Blog

🚀 Nieuwe versie 0.8 van Gato GraphQL uitgebracht!

Leonardo Losoviz
Door Leonardo Losoviz ·

Versie 0.8 van Gato GraphQL is nu beschikbaar om te downloaden! 🎉

Dit is een enorme release, die zich richt op drie gebieden:

  1. Refactoring van de codebase om extensies mogelijk te maken
  2. Verdere naleving van de GraphQL-specificatie
  3. Voltooiing van het GraphQL-schema

Daarnaast ondersteunt het het nieuwe WordPress 5.8 en bevat het tal van bugfixes en verbeteringen.

Let op: deze release bevat breaking changes!

Hieronder staan de release notes. Snelkoppelingen:


Ondersteuning voor WordPress 5.8

WordPress 5.8 markeert verschillende filter hooks als verouderd, waaronder allowed_block_types en block_categories (gebruikt door deze plugin).

De betreffende hooks zijn vervangen:

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

Verbeterde ondersteuning voor PHP 8.0

Deze release verhelpt een aantal problemen bij het gebruik van PHP 8.0.

Vereenvoudigde codebase, met container services overal

De codebase van de GraphQL-server is gerefactord om een service container te gebruiken voor het registreren van alle elementen voor het schema (type resolvers, field resolvers, interface resolvers, custom scalar resolvers en andere).

Dit is een mijlpaal die een enkele aanpak introduceert voor het ontwikkelen van de plugin en zijn extensies, waardoor hun code en documentatie aanzienlijk worden vereenvoudigd.

Documentatie over het maken van aangepaste extensies voor Gato GraphQL kan eindelijk worden geschreven. Werk hieraan zal binnenkort beginnen en wordt gepubliceerd in de gidsen-sectie.

Cache wordt opgeslagen onder wp-content

De plugin slaat resultaten op schijf op om de prestaties te optimaliseren.

De gecachte bestanden werden eerder opgeslagen in een systeemmap, buiten het zicht van de beheerder. Voortaan worden ze opgeslagen onder wp-content/graphql-api/cache/.

Een GraphQL-endpoint met "vast schema" werd geïntroduceerd voor de WordPress-editor

Nu zijn er 2 endpoints in de wp-admin:

  1. GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINT
  2. GRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT

Met GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINT wordt het GraphQL-schema aangepast door gebruikersvoorkeuren, zoals het gebruik van naamruimten of niet, het in- of uitschakelen van typen/directives en andere.

Met GRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT wordt het GraphQL-schema niet aangepast door gebruikersvoorkeuren en worden altijd alle typen, velden en directives blootgesteld, inclusief de "onbeperkte" admin-velden.

Het vaste endpoint stelt Gutenberg-blokken in staat alle velden op te vragen, ongeacht of deze door de gebruiker zijn ingeschakeld of niet, en met onbeperkte toegang.

Verdere ondersteuning van veldtypen in het schema

Ondersteuning voor lijsten als veldtypen is uitgebreid en ondersteunt nu de volgende functies:

  • Lijsten met niet-null items: [String!]
  • Lijsten van lijsten: [[String]]
  • Elke combinatie daarvan: [[String!]!]

Input coercion: een enkele waarde accepteren wanneer een lijst wordt verwacht

We kunnen nu een enkele waarde invoeren in de GraphQL-query waar een lijst wordt verwacht, zoals gedefinieerd in de GraphQL-spec.

Zo zijn deze queries nu equivalent:

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

Verdere voltooiing van het WordPress-schema

Extra entiteiten uit het WordPress-datamodel zijn toegevoegd aan het GraphQL-schema:

GraphQL-schema

Laten we eens kijken welke nieuwe elementen zijn toegevoegd.

Categorieën

Categorieën zijn in kaart gebracht via het nieuwe type PostCategory en de nieuwe velden:

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

Zo haalt deze query de categorieën voor de berichten op:

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

Er is ook een mutatie-veld toegevoegd om categorieën aan berichten toe te wijzen:

  • MutationRoot.setCategoriesOnPost: Post

En een input categories is toegevoegd aan de mutatie-velden voor berichten:

  • MutationRoot.createPost
  • MutationRoot.updatePost
  • Post.update (wanneer nested mutations zijn ingeschakeld)

Meta

Meta-waarden van custom posts, gebruikers, reacties en taxonomieën kunnen nu worden opgevraagd via de nieuwe velden:

  • 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]

Zo haalt deze query de meta last_name op voor gebruikers:

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

Omdat meta-waarden van alles kunnen zijn (string, integer, float of boolean), zijn ze in kaart gebracht via het nieuw geïntroduceerde generieke scalaire type AnyScalar.

Meta-waarden kunnen openbaar of privé zijn. Welke meta-sleutels kunnen worden opgevraagd, moet expliciet worden geconfigureerd op de instellingenpagina:

De vermeldingen definiëren
De vermeldingen definiëren

Standaard is de lijst met toegestane meta-sleutels leeg.

Menu's zijn in kaart gebracht via het nieuwe type Menu en het nieuwe veld Root.menu.

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

Instellingen

De instellingen van de site (opgeslagen in tabel wp_options) kunnen worden opgevraagd via het nieuwe veld Root.option: AnyScalar.

Zo haalt deze query de naam van de site op:

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

Welke opties toegankelijk zijn, moet expliciet worden geconfigureerd op de instellingenpagina:

De vermeldingen voor de Instellingen definiëren

Standaard kunnen alleen de volgende opties worden opgevraagd:

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

Berichten van gebruikers

Ingelogde gebruikers kunnen hun eigen berichten ophalen, voor elke status (publish, pending, draft of trash), via de nieuwe velden:

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

Zo kunnen we nu deze query uitvoeren:

# 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
    }
  }
}

Onbeperkte admin-velden toegevoegd aan het GraphQL-schema

Het GraphQL-schema moet een balans vinden tussen openbare en privé-velden, om te voorkomen dat privé-informatie wordt blootgesteld in een openbare API.

De nieuwe module Schema for the Admin voegt "onbeperkte" admin-velden toe aan het GraphQL-schema, die mogelijk privégegevens kunnen blootstellen:

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

Om bijvoorbeeld toegang te krijgen tot berichtgegevens, hebben we momenteel het veld posts, dat alleen openbare gegevens blootstelt door gepubliceerde berichten op te halen.

Voortaan kunnen we ook toegang krijgen tot berichtgegevens via het veld unrestrictedPosts, dat zowel openbare als privégegevens blootstelt door berichten met elke status op te halen ("publish", "draft", "pending", "trash").

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

Scalair type AnyScalar geïntroduceerd

Scalair type AnyScalar vertegenwoordigt een van de ingebouwde scalaire typen (String, Int, Boolean, Float of ID).

Het wordt gebruikt op het nieuw geïntroduceerde veld option en metaValue(s), omdat we van tevoren het type van de geretourneerde gegevens niet kennen, en de samenvoeging van scalaire typen nog niet wordt ondersteund door de GraphQL-spec.

Instellingen in lang formaat

Opties op de pagina Instellingen zijn verdeeld in tabbladen. Vanaf v0.8 is het ook mogelijk om ze allemaal samen op één lange pagina te bekijken.

Om dit gedrag in te schakelen, deselect je het item "Have all options in this Settings page be organized under tabs, one tab per module." in de Instellingen en druk op "Save Changes":

Selectievakje om tabbladen in Instellingen in/uit te schakelen

Vervolgens worden alle instellingen samen weergegeven in lang formaat:

Instellingen in lang formaat


Breaking changes

Release v0.8 introduceert breaking changes ten opzichte van de vorige versie.

Configuratie breaking changes

De volgende CPT's hebben hun "Options"-blok opnieuw opgebouwd:

  • Schema Configurations
  • Custom Endpoints
  • Persisted Queries

In de vorige v0.7 bevatte een enkel Options-blok voor deze entiteiten veel configuratie-items. Vanaf v0.8 is dit blok opgesplitst in meerdere onafhankelijke blokken, elk met zijn eigen configuratie.

Zo stond in v0.7 het Custom Endpoint Options-blok (naast het in-/uitschakelen van het endpoint) toe om de GraphiQL- en Interactive Schema-clients te configureren:

Options in Custom Endpoint

Vanaf v0.8 wordt deze configuratie toegevoegd via de GraphiQL- en Interactive Schema-blokken:

Options in Custom Endpoint

De configuratie die is opgeslagen in de Options-blokken voor alle 3 de CPT's wordt niet automatisch gemigreerd naar het nieuwe formaat. Noteer daarom voor de upgrade naar v0.8 je opgeslagen configuratie en repliceer deze na de upgrade naar de nieuwe versie.

Excuses voor dit ongemak.

Daarnaast moet je op de knop "Reset the template" klikken die wordt weergegeven in de WordPress-editor, voor alle vermeldingen voor de 3 CPT's.

Reset the template in de WordPress-editor

Niet-standaard directives verwijderd

De niet-standaard directives zijn verwijderd uit de plugin:

  • @default
  • @removeIfNull
  • @export

Modules verwijderd

De volgende modules zijn verwijderd uit de plugin:

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

Aankomende roadmap

Nu v0.8 is uitgebracht, kunnen we beginnen met het plannen van de weg vooruit.

Het huidige plan is als volgt:

v0.9 uitbrengen in september 2021, inclusief:

  • Custom scalars
  • Een bijgewerkt GraphQL-schema, waarbij custom scalars worden gebruikt waar van toepassing (bijv.: Post.date zal type Date retourneren in plaats van String)
  • Verdere verbeteringen ter ondersteuning van extensies

En vervolgens v1.0 uitbrengen rond het einde van het jaar of begin 2022, inclusief:

  • Een demo van een extensie-plugin
  • Volledige documentatiegidsen over het maken van extensies
  • Lancering van de Gato GraphQL-plugin op wp.org

Om meldingen te ontvangen over de huidige status, kun je je aanmelden voor de nieuwsbrief.


Problemen ondervonden?

Als je problemen hebt met het installeren of uitvoeren van v0.8, maak dan een issue aan in de repo.


Abonneer je op onze nieuwsbrief

Blijf op de hoogte van alle updates over Gato GraphQL.