Blog

🥳 Gato GraphQL v0.9 zostalo wydane!

Leonardo Losoviz
Autor: Leonardo Losoviz ·

Po prawie 1,5 roku rozwoju i ponad 16 000 commitach nowa wersja Gato GraphQL zostala w koncu wydana! 🥳

Wersja 0.9 to najwieksze wydanie w historii wtyczki. Oto changelog, a tutaj pelny opis wszystkich nowych funkcji:

github.com/GatoGraphQL/GatoGraphQL/releases/tag/0.9.3

Ten dokument jest dosc dlugi (ponad 40 minut czytania!), wiec ponizej znajdziesz TL;DR z najwazniejszymi zmianami.

Znacznie rozbudowany schemat GraphQL

Model danych WordPress zostal w znacznym stopniu odwzorowany w schemacie GraphQL.

Schemat GraphQL

Wsrod innych ulepszen, schemat zawiera nastepujace:

  • Odpytywanie danych z dowolnego CPT, w tym z dowolnego motywu i wtyczki
  • Odwzorowane niestandardowe taksonomie (tagi i kategorie)
  • Utworzone i zwracane bardziej odpowiednie typy GraphQL (np.: HTML, URL, DateTime)
  • Argumenty pol zorganizowane poprzez input objects
  • Uzycie oneof input objects do wyboru encji po roznych wlasciwosciach (np.: id, slug)
  • Zwracanie payloadow mutacji
  • Odpytywanie ustawien (z wp_options) i wartosci meta (dla postow, uzytkownikow, komentarzy i taksonomii)

Custom scalars

Do serwera GraphQL zostalo dodane wsparcie dla niestandardowych typow skalarnych. Custom scalars pozwalaja lepiej reprezentowac dane, zarowno przy przyjmowaniu wejscia poprzez argument pola, jak i przy drukowaniu niestandardowego wyjscia w odpowiedzi.

Zaimplementowano kilka standardowych niestandardowych typow skalarnych, gotowych do uzycia w schemacie GraphQL:

  • Date
  • DateTime
  • Email
  • HTML
  • URL
  • URLAbsolutePath

Custom enums

Niestandardowe typy wyliczeniowe sa teraz obslugiwane. Enumy to szczegolny rodzaj skalara ograniczonego do okreslonego zestawu dozwolonych wartosci. Pozwala to na:

  • Walidowanie, ze kazdy argument tego typu jest jedną z dozwolonych wartosci
  • Komunikowanie przez system typow, ze pole zawsze bedzie jedna z skonczenie wielu wartosci

Zaimplementowano kilka typow wyliczeniowych i uzywano ich tam, gdzie to stosowne w schemacie GraphQL, w tym:

  • CommentOrderByEnum
  • CommentStatusEnum
  • CommentTypeEnum
  • CustomPostOrderByEnum
  • CustomPostStatusEnum
  • MediaItemOrderByEnum
  • MenuOrderByEnum
  • TaxonomyOrderByEnum
  • UserOrderByEnum

Input Objects

Serwer GraphQL obsluguje teraz rowniez typy wejsciowe, a do schematu GraphQL mozna dodawac wlasne input objects. Input objects pozwalaja przekazywac zlozonych obiektow jako wejsc do pol, co jest szczegolnie przydatne przy mutacjach.

Kilka input objects zostalo dodanych tam, gdzie to stosowne w schemacie. Na przyklad pola do odpytywania danych (takie jak posts, users, comments itp.) przyjmuja zlozonych input objects w argumentach pol filter, sort i pagination, a pola mutujace dane (takie jak createPost, addCommentToCustomPost itp.) przyjmuja input object w argumencie pola input.

Oneof Input Objects

"Oneof" input object to szczegolny rodzaj input object, w ktorym dokladnie jedno z pol wejsciowych musi zostac podane jako wejscie; w przeciwnym razie zwracany jest blad walidacji. To zachowanie wprowadza polimorfizm dla wejsc.

Na przyklad pole Root.post przyjmuje teraz argument pola by, ktory jest oneof input object umozliwiajacym pobieranie posta po roznych wlasciwosciach, takich jak id lub slug:

{
  postByID: post(by: {
    id: 1
  }) {
    id
    title
  }
 
  postBySlug: post(by: {
    slug: "hello-world"
  }) {
    id
    title
  }
}

Zaleta jest taka, ze jedno pole moze byc uzywane do obslugi roznych przypadkow uzycia, dzieki czemu mozna unikac tworzenia odrebnego pola dla kazdego przypadku (takich jak postByID, postBySlug itp.), co sprawia, ze schemat GraphQL jest bardziej zwiezly i elegancki.

Zaimplementowano kilka Oneof Input Objects:

  • Root.customPost(by:)
  • Root.mediaItem(by:)
  • Root.menu(by:)
  • Root.page(by:)
  • Root.postCategory(by:)
  • Root.postTag(by:)
  • Root.post(by:)
  • Root.user(by:)

Operation Directives

Operacje GraphQL (tzn. operacje query i mutation) moga teraz rowniez przyjmowac dyrektywy.

Ogranicz dyrektywy do okreslonych typow

Dyrektywy (pol) moga byc ograniczone do stosowania wylacznie na polach niektorych okreslonych typow. Na przyklad dyrektywa @strUpperCase przeksztalcajaca wartosc pola na wielkie litery ma sens tylko dla pol String, nie dla Int, Float ani Boolean. To ograniczenie moze byc teraz zadeklarowane w resolverze dyrektywy.

Wyswietlanie pelnej sciezki do wezla query GraphQL generujacego bledy

Odpowiedz zawiera teraz pelna sciezke do wezlow w query GraphQL, ktore zwracaja blad (pod pozycja extensions.path), co ulatwia odnalezienie zrodla problemu.

Na przyklad, w ponizszej query dyrektywa @nonExisting nie istnieje:

query {
  myField @nonExisting
}

Odpowiedz jest nastepujaca:

{
  "errors": [
    {
      "message": "There is no directive with name 'nonExisting'",
      "locations": [
        {
          "line": 2,
          "column": 7
        }
      ],
      "extensions": {
        "type": "QueryRoot",
        "field": "myField @nonExisting",
        "path": [
          "@nonExisting",
          "myField @nonExisting",
          "query { ... }"
        ],
        "code": "PoP\\ComponentModel\\e20"
      }
    }
  ],
  "data": {
    "id": "root"
  }
}

Wlaczenie niebezpiecznych ustawien domyslnych

Gato GraphQL zapewnia bezpieczne ustawienia domyslne:

  • Pojedynczy endpoint jest wylaczony
  • Elementy danych "wrazliwych" w schemacie GraphQL (takie jak User.roles lub filtrowanie postow po status) nie sa eksponowane
  • Mozna odpytywac tylko niewielki zbior opcji ustawien i kluczy meta (dla postow, uzytkownikow itp.)
  • Liczba encji, ktore mozna odpytac jednoczesnie, jest ograniczona (dla postow, uzytkownikow itp.)

Te bezpieczne ustawienia domyslne sa potrzebne, aby zabezpieczyc witryny "na zywo" i zapobiegac zlosliwym atakom. Nie sa jednak potrzebne przy budowaniu witryn "statycznych", gdzie witryna WordPress nie jest podatna na ataki (np. gdy jest to witryna deweloperska na laptopie, za bezpieczna zaporą ogniowa lub nienaragona na Internet ogolnie).

Poczawszy od v0.9, mozna wlaczyc niebezpieczne wartosci domyslne, dodajac do wp-config.php:

define( 'GRAPHQL_API_ENABLE_UNSAFE_DEFAULTS', true );

Alternatywnie mozna zdefiniowac ten sam klucz/wartosc jako zmienna srodowiskowa.

Po wlaczeniu niebezpiecznych wartosci domyslnych domyslne ustawienia wtyczki sa przeksztalcane w nastepujacy sposob:

  • Pojedynczy endpoint jest wlaczony
  • Elementy danych "wrazliwych" sa eksponowane w schemacie GraphQL
  • Wszystkie opcje ustawien i klucze meta moga byc odpytywane
  • Liczba encji, ktore mozna odpytac jednoczesnie, jest nieograniczona

Organizowanie Custom Endpoints i Persisted Queries wedlug kategorii

Podczas tworzenia Custom Endpoint lub Persisted Query mozna dodac do niego "GraphQL endpoint category", aby zorganizowac wszystkie endpointy:

Kategorie endpoint podczas edytowania Custom Endpoint

Na przyklad mozna tworzyc kategorie do zarzadzania endpointami wedlug klienta, aplikacji lub innej wymaganej informacji:

Lista kategorii endpoint

Na liscie Custom Endpoints i Persisted Queries mozna przeglądac ich kategorie, a klikajac dowolny link kategorii lub uzywajac filtru na gorze, wyswietlane beda tylko wpisy tej kategorii.

Lista Custom Endpoints z ich kategoriami

Odpytywanie rozszerzen schematu poprzez introspekcje

Niestandardowe metadane dolaczone do elementow schematu moga byc teraz odpytywane poprzez pole extensions.

Wszystkie elementy introspekcji schematu zostaly ulepszone o nowe pole, z ktorych kazde zwraca obiekt odpowiedniego typu "Extensions", eksponujacego niestandardowe wlasciwosci danego elementu.

# Using "_" instead of "__" in introspection type name to avoid errors in graphql-js
type _SchemaExtensions {
  # Is the schema being namespaced?
  isNamespaced: Boolean!
}
 
extend type __Schema {
  extensions: _SchemaExtensions!
}
 
type _NamedTypeExtensions {
  # The type name
  elementName: String!
 
  # The "namespaced" type name
  namespacedName: String!
 
  # Enum-like "possible values" for EnumString type resolvers, `null` otherwise
  possibleValues: [String!]
 
  # OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null, all others being omitted.
  isOneOf: Boolean!
}
 
extend type __Type {
  # Non-null for named types, null for wrapping types (Non-Null and List)
  extensions: _NamedTypeExtensions
}
 
type _DirectiveExtensions {
  # If no objects are returned in the field (eg: because they failed validation), does the directive still need to be executed?
  needsDataToExecute: Boolean!
 
  # Names or descriptions of the types the field directives is restricted to, or `null` if it supports any type (i.e. it defines no restrictions)
  fieldDirectiveSupportedTypeNamesOrDescriptions: [String!]
}
 
extend type __Directive {
  extensions: _DirectiveExtensions!
}
 
type _FieldExtensions {
  isGlobal: Boolean!
 
  # Useful for nested mutations
  isMutation: Boolean!
 
  # `true` => Only exposed when "Expose "sensitive" data elements" is enabled
  isSensitiveDataElement: Boolean!
}
 
extend type __Field {
  extensions: _FieldExtensions!
}
 
type _InputValueExtensions {
  isSensitiveDataElement: Boolean!
}
 
extend type __InputValue {
  extensions: _InputValueExtensions!
}
 
type _EnumValueExtensions {
  isSensitiveDataElement: Boolean!
}
 
extend type __EnumValue {
  extensions: _EnumValueExtensions!
}

Zakonczone oddzielanie kodu serwera GraphQL od WordPress

Bazowy serwer GraphQL napedzajacy wtyczke moze byc teraz instalowany i uruchamiany jako samodzielny komponent PHP, czyli niezaleznie od WordPress.

Otwiera to drzwi do uzywania Gato GraphQL z innymi frameworkami (np.: Laravel) oraz w dowolnym srodowisku PHP, niezaleznie od tego, czy WordPress jest dostepny czy nie (np. przy wykonywaniu zadania Continuous Integration).

Przegladanie dokumentacji podczas edytowania Schema Configuration, Custom Endpoint i Persisted Query

Wszystkie bloki wyswietlane podczas edytowania Schema Configuration, Custom Endpoint i Persisted Query maja teraz przycisk "info", ktory po kliknieciu wyswietla dokumentacje w oknie modalnym.

Klikniecie przycisku 'info'...

...otwiera okno modalne z dokumentacja

Znacznie wiecej

Aby odkryc wszystkie inne nowe funkcje, przejrzyj pelny opis nowego wydania lub przegladaj changelog.

I pobierz wtyczke tutaj.

Jesli podoba Ci sie to, co widzisz, pomoz szerzyc milosc ❤️


Zapisz się do naszego newslettera

Bądź na bieżąco ze wszystkimi aktualizacjami Gato GraphQL.