Blog

🎉 Gato GraphQL v0.7 yayınlandı; mutations ve nested mutations desteğiyle!

Leonardo Losoviz
Yazan: Leonardo Losoviz ·

Gato GraphQL'ın mutations ve nested mutations desteği sunan 0.7 sürümü yayınlandı! 🎉

Mutations harika!

İşte yeni eklemeleri gösteren bir tur.

1. Mutations! 🚀

GraphQL mutations, query aracılığıyla veri değiştirmeyi (yani yan etki üretmeyi) mümkün kılar.

Mutations, Gato GraphQL'de eksik olan en önemli unsurdu. Artık eklendiğine göre, bu GraphQL sunucusunun neredeyse tam özellikli olduğunu söyleyebilirim (yalnızca subscriptions eksik ve bunları nasıl ekleyeceğimi zaten düşünüyorum).

İnteraktif şemada Mutation root

Yorum ekleme konusunda bir örneğe bakalım. Ama önce, yorum ekleyebilmeniz için giriş yapmanızı sağlayacak başka bir mutation çalıştırmamız gerekiyor. Aşağıdaki GraphiQL istemcisindeki "Run" düğmesine basarak önceden oluşturulmuş bir test kullanıcısıyla loginUser mutation alanını çalıştırın:

mutation LogUserIn {
  loginUser(
    by: { credentials: { usernameOrEmail: "test", password: "pass" } }
  ) {
    id
    name
  }
}

Şimdi birkaç yorum ekleyelim. Aşağıdaki Run düğmesine basarak addCommentToCustomPost mutation alanını çalıştırıp bir gönderiye yorum ekleyin (yorum metnini de düzenleyebilirsiniz):

mutation AddComment {
  addCommentToCustomPost(
    input: { customPostID: 1459, comment: "Adding a comment: bla bla bla" }
  ) {
    id
    content
    date
  }
}

Bu ilk sürümde plugin aşağıdaki mutations ile birlikte gelir:

createPost
updatePost
setFeaturedImageforCustomPost
removeFeaturedImageforCustomPost
addCommentToCustomPost
replyComment
loginUser
logoutUser

2. Nested Mutations! 🚀🚀

Nested mutations, GraphQL'de root type dışındaki bir türde mutations gerçekleştirebilme yeteneğidir.

GraphQL spesifikasyonu için talep edilmiş ancak henüz onaylanmamışlardır (ve belki hiç onaylanmayacaklar); bu nedenle Gato GraphQL, Nested Mutations modülü aracılığıyla bunları isteğe bağlı bir özellik olarak destekler.

Dolayısıyla plugin 2 davranışı destekler:

  1. Varsayılan olarak standart GraphQL davranışı (yani mutation alanlarının root type'a eklenmesi)
  2. İsteğe bağlı olarak nested mutations

Örneğin, yukarıdaki query aşağıdaki query ile de çalıştırılabilir; bu sürümde önce Root.post aracılığıyla gönderiyi alır, ardından Post.addComment aracılığıyla ona yorum ekleriz:

mutation AddComment {
  post(by: { id: 1459 }) {
    addComment(
      input: {
        comment: "Notice how field `addCommentToCustomPost` under the `Root` type is renamed as `addComment` under the `Post` type? The schema got neater!"
      }
    ) {
      id
      content
      date
    }
  }
}

Mutations, başka bir mutation'ın sonucundaki verileri de değiştirebilir. Aşağıdaki query'de önce Root.post aracılığıyla gönderiyi alır, ardından üzerinde Post.addComment mutation'ını çalıştırarak oluşturulan yorum nesnesini elde eder ve son olarak üzerinde Comment.reply mutation'ını çalıştırırız:

mutation AddCommentAndResponse {
  post(by: { id: 1459 }) {
    id
    title
    addComment(input: { comment: "Isn't this awesome?" }) {
      id
      date
      content
      reply(input: { comment: "I think so!" }) {
        id
        date
        content
      }
    }
  }
}

Bu kesinlikle kullanışlı! 😍 (Bu aynı davranışı tek bir query'de üretmenin alternatif yöntemi @export direktifi aracılığıyladır... Her ikisini de yaklaşan bir blog yazısında karşılaştıracağım).


Bu ilk sürümde plugin aşağıdaki mutations ile birlikte gelir:

CustomPost.update
CustomPost.setFeaturedImage
CustomPost.removeFeaturedImage
CustomPost.addComment
Comment.reply

Standart mı, nested mi? Yoksa her ikisi de mi?

Hem kendi uygulamanız tarafından kullanılan hem de müşterileriniz için genel olarak erişilebilir bir GraphQL API'niz olabilir. Nested mutations'ı yalnızca kendi uygulamanız için etkinleştirmek, müşterileriniz için etkinleştirmemek isteyebilirsiniz; çünkü bu standart dışı bir özelliktir.

İyi haber: yapabilirsiniz.

Custom Endpoints ve Persisted Queries için şemayı özelleştirmede kullanılan Schema Configuration'a bir "Mutation Scheme" bölümü ekledim:

Schema configuration'da Mutation scheme

Dolayısıyla nested mutations'ı her yerde devre dışı bırakabilir, ancak yalnızca uygulamanızın kullanacağı belirli bir custom endpoint için etkinleştirebilirsiniz. 💪

Root type'tan gereksiz alanların kaldırılması

Nested mutations ile mutation alanları şemaya iki kez eklenebilir:

  • bir kez root type altında
  • bir kez belirli tür altında

Örneğin şu alanlar birbirinin "kopyası" olarak değerlendirilebilir:

  • Root.updatePost
  • Post.update

Gato GraphQL, her ikisini de tutmanıza ya da gereksiz olan root type altındakileri kaldırmanıza olanak tanır.

Aşağıdaki 3 şema:

  1. Standart davranış:
    queries için QueryRoot türünü ve mutations için MutationRoot türünü kullanır
  2. Duplicate mutation alanlarını koruyan nested mutations:
    tek bir Root türü queries ve mutations'ı yönetir; bu türdeki gereksiz mutation alanları korunur
  3. Root type'tan gereksiz mutation alanlarını kaldıran nested mutations:
    yukarıdakiyle aynı, ancak Root türündeki tüm gereksiz mutation alanları kaldırılır

✱ Not1: bu 3 şemanın tamamı aynı endpoint'i kullanır; yalnızca ?mutation_scheme URL parametresini standard, nested ve lean_nested değerleriyle değiştirerek. Bu mümkündür çünkü GraphQL sunucusu code-first yaklaşımını izler. 🤟

✱ Not2: bu seçenekler Schema configuration'daki "Mutation Scheme" bölümünde (yukarıda gösterilmiştir) seçilebilir; dolayısıyla bireysel custom endpoint'ler ve persisted queries için hangi davranışın uygulanacağına da karar verebilirsiniz. 👏


Artık v0.8 için hazırlık yapma zamanı! 🙏


Bültenimize abone olun

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