Blog

🥳 Gato GraphQL v0.9 yayınlandı!

Leonardo Losoviz
Yazan: Leonardo Losoviz ·

Yaklaşık 1,5 yıllık geliştirme sürecinin ve 16.000'den fazla commit'in ardından, Gato GraphQL'in yeni bir sürümü nihayet yayınlandı! 🥳

0.9 sürümü, eklentinin tarihindeki en büyük yayındır. İşte changelog ve tüm yeni özelliklerin tam açıklaması:

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

Bu belge oldukça uzun (40 dakikadan fazla okuma süresi!), bu yüzden aşağıda en önemli değişikliklerin TL;DR özeti yer almaktadır.

GraphQL Şeması Önemli Ölçüde Tamamlandı

WordPress veri modeli, GraphQL şemasına önemli ölçüde eşlenmiştir.

GraphQL şeması

Şema, diğerlerinin yanı sıra aşağıdaki iyileştirmelere sahiptir:

  • Herhangi bir tema ve eklentiden dahil olmak üzere herhangi bir CPT'den veri sorgulama
  • Özel taksonomi (etiket ve kategoriler) eşlemesi yapıldı
  • Daha uygun GraphQL türleri oluşturuldu ve döndürüldü (örn: HTML, URL, DateTime)
  • Alan argümanları input object'ler aracılığıyla düzenlendi
  • Bir varlığı farklı özelliklerle seçmek için oneof input object'leri kullanıldı (örn: id, slug)
  • Mutation payload'ları döndürüldü
  • Ayarlar (wp_options'dan) ve meta değerleri sorgulandı (gönderiler, kullanıcılar, yorumlar ve taksonomiler için)

Custom Scalars

GraphQL sunucusuna özel skaler türler desteği eklendi. Custom scalar'lar, bir alan argümanı aracılığıyla girdi almak veya yanıtta özelleştirilmiş bir çıktı yazdırmak için verilerinizi daha iyi temsil etmenizi sağlar.

GraphQL şemanızda kullanıma hazır olmaları için çeşitli standart özel skaler türler uygulandı:

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

Custom Enums

Özel enum türleri artık desteklenmektedir. Enum'lar, belirli bir izin verilen değerler kümesiyle sınırlı özel bir skaler türüdür. Bu sayede şunları yapabilirsiniz:

  • Bu türdeki herhangi bir argümanın izin verilen değerlerden biri olduğunu doğrulama
  • Tür sistemi aracılığıyla bir alanın her zaman sonlu bir değerler kümesinden biri olacağını bildirme

Çeşitli enum türleri uygulandı ve GraphQL şemasında uygun yerlerde kullanıldı:

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

Input Objects

GraphQL sunucusu artık input türlerini de desteklemektedir ve GraphQL şemasına kendi input object'lerinizi ekleyebilirsiniz. Input object'ler, özellikle mutation'lar için oldukça kullanışlı olan karmaşık nesneleri alanlara girdi olarak geçirmenizi sağlar.

Şemaya uygun yerlerde çeşitli input object'ler eklendi. Örneğin, veri sorgulayan alanlar (posts, users, comments vb.) filter, sort ve pagination alan argümanları altında karmaşık input object'ler alırken, veriyi değiştiren alanlar (createPost, addCommentToCustomPost vb.) input alan argümanı altında bir input object alır.

Oneof Input Objects

"oneof" input object, input alanlarından tam olarak birinin girdi olarak sağlanması gereken özel bir input object türüdür; aksi takdirde bir doğrulama hatası döndürür. Bu davranış, girdiler için polimorfizm sağlar.

Örneğin, Root.post alanı artık by adlı bir alan argümanı almaktadır; bu, id veya slug gibi farklı özellikler aracılığıyla gönderiye erişmemizi sağlayan bir oneof input object'tir:

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

Bu yaklaşımın faydası, tek bir alanın farklı kullanım durumlarını karşılamak için kullanılabilmesidir; bu sayede her kullanım durumu için ayrı bir alan oluşturmaktan (postByID, postBySlug vb.) kaçınabilir ve GraphQL şemasını daha yalın ve zarif hale getirebiliriz.

Çeşitli Oneof Input Objects uygulandı:

  • 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

GraphQL operasyonları (yani query ve mutation operasyonları) artık directive'ler de alabilmektedir.

Directive'leri Belirli Türlerle Kısıtlama

(Alan) directive'leri yalnızca belirli türlerdeki alanlara uygulanacak şekilde kısıtlanabilir. Örneğin, alan değerini büyük harfe dönüştüren @strUpperCase directive'i yalnızca String alanlarda mantıklıdır; Int, Float veya Boolean alanlarında değil. Bu kısıtlama artık directive resolver'da bildirilebilir.

Hata Üreten GraphQL Query Düğümüne Giden Tam Yolu Yazdırma

Yanıt artık bir hata döndüren GraphQL query düğümlerine giden tam yolu içermektedir (extensions.path alt girişi altında); bu da sorunun kaynağını bulmayı kolaylaştırır.

Örneğin, aşağıdaki queries'de @nonExisting directive'i mevcut değildir:

query {
  myField @nonExisting
}

Yanıt şu şekildedir:

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

Güvensiz Varsayılan Ayarları Etkinleştirme

Gato GraphQL güvenli varsayılan ayarlar sunar:

  • Tek endpoint devre dışıdır
  • GraphQL şemasındaki "hassas" veri öğeleri (örn: User.roles veya gönderileri status'a göre filtreleme) açığa çıkarılmaz
  • Yalnızca birkaç ayar seçeneği ve meta anahtarı (gönderiler, kullanıcılar vb. için) sorgulanabilir
  • Aynı anda sorgulanabilecek varlık sayısı sınırlıdır (gönderiler, kullanıcılar vb. için)

Bu güvenli varsayılan ayarlar, "canlı" siteleri güvenli tutmak ve kötü niyetli saldırıları önlemek için gereklidir. Ancak, WordPress sitesinin saldırılara karşı savunmasız olmadığı "statik" siteler oluşturulurken bunlara gerek yoktur (dizüstü bilgisayarda geliştirme sitesi olarak çalışan, güvenli bir güvenlik duvarının arkasındaki veya genel olarak İnternet'e açık olmayan bir site gibi).

v0.9 sürümünden itibaren, wp-config.php dosyasına aşağıdakini ekleyerek güvensiz varsayılanları etkinleştirebiliriz:

define( 'GRAPHQL_API_ENABLE_UNSAFE_DEFAULTS', true );

Alternatif olarak, bu aynı anahtar/değer çiftini ortam değişkeni olarak da tanımlayabiliriz.

Güvensiz varsayılanlar etkinleştirildiğinde, eklentinin varsayılan ayarları şu şekilde dönüşür:

  • Tek endpoint etkinleştirilir
  • "Hassas" veri öğeleri GraphQL şemasında açığa çıkarılır
  • Tüm ayar seçenekleri ve meta anahtarları sorgulanabilir
  • Aynı anda sorgulanabilecek varlık sayısı sınırsızdır

Custom Endpoint'leri ve Persisted Queries'i Kategoriye Göre Düzenleme

Bir Custom Endpoint veya Persisted Query oluştururken, tüm endpoint'lerimizi düzenlemek için bir "GraphQL endpoint kategorisi" ekleyebiliriz:

Custom Endpoint düzenlenirken endpoint kategorileri

Örneğin, endpoint'leri müşteriye, uygulamaya veya gereken herhangi bir bilgiye göre yönetmek için kategoriler oluşturabiliriz:

Endpoint kategorilerinin listesi

Custom Endpoint'ler ve Persisted Queries listesinde kategorilerini görüntüleyebilir; herhangi bir kategori bağlantısına tıklayarak veya üstteki filtreyi kullanarak yalnızca o kategorideki tüm girdileri görüntüleyebiliriz.

Kategorileriyle birlikte Custom Endpoint'lerin listesi

İntrospeksiyon Aracılığıyla Şema Uzantılarını Sorgulama

Şema öğelerine eklenen özel meta veriler artık extensions alanı aracılığıyla sorgulanabilmektedir.

Şemanın tüm introspeksiyon öğeleri yeni alanla güncellendi; her biri, o öğe için özel özellikleri ortaya koyan ilgili bir "Extensions" türünden bir nesne döndürür.

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

GraphQL Sunucu Kodunun WordPress'ten Ayrıştırılması Tamamlandı

Eklentiyi destekleyen temel GraphQL sunucusu artık bağımsız bir PHP bileşeni olarak, yani WordPress'ten bağımsız olarak kurulup çalıştırılabilir.

Bu durum, Gato GraphQL'i başka framework'lerle (örn: Laravel) ve WordPress'in mevcut olup olmadığına bakılmaksızın (Sürekli Entegrasyon görevi çalıştırılırken olduğu gibi) herhangi bir PHP ortamında kullanmaya kapı aralamaktadır.

Schema Configuration, Custom Endpoint ve Persisted Query Düzenlenirken Belgelere Göz Atma

Schema Configuration, Custom Endpoint ve Persisted Query düzenlenirken gösterilen tüm bloklar artık bir "bilgi" düğmesine sahiptir; bu düğmeye tıklandığında bir modal pencerede belgeler görüntülenir.

Bir 'bilgi' düğmesine tıklandığında...

...belgelerle birlikte bir modal pencere açılır

Çok Daha Fazlası

Diğer tüm yeni özellikleri keşfetmek için yeni sürümün tam açıklamasına bakın veya changelog'u inceleyin.

Ve eklentiyi buradan indirin.

Gördüklerinizi beğendiyseniz, lütfen sevgiyi yaymaya yardımcı olun ❤️


Bültenimize abone olun

Gato GraphQL'deki tüm güncellemelerden haberdar olun.