Blog

๐ŸŽ‰ Rilis Gato GraphQL v0.7, dengan dukungan untuk mutations dan nested mutations!

Leonardo Losoviz
Oleh Leonardo Losoviz ยท

Versi 0.7 dari Gato GraphQL, yang mendukung mutations dan nested mutations, telah dirilis! ๐ŸŽ‰

Mutations sangat keren!

Berikut adalah tur yang menampilkan tambahan-tambahan baru.

1. Mutations! ๐Ÿš€

GraphQL mutations memungkinkan untuk memodifikasi data (yaitu melakukan efek samping) melalui query.

Mutations adalah hal besar yang masih kurang dari Gato GraphQL. Sekarang setelah ditambahkan, saya dapat mengklaim bahwa server GraphQL ini hampir sepenuhnya lengkap fiturnya (hanya subscriptions yang masih kurang, dan saya sudah memikirkan cara untuk menambahkannya).

Mutation root dalam skema interaktif

Mari kita lihat contoh penambahan komentar. Tapi pertama-tama, kita perlu menjalankan mutation lain untuk masuk, agar kamu bisa menambahkan komentar. Tekan tombol "Run" pada klien GraphiQL di bawah, untuk menjalankan field mutation loginUser dengan pengguna testing yang sudah dibuat sebelumnya:

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

Sekarang, mari tambahkan beberapa komentar. Tekan tombol Run di bawah, untuk menambahkan komentar ke suatu postingan dengan menjalankan field mutation addCommentToCustomPost (kamu juga bisa mengedit teks komentar):

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

Dalam rilis pertama ini, plugin hadir dengan mutations berikut:

โœ… createPost
โœ… updatePost
โœ… setFeaturedImageforCustomPost
โœ… removeFeaturedImageforCustomPost
โœ… addCommentToCustomPost
โœ… replyComment
โœ… loginUser
โœ… logoutUser

2. Nested Mutations! ๐Ÿš€๐Ÿš€

Nested mutations adalah kemampuan untuk melakukan mutations pada tipe selain root type di GraphQL.

Fitur ini telah diminta untuk spesifikasi GraphQL tetapi belum disetujui (dan mungkin tidak akan pernah disetujui), sehingga Gato GraphQL menambahkan dukungan untuknya sebagai fitur opt-in, melalui modul Nested Mutations.

Dengan demikian, plugin mendukung 2 perilaku:

  1. Perilaku GraphQL standar (yaitu menambahkan field mutation ke root type), secara default
  2. Nested mutations, sebagai opt-in

Sebagai contoh, query dari atas juga dapat dijalankan dengan query berikut, di mana kita pertama-tama mengambil postingan melalui Root.post, dan baru kemudian menambahkan komentar padanya melalui Post.addComment:

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 juga dapat memodifikasi data pada hasil dari mutation lain. Dalam query di bawah, kita pertama-tama mengambil postingan melalui Root.post, kemudian menjalankan mutation Post.addComment padanya dan mendapatkan objek komentar yang dibuat, dan akhirnya menjalankan mutation Comment.reply pada komentar tersebut:

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

Ini sungguh berguna! ๐Ÿ˜ (Metode alternatif untuk menghasilkan perilaku yang sama ini, dalam satu query, adalah melalui direktif @export... Saya akan membandingkan keduanya dalam posting blog mendatang).


Dalam rilis pertama ini, plugin hadir dengan mutations berikut:

โœ… CustomPost.update
โœ… CustomPost.setFeaturedImage
โœ… CustomPost.removeFeaturedImage
โœ… CustomPost.addComment
โœ… Comment.reply

Standar atau nested? Atau keduanya?

Anda mungkin memiliki GraphQL API yang digunakan oleh aplikasi Anda sendiri, dan juga tersedia secara publik untuk klien Anda. Anda mungkin ingin mengaktifkan nested mutations tetapi hanya untuk aplikasi Anda sendiri, bukan untuk klien Anda karena ini adalah fitur non-standar.

Kabar baik: bisa.

Saya telah menambahkan bagian "Mutation Scheme" di Schema Configuration, yang digunakan untuk mengkustomisasi skema untuk Custom Endpoints dan Persisted Queries:

Mutation scheme dalam Schema configuration

Dengan demikian, Anda dapat menonaktifkan nested mutations di mana saja, tetapi mengaktifkannya hanya untuk custom endpoint tertentu yang hanya akan digunakan oleh aplikasi Anda. ๐Ÿ’ช

Menghapus field redundan dari root type

Dengan nested mutations, field mutation dapat ditambahkan dua kali ke skema:

  • sekali di bawah root type
  • sekali di bawah tipe tertentu

Misalnya, field-field ini dapat dianggap "duplikat" satu sama lain:

  • Root.updatePost
  • Post.update

Gato GraphQL memungkinkan untuk menyimpan keduanya, atau menghapus yang ada di root type, yang bersifat redundan.

Ketiga skema berikut:

  1. Perilaku standar:
    menggunakan tipe QueryRoot untuk menangani queries dan MutationRoot untuk menangani queries
  2. Nested mutations yang menyimpan field mutation duplikat:
    satu tipe Root menangani queries dan mutations, dan field mutation yang redundan di tipe ini tetap dipertahankan
  3. Nested mutations yang menghapus field mutation redundan dari root type:
    sama seperti di atas, tetapi menghapus semua field mutation yang redundan dari tipe Root

โœฑ Btw1, ketiga skema ini semuanya menggunakan endpoint yang sama, tetapi dengan mengubah parameter URL ?mutation_scheme ke nilai standard, nested dan lean_nested. Itu mungkin karena server GraphQL mengikuti pendekatan code-first. ๐ŸคŸ

โœฑ Btw2, opsi-opsi ini dapat dipilih di bagian "Mutation Scheme" dalam Schema configuration (ditampilkan di atas), sehingga Anda juga dapat memutuskan perilaku apa yang akan diterapkan untuk custom endpoints dan persisted queries individual. ๐Ÿ‘


Sekarang saatnya mulai mempersiapkan v0.8! ๐Ÿ™


Berlangganan newsletter kami

Tetap update dengan semua pembaruan Gato GraphQL.