tutorial

29 Mutation untuk Mengupdate dan Menghapus Data


title: 29 Mutation untuk Mengupdate dan Menghapus Data: Panduan Lengkap dengan Contoh Kode
subtitle: Memahami strategi, implementasi, dan best-practices dalam mutation update & delete di GraphQL
author: Senior Software Engineer date: 2024-06-15

Pendahuluan

Dalam pengembangan aplikasi modern, terutama ketika menggunakan GraphQL, mutation adalah mekanisme utama untuk mengubah (update) dan menghapus (delete) data di server. Namun, seringkali kita menemui pertanyaan mendasar: “Bagaimana cara mengimplementasikan mutation update dan delete yang efisien, aman, dan scalable?”

Pada artikel kali ini, saya akan membedah 29 mutation yang umum dipakai untuk kebutuhan update dan delete, baik secara parsial, bulk, hingga implementasi rutin di industri (seperti soft delete, cascade delete, dan partial update). Selain itu, saya akan memaparkan contoh kode, tabel perbandingan, hingga diagram alur dengan sintaks mermaid, agar Anda punya referensi best-practices dari engineer berpengalaman.


Dasar: Apa Itu Mutation?

Mutation adalah operasi untuk mengubah state data. Dalam praktik sehari-hari, mutation dipakai untuk:

  • Membuat data (create)
  • Mengubah data (update)
  • Menghapus data (delete)

Di artikel ini, saya akan fokus pada dua mutation yang spesifik: update dan delete.


Tabel: 29 Mutation untuk Update & Delete

Mari kita mulai dengan tabel summary. Banyak kombinasi yang dapat digunakan di organisasi modern, baik untuk proses update maupun delete.

NoMutation NameTipeSkopKeterangan
1updateUserUpdateSingleUpdate 1 record
2updateUsersUpdateBulkUpdate banyak record
3patchUserPartialSingleUpdate sebagian field
4patchUsersPartialBulkPartial update multi records
5upsertUserCreate/UpdateSingleUpdate jika ada, else create
6incrementScoreCustomSingleCustom: tambah/increment
7decrementStockCustomSingleCustom: kurangi stok
8softDeleteUserSoft DeleteSingleHanya update ‘deletedAt’
9softDeleteUsersSoft DeleteBulkSoft delete banyak data
10hardDeleteUserHard DeleteSingleHapus data sepenuhnya
11hardDeleteUsersHard DeleteBulkHard delete massal
12archiveUserArchiveSingleMark jadi ‘archived’
13restoreUserRestoreSingleUn-delete/restore
14restoreUsersRestoreBulkRestore massal
15deactivateUserStatus UpdateSingleUbah status (aktif/deactive)
16activateUserStatus UpdateSingleUbah status
17banUserCustomSingleBan user
18unbanUserCustomSingleUnban user
19changePasswordSensitiveSingleChange password only
20unlinkAccountDelete LinkSingleDelete relasi antar data
21cascadeDeleteCascadeSingleHapus data + relasi terkait
22purgeDeletedClean UpBulkBuang data ‘deleted’
23reassignTaskReassignSingleUpdate pindah owner
24migrateDataMigrationBulk/SingleMassal/migration operation
25toggleFlagToggleSingleEnable/disable flag
26overwriteProfileOverwriteSingleReplace/update seluruh objek
27expireSessionDeleteSingleNon-user object delete
28resetQuotaResetSingleBalikkan quota ke awal
29anonymizeUserPrivacySingleUpdate field jadi anonim

Perlu dicatat, pada real-life implementation, mutation ini akan berbeda sesuai dengan kebutuhan bisnis, skema, dan keamanan aplikasi Anda.


Contoh Kode: Mutation Update

Biasanya, GraphQL mutation untuk update data user bisa sederhana seperti di bawah:

mutation updateUser($id: ID!, $input: UserUpdateInput!) {
  updateUser(id: $id, input: $input) {
    id
    name
    email
    updatedAt
  }
}

Handler di Node.js (Express + Apollo):

// resolver.js
const updateUser = async (_, { id, input }, { db }) => {
  const updated = await db.User.findByIdAndUpdate(id, input, { new: true });
  if (!updated) throw new Error("User not found");
  return updated;
};

Dengan pola di atas, Anda bisa mendefinisikan mutation sesuai dengan kebutuhan field yang ingin diupdate (baik full maupun partial).


Case Study: Bulk Update & Soft Delete

Untuk kinerja tinggi (misalnya update banyak data), pattern seperti bulk update dan soft delete jadi lazim digunakan.

Contoh Bulk Update

mutation updateUsers($ids: [ID!]!, $input: UserUpdateInput!) {
  updateUsers(ids: $ids, input: $input) {
    count
    updatedIds
  }
}

Handler-nya:

const updateUsers = async (_, { ids, input }, { db }) => {
  const result = await db.User.updateMany(
    { _id: { $in: ids }},
    { $set: input }
  );
  return {
    count: result.nModified,
    updatedIds: ids,
  };
};

Soft Delete Implementation

Daripada menghapus data dari DB, soft delete cukup update kolom deletedAt:

mutation softDeleteUser($id: ID!) {
  softDeleteUser(id: $id) {
    id
    deletedAt
  }
}

Server-side-nya:

const softDeleteUser = async (_, { id }, { db }) => {
  return db.User.findByIdAndUpdate(
    id,
    { deletedAt: new Date() },
    { new: true }
  );
};

Soft delete memudahkan recover (restoreUser), audit log, dan keamanan data.


Diagram Alur: Soft Delete vs Hard Delete

Mengilustrasikan bedanya dengan Mermaid:

flowchart TD
  A[User click "Delete"] --> B{Soft Delete?}
  B -- Yes --> C[Update 'deletedAt' field]
  C --> D[Data tidak tampil, bisa restore]
  B -- No --> E[Delete from DB]
  E --> F[Data hilang permanen]

Simulation: Perbandingan Soft Delete & Hard Delete

FiturSoft DeleteHard Delete
Reversible?YaTidak
Aman Audit?YaTidak
Space Saving?TidakYa
ComplexityLebih SusahLebih Mudah
PerformanceBiasanya cepatSangat cepat

Best Practices Mutation Update & Delete

  1. Selalu Validasi Input
    Cegah updated field yang tidak valid agar integritas data terjaga.

  2. Partial vs Full Update
    Gunakan partial untuk efisiensi dan keamanan. Jangan selalu expose seluruh object.

  3. Bulk Operations
    Batch update/delete bisa mempercepat, tapi perlu penanganan concurrency & rollback.

  4. Audit Log
    Apapun mutation update/delete yang penting, logging sangat vital untuk forensik.

  5. Authorization Check
    Jangan sampai mutation update/delete sembarangan! Pastikan user puny aksesnya.

  6. Soft Delete
    Default soft delete, baru hapus permanen via maintenance rutin (purge).


Kesimpulan

Mengelola mutation untuk update dan delete ternyata jauh lebih dari sekadar menulis kode satu baris. Ada berbagai skema, pattern, dan best-practices yang perlu Anda pahami agar aplikasi tetap modular, aman, dan maintainable.
Dengan 29 variasi mutation ini, Anda sebagai engineer bisa mengantisipasi case-case bisnis di masa depan—tanpa perlu refactor besar-besaran.

Jangan lupa selalu lakukan review dan testing pada setiap mutation!
Jika punya pengalaman atau pattern mutation lain yang unik, silakan diskusi di kolom komentar.


Selamat mencoba, semoga data Anda selalu aman dan terkelola dengan baik! 🚀


Further reading:

comments powered by Disqus