tutorial

111 Menambahkan Mutation ke Skema gqlgen

111 Menambahkan Mutation ke Skema gqlgen

Salah satu kekuatan besar GraphQL terletak pada fleksibilitas dan konsistensinya dalam berinteraksi dengan API. Di dunia backend Go, gqlgen adalah framework andalan yang memudahkan developer membangun skema GraphQL yang type-safe, cepat, dan mudah dirawat. Dalam artikel kali ini, kita akan membedah proses menambahkan Mutation ke skema gqlgen, dengan studi kasus sederhana, kode contoh, serta penjelasan konsep yang mudah dipahami.


Apa itu Mutation dalam GraphQL?

Sebelum terjun menulis kode, ada baiknya kita memahami terlebih dahulu: mutation adalah operasi di GraphQL yang digunakan untuk memodifikasi data (Create, Update, Delete), sebagai lawan dari query yang hanya digunakan untuk membaca data.

Think of mutation as the POST, PUT, PATCH, dan DELETE of REST—tapi dengan kekuatan dan fleksibilitas query GraphQL.


Sekilas tentang gqlgen

gqlgen merupakan library Go yang memanfaatkan kode hasil generate (code-first), memastikan skema (schema) GraphQL-nya selalu sinkron dengan tipe-tipe dalam Go. Dengan sedikit kode boilerplate, kita bisa punya API GraphQL cutting-edge.


Studi Kasus

Misalnya, kita punya aplikasi katalog buku sederhana. Kita ingin bisa menambah buku baru ke dalam katalog melalui mutation GraphQL.


Struktur Project

Kita asumsikan direktori dan berkas seperti berikut (proyek gqlgen standard):

project/
├── go.mod
├── gqlgen.yml
├── graph/
│   ├── model/
│   │   └── models_gen.go
│   ├── schema.graphqls
│   ├── resolver.go
│   └── schema.resolvers.go
└── main.go

1. Mendefinisikan Mutation di Skema GraphQL

Langkah pertama: buka file schema.graphqls. Di sini kita tambahkan mutation untuk menambah buku.

type Book {
  id: ID!
  title: String!
  author: String!
}

input NewBook {
  title: String!
  author: String!
}

type Mutation {
  addBook(input: NewBook!): Book!
}

Penjelasan:

  • Book: Tipe data utama
  • NewBook: Input type—data yang diperlukan untuk menambah buku baru
  • addBook: Mutation yang akan diimplementasikan

2. Generate Kode Otomatis

Saat skema berubah (misal, ada penambahan mutation di atas), jalankan:

go run github.com/99designs/gqlgen generate

Perintah ini secara otomatis:

  • memperbarui models_gen.go (struct Go dari tipe GraphQL),
  • memperbarui interface resolver di resolver.go dan mengingatkan kita untuk mengisi fungsinya.

3. Implementasi Resolver Mutation

Sekarang buka schema.resolvers.go, lalu cari skeleton fungsi AddBook.

// graph/schema.resolvers.go

func (r *mutationResolver) AddBook(ctx context.Context, input model.NewBook) (*model.Book, error) {
    // TODO: implementasi, contoh simpan ke slice in-memory
}

Contoh kode sederhana: simpan data di slice books yang ada di struct Resolver.

// graph/model/models_gen.go (otomatis di-generate)
// type Book struct { ... }
// type NewBook struct { ... }

// graph/resolver.go

type Resolver struct {
    books []*model.Book
}

// graph/schema.resolvers.go

func (r *mutationResolver) AddBook(ctx context.Context, input model.NewBook) (*model.Book, error) {
	newBook := &model.Book{
		ID:     fmt.Sprintf("%d", len(r.books)+1),
		Title:  input.Title,
		Author: input.Author,
	}
	r.books = append(r.books, newBook)
	return newBook, nil
}

4. Simulasi Query GraphQL Mutation

Berikut contoh mutation yang biasa dilakukan dari playground GraphQL atau via curl:

mutation {
  addBook(input: { title: "Clean Code", author: "Robert C. Martin" }) {
    id
    title
    author
  }
}

Responsnya:

{
  "data": {
    "addBook": {
      "id": "1",
      "title": "Clean Code",
      "author": "Robert C. Martin"
    }
  }
}

5. Penjelasan Alur Kerja

Agar lebih jelas, berikut diagram alur mutasi addBook menggunakan Mermaid:

sequenceDiagram
    participant Client
    participant Server
    participant Resolver

    Client->>Server: send mutation addBook
    Server->>Resolver: panggil AddBook resolver
    Resolver-->>Server: return Book baru
    Server-->>Client: return response Book baru

6. Tabel Ringkasan Proses

StepFilePenjelasan
1. Defineschema.graphqlsDefinisikan Mutation dan Input
2. Generatego run ... generateGenerate models & resolver
3. Implementschema.resolvers.goResolver AddBook diisi kode Go
4. QueryPlayground/PostmanCoba mutation addBook
5. TestingOtomatis/ManualPastikan hasil sesuai harapan

7. Tips & Best Practice

  • Eksplisitkan Tipe Data: Gunakan input type biar skema jelas dan scalable.
  • Error Handling: Selalu handle error di resolver.
  • Persistence: Untuk production, simpan data ke DB, bukan hanya slice.
  • Authorization: Mutation sering kali butuh auth lebih ketat.
  • Scalability: Strukturkan codebase dengan modular agar mudah menambah mutation baru.

8. Studi Lanjutan: Middleware & Validasi

Mutation adalah fondasi awal, tapi check validation (misal, judul wajib unik) dan penggunaan middleware seperti cek authentication sangat penting untuk production.

Misal, validasi sederhana di resolver:

for _, b := range r.books {
    if b.Title == input.Title && b.Author == input.Author {
        return nil, fmt.Errorf("book already exists")
    }
}

Kesimpulan

Dengan beberapa langkah sederhana, kita sudah berhasil menambahkan mutation ke skema gqlgen. Gqlgen sangat powerful dan memiliki learning curve yang ramah bagi Go developer. Mutation di GraphQL sangat fleksibel: mau create, update, delete, bisa disesuaikan dengan kebutuhan aplikasi kapan saja hanya dengan modifikasi skema dan resolver.

Jika kamu ingin aplikasi lebih advanced, masukan layer database, otentikasi, dan penanganan error lebih lengkap. Namun core konsep mutation yang kamu pelajari hari ini akan konsisten di berbagai use case.

Selamat bereksperimen! 🚀


Referensi:


Jika kamu suka artikel ini atau ingin ngulik GraphQL + Go lebih lanjut, silakan beri komentar atau share! 👋

comments powered by Disqus