POST /delete
Spesifikasi endpoint delete untuk menghapus record
Endpoint /delete digunakan untuk menghapus satu atau beberapa record dari tabel database berdasarkan kondisi WHERE.
Referensi Cepat (Quick Reference)
| Properti | Nilai |
|---|---|
| Method | POST |
| URL | /api/{project}/{endpoint}/delete |
| Content-Type | application/json |
| Status Sukses | 200 OK |
| Database | PostgreSQL, MySQL, Oracle |
| Cache | Invalidasi otomatis jika deleted_count > 0 |
| Distributed Lock | WRITE lock per-record jika diaktifkan |
| Event Lifecycle | onBeforeDelete → DELETE → onAfterDelete |
Ikhtisar (Overview)
Request body wajib menyertakan parameter where yang menentukan record mana yang akan dihapus. Tanpa parameter where, server menolak request dengan response error 400. Mekanisme ini merupakan proteksi bawaan untuk mencegah penghapusan tidak disengaja terhadap seluruh data dalam tabel.
Parameter where bersifat wajib pada setiap request /delete. Request tanpa parameter where akan ditolak oleh server.
Format Request (Request Format)
Parameter WHERE (WHERE Parameter)
Parameter where berupa array of object dengan format [{key, value}]. Setiap object mendefinisikan satu kondisi kesamaan (equality) sederhana.
| Parameter | Tipe | Wajib | Keterangan |
|---|---|---|---|
where | array | Ya | Array kondisi filter. Minimal satu kondisi harus disertakan |
where[].key | string | Ya | Nama kolom yang dijadikan filter |
where[].value | any | Ya | Nilai yang dicocokkan (equality match) |
Contoh Request (Request Examples)
Delete satu record berdasarkan primary key:
{
"where": [
{ "key": "supplier_id", "value": "550e8400-e29b-41d4-a716-446655440000" }
]
}Delete beberapa record berdasarkan kondisi:
{
"where": [
{ "key": "is_active", "value": false }
]
}Contoh di atas menghapus semua record supplier yang memiliki is_active = false.
Body Options
Endpoint /delete mendukung format request body alternatif {data, options} untuk mengirimkan opsi tambahan yang dapat dibaca oleh component handler dan processor. Pada format ini, parameter where ditempatkan di dalam property data. Detail lengkap tersedia di halaman Body Options.
{
"data": {
"where": [
{ "key": "supplier_id", "value": "550e8400-e29b-41d4-a716-446655440000" }
]
},
"options": {
"soft_delete": true
}
}Format Response (Response Format)
Response Sukses (Success Response)
HTTP 200 OK
Response sukses menyertakan deleted_count yang menunjukkan jumlah record yang berhasil dihapus, serta deleted_items yang berisi data lengkap dari setiap record yang dihapus.
{
"success": true,
"message": "supplier data successfully deleted",
"data": {
"deleted_count": 1,
"deleted_items": [
{
"supplier_id": "550e8400-e29b-41d4-a716-446655440000",
"supplier_code": "SUP-001",
"supplier_name": "PT Maju Jaya",
"email": "contact@majujaya.com",
"phone": "021-5551234",
"is_active": true
}
]
},
"timestamp": "2026-04-16T10:30:00.000Z"
}Response Error (Error Responses)
400 — Payload kosong:
{
"success": false,
"error": "Invalid payload",
"message": "Payload cannot be empty",
"timestamp": "2026-04-16T10:30:00.000Z"
}400 — Parameter WHERE tidak ditemukan:
{
"success": false,
"error": "Invalid payload",
"message": "WHERE parameter is required for delete",
"timestamp": "2026-04-16T10:30:00.000Z"
}400 — Format WHERE tidak valid:
{
"success": false,
"error": "Invalid payload",
"message": "Invalid WHERE format. Expected array of {key, value}",
"timestamp": "2026-04-16T10:30:00.000Z"
}404 — Record tidak ditemukan:
{
"success": false,
"error": "Not found",
"message": "No records found matching the given conditions",
"timestamp": "2026-04-16T10:30:00.000Z"
}409 — Foreign key constraint (record masih direferensi):
{
"success": false,
"error": "Foreign key constraint",
"message": "Cannot delete record because it is still referenced by other data",
"timestamp": "2026-04-16T10:30:00.000Z"
}Error 409 pada endpoint /delete disebabkan oleh foreign key constraint, yaitu ketika record yang akan dihapus masih direferensikan oleh data di tabel lain. Ini berbeda dengan error 409 pada /create dan /update yang disebabkan oleh duplicate key.
500 — Server error:
{
"success": false,
"error": "Internal server error",
"message": "An unexpected error occurred",
"timestamp": "2026-04-16T10:30:00.000Z"
}Perilaku Cache (Cache Behavior)
Setelah operasi delete berhasil, cache di-invalidasi hanya jika deleted_count > 0. Jika tidak ada record yang terhapus, cache tetap dipertahankan. Invalidasi ini memastikan endpoint /read, /datatables, dan /lookup mengembalikan data terbaru pada request berikutnya.
Distributed Lock
Jika fitur distributed lock diaktifkan, endpoint /delete menggunakan WRITE lock per-record berdasarkan primary key dari record yang akan dihapus. Mekanisme ini mencegah kondisi race condition ketika proses lain sedang mengakses record yang sama secara bersamaan.
Jika lock tidak dapat diperoleh, server mengembalikan response error 500 dengan informasi kegagalan lock.
Event Lifecycle
Jika component engine dikonfigurasi di payload, endpoint /delete menjalankan hook berikut:
onBeforeDelete → DELETE dari database → onAfterDeleteHook onBeforeDelete dapat membatalkan operasi delete atau menjalankan validasi tambahan sebelum penghapusan dilakukan. Hook onAfterDelete dapat menjalankan side effect setelah data berhasil dihapus (misalnya membersihkan file terkait, mengirim notifikasi, atau menulis audit log).
Langkah Selanjutnya (Next Steps)
- POST /read untuk memverifikasi data setelah penghapusan
- POST /create untuk membuat record baru
- Kode Error untuk referensi lengkap HTTP status code