Blog

๐Ÿฅณ Gato GraphQL v0.9 telah dirilis!

Leonardo Losoviz
Oleh Leonardo Losoviz ยท

Setelah hampir 1,5 tahun pengembangan, dan lebih dari 16000 commit, versi baru Gato GraphQL akhirnya telah dirilis! ๐Ÿฅณ

Versi 0.9 adalah rilis terbesar dalam sejarah plugin ini. Berikut changelognya, dan berikut adalah uraian lengkap semua fitur baru:

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

Dokumen ini cukup panjang (lebih dari 40 menit waktu baca!), jadi berikut adalah TL;DR dengan perubahan-perubahan terpenting.

Skema GraphQL yang jauh lebih lengkap

Model data WordPress telah dipetakan secara signifikan ke dalam skema GraphQL.

Skema GraphQL

Di antaranya, skema memiliki peningkatan berikut:

  • Query data dari CPT mana pun, termasuk dari theme dan plugin apa pun
  • Pemetaan custom taxonomy (tag dan kategori)
  • Tipe GraphQL yang lebih sesuai dibuat dan dikembalikan (mis: HTML, URL, DateTime)
  • Field args diorganisir melalui input objects
  • Penggunaan oneof input objects untuk memilih entitas berdasarkan properti yang berbeda (mis: id, slug)
  • Mengembalikan payload mutation
  • Query settings (dari wp_options) dan nilai meta (untuk post, pengguna, komentar, dan taxonomy)

Custom scalars

Dukungan untuk tipe scalar kustom telah ditambahkan ke server GraphQL. Custom scalars memungkinkan Anda merepresentasikan data dengan lebih baik, baik untuk menerima input melalui argumen field, maupun mencetak output yang dikustomisasi dalam respons.

Beberapa tipe scalar kustom standar telah diimplementasikan, sehingga siap digunakan dalam skema GraphQL Anda:

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

Custom enums

Tipe enum kustom kini didukung. Enum adalah jenis scalar khusus yang dibatasi pada sekumpulan nilai tertentu yang diizinkan. Hal ini memungkinkan Anda untuk:

  • Memvalidasi bahwa setiap argumen bertipe ini merupakan salah satu dari nilai yang diizinkan
  • Mengomunikasikan melalui sistem tipe bahwa sebuah field selalu bernilai salah satu dari kumpulan nilai terbatas

Beberapa tipe enum telah diimplementasikan, dan digunakan saat tepat dalam skema GraphQL, termasuk:

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

Input Objects

Server GraphQL kini juga mendukung input types, dan Anda dapat menambahkan input objects sendiri ke skema GraphQL. Input objects memungkinkan Anda melewatkan objek kompleks sebagai input ke field, yang sangat berguna untuk mutation.

Beberapa input objects ditambahkan di tempat yang sesuai ke dalam skema. Misalnya, field untuk query data (seperti posts, users, comments, dll) menerima input objects kompleks di bawah field args filter, sort, dan pagination, serta field yang melakukan mutasi data (seperti createPost, addCommentToCustomPost, dll) menerima input object di bawah field arg input.

Oneof Input Objects

"Oneof" input object adalah jenis input object khusus, di mana tepat satu dari input field harus diberikan sebagai input, jika tidak maka akan mengembalikan error validasi. Perilaku ini memperkenalkan polimorfisme untuk input.

Misalnya, field Root.post kini menerima field argument by, yang merupakan oneof input object yang memungkinkan pengambilan post melalui berbagai properti, seperti berdasarkan id atau slug:

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

Manfaatnya adalah satu field dapat digunakan untuk menangani berbagai kasus penggunaan, sehingga kita bisa menghindari pembuatan field berbeda untuk setiap kasus (seperti postByID, postBySlug, dll), menjadikan skema GraphQL lebih ramping dan elegan.

Beberapa Oneof Input Objects telah diimplementasikan:

  • 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

Operasi GraphQL (yaitu operasi query dan mutation) kini juga dapat menerima directives.

Membatasi Directives ke Tipe Tertentu

(Field) directives dapat dibatasi untuk hanya diterapkan pada field dengan tipe tertentu. Misalnya, directive @strUpperCase yang mengubah nilai field menjadi huruf besar hanya masuk akal pada field bertipe String, bukan Int, Float, atau Boolean. Pembatasan ini kini dapat dideklarasikan dalam directive resolver.

Mencetak jalur lengkap ke node query GraphQL yang menghasilkan error

Respons kini berisi jalur lengkap ke node dalam query GraphQL yang mengembalikan error (di bawah subentri extensions.path), sehingga lebih mudah menemukan sumber masalahnya.

Misalnya, dalam query berikut, directive @nonExisting tidak ada:

query {
  myField @nonExisting
}

Responsnya adalah sebagai berikut:

{
  "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"
  }
}

Mengaktifkan pengaturan default yang tidak aman

Gato GraphQL menyediakan pengaturan default yang aman:

  • Single endpoint dinonaktifkan
  • Elemen data "sensitif" dalam skema GraphQL (seperti User.roles, atau memfilter post berdasarkan status) tidak diekspos
  • Hanya sejumlah kecil opsi settings dan meta keys (untuk post, pengguna, dll) yang dapat di-query
  • Jumlah entitas yang dapat di-query sekaligus dibatasi (untuk post, pengguna, dll)

Pengaturan default yang aman ini diperlukan untuk mengamankan situs "live", guna mencegah serangan berbahaya. Namun, tidak diperlukan saat membangun situs "statis", di mana situs WordPress tidak rentan terhadap serangan (seperti saat berada di situs pengembangan di laptop, di balik firewall yang aman, atau tidak terhubung ke Internet secara umum).

Mulai v0.9, kita dapat mengaktifkan default yang tidak aman dengan menambahkan di wp-config.php:

define( 'GRAPHQL_API_ENABLE_UNSAFE_DEFAULTS', true );

Alternatifnya, kita dapat mendefinisikan key/value yang sama ini sebagai variabel lingkungan.

Saat mengaktifkan default yang tidak aman, pengaturan default plugin berubah menjadi:

  • Single endpoint diaktifkan
  • Elemen data "sensitif" diekspos dalam skema GraphQL
  • Semua opsi settings dan meta keys dapat di-query
  • Jumlah entitas yang dapat di-query sekaligus tidak terbatas

Mengorganisir Custom Endpoints dan Persisted Queries berdasarkan Kategori

Saat membuat Custom Endpoint atau Persisted Query, kita dapat menambahkan "GraphQL endpoint category" padanya, untuk mengorganisir semua endpoint kita:

Kategori endpoint saat mengedit Custom Endpoint

Misalnya, kita dapat membuat kategori untuk mengelola endpoint berdasarkan klien, aplikasi, atau informasi lain yang diperlukan:

Daftar kategori endpoint

Pada daftar Custom Endpoints dan Persisted Queries, kita dapat melihat kategorinya dan, dengan mengklik tautan kategori mana pun, atau menggunakan filter di bagian atas, hanya akan menampilkan semua entri untuk kategori tersebut.

Daftar Custom Endpoints dengan kategorinya

Query schema extensions melalui introspeksi

Metadata kustom yang terlampir pada elemen skema kini dapat di-query melalui field extensions.

Semua elemen introspeksi skema telah ditingkatkan dengan field baru, masing-masing mengembalikan objek bertipe "Extensions" yang sesuai, yang mengekspos properti kustom untuk elemen tersebut.

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

Selesai memisahkan kode server GraphQL dari WordPress

Server GraphQL yang mendasari plugin kini dapat diinstal dan dijalankan sebagai komponen PHP mandiri, yaitu secara independen dari WordPress.

Ini membuka pintu untuk menggunakan Gato GraphQL dengan framework lain (mis: Laravel), dan di lingkungan PHP apa pun, baik WordPress tersedia maupun tidak (seperti saat menjalankan tugas Continuous Integration).

Jelajahi dokumentasi saat mengedit Schema Configuration, Custom Endpoint, dan Persisted Query

Semua blok yang ditampilkan saat mengedit Schema Configuration, Custom Endpoint, dan Persisted Query kini memiliki tombol "info" yang, saat diklik, menampilkan dokumentasi di jendela modal.

Mengklik tombol 'info'...

...membuka jendela modal dengan dokumentasi

Dan masih banyak lagi

Untuk menemukan semua fitur baru lainnya, tinjau deskripsi lengkap rilis baru ini, atau telusuri changelognya.

Dan unduh plugin dari sini.

Jika Anda menyukai apa yang Anda lihat, tolong bantu sebarkan cinta โค๏ธ


Berlangganan newsletter kami

Tetap update dengan semua pembaruan Gato GraphQL.