Blog

🎉 Phát hành Gato GraphQL v0.7, hỗ trợ mutations và nested mutations!

Leonardo Losoviz
Bởi Leonardo Losoviz ·

Phiên bản 0.7 của Gato GraphQL, hỗ trợ mutations và nested mutations, đã được phát hành! 🎉

Mutations thật tuyệt vời!

Dưới đây là tổng quan về các tính năng mới được bổ sung.

1. Mutations! 🚀

GraphQL mutations cho phép thay đổi dữ liệu (tức là thực hiện các tác động phụ) thông qua query.

Mutations là tính năng lớn còn thiếu trong Gato GraphQL. Nay đã được bổ sung, tôi có thể khẳng định rằng máy chủ GraphQL này gần như đã hoàn thiện về mặt tính năng (chỉ còn thiếu subscriptions, và tôi đã đang nghĩ đến cách bổ sung chúng).

Mutation root trong schema tương tác

Hãy cùng xem một ví dụ về thêm bình luận. Nhưng trước tiên, chúng ta cần thực thi một mutation khác để đăng nhập, để bạn có thể thêm bình luận. Nhấn nút "Run" trên client GraphiQL bên dưới để thực thi mutation field loginUser với một người dùng thử nghiệm đã được tạo sẵn:

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

Bây giờ, hãy thêm một số bình luận. Nhấn nút Run bên dưới để thêm bình luận vào một bài viết bằng cách thực thi mutation field addCommentToCustomPost (bạn cũng có thể chỉnh sửa nội dung bình luận):

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

Trong lần phát hành đầu tiên này, plugin đi kèm với các mutations sau:

createPost
updatePost
setFeaturedImageforCustomPost
removeFeaturedImageforCustomPost
addCommentToCustomPost
replyComment
loginUser
logoutUser

2. Nested Mutations! 🚀🚀

Nested mutations là khả năng thực hiện mutations trên một type khác với root type trong GraphQL.

Chúng đã được đề xuất cho đặc tả GraphQL nhưng chưa được phê duyệt (và có thể sẽ không bao giờ được), vì vậy Gato GraphQL bổ sung hỗ trợ cho chúng như một tính năng opt-in, thông qua module Nested Mutations.

Do đó, plugin hỗ trợ 2 hành vi:

  1. Hành vi GraphQL tiêu chuẩn (tức là thêm mutation fields vào root type), theo mặc định
  2. Nested mutations, như một tùy chọn opt-in

Ví dụ, query ở trên cũng có thể được thực thi với query sau, trong đó chúng ta trước tiên lấy bài viết qua Root.post, và chỉ sau đó mới thêm bình luận vào nó qua 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 cũng có thể thay đổi dữ liệu trên kết quả từ một mutation khác. Trong query dưới đây, trước tiên chúng ta lấy bài viết qua Root.post, sau đó thực thi mutation Post.addComment trên nó và lấy đối tượng bình luận đã tạo, và cuối cùng thực thi mutation Comment.reply trên đó:

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

Điều này thực sự hữu ích! 😍 (Phương pháp thay thế để tạo ra hành vi tương tự trong một query duy nhất là thông qua directive @export... Tôi sẽ so sánh cả hai trong một bài viết blog sắp tới).


Trong lần phát hành đầu tiên này, plugin đi kèm với các mutations sau:

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

Tiêu chuẩn hay nested? Hay cả hai?

Bạn có thể có một GraphQL API được sử dụng bởi ứng dụng của chính bạn, và cũng được công khai cho các khách hàng. Bạn có thể muốn bật nested mutations chỉ cho ứng dụng của mình, không phải cho khách hàng vì đây là tính năng không theo tiêu chuẩn.

Tin tốt: bạn có thể làm được điều đó.

Tôi đã thêm một phần "Mutation Scheme" trong Schema Configuration, được sử dụng để tùy chỉnh schema cho Custom EndpointsPersisted Queries:

Mutation scheme trong Schema configuration

Do đó, bạn có thể tắt nested mutations ở mọi nơi, nhưng bật chúng chỉ cho một custom endpoint cụ thể mà chỉ ứng dụng của bạn sẽ sử dụng. 💪

Loại bỏ các fields dư thừa khỏi root type

Với nested mutations, mutation fields có thể được thêm hai lần vào schema:

  • một lần dưới root type
  • một lần dưới type cụ thể

Ví dụ, các fields này có thể được coi là "trùng lặp" với nhau:

  • Root.updatePost
  • Post.update

Gato GraphQL cho phép giữ cả hai, hoặc loại bỏ các fields khỏi root type vì chúng dư thừa.

Ba schemas sau:

  1. Hành vi tiêu chuẩn:
    sử dụng type QueryRoot để xử lý queries và MutationRoot để xử lý mutations
  2. Nested mutations giữ lại các mutation fields trùng lặp:
    một type Root duy nhất xử lý cả queries và mutations, và các mutation fields dư thừa trong type này được giữ lại
  3. Nested mutations loại bỏ các mutation fields dư thừa khỏi root type:
    tương tự như trên, nhưng loại bỏ tất cả các mutation fields dư thừa khỏi type Root

✱ Btw1, cả 3 schemas này đều sử dụng cùng một endpoint, nhưng thay đổi tham số URL ?mutation_scheme với các giá trị standard, nestedlean_nested. Điều này có thể thực hiện được vì máy chủ GraphQL tuân theo phương pháp code-first. 🤟

✱ Btw2, các tùy chọn này có thể được chọn trong phần "Mutation Scheme" của Schema configuration (được hiển thị ở trên), do đó bạn cũng có thể quyết định hành vi nào sẽ áp dụng cho từng custom endpoint và persisted queries riêng lẻ. 👏


Bây giờ đã đến lúc bắt đầu chuẩn bị cho v0.8! 🙏


Đăng ký nhận bản tin của chúng tôi

Cập nhật tất cả những điều mới từ Gato GraphQL.