๐ Rilis Gato GraphQL v0.7, dengan dukungan untuk mutations dan nested mutations!
Versi 0.7 dari Gato GraphQL, yang mendukung mutations dan nested mutations, telah dirilis! ๐

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).

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:
- Perilaku GraphQL standar (yaitu menambahkan field mutation ke root type), secara default
- 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:

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.updatePostPost.update
Gato GraphQL memungkinkan untuk menyimpan keduanya, atau menghapus yang ada di root type, yang bersifat redundan.
Ketiga skema berikut:
- Perilaku standar:
menggunakan tipeQueryRootuntuk menangani queries danMutationRootuntuk menangani queries - Nested mutations yang menyimpan field mutation duplikat:
satu tipeRootmenangani queries dan mutations, dan field mutation yang redundan di tipe ini tetap dipertahankan - Nested mutations yang menghapus field mutation redundan dari root type:
sama seperti di atas, tetapi menghapus semua field mutation yang redundan dari tipeRoot
โฑ 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! ๐