Kode Error
Referensi HTTP status code dan format error response RESTForge
RESTForge menggunakan HTTP status code standar dan format error response yang konsisten di seluruh endpoint. Halaman ini mendokumentasikan setiap kode status, kapan digunakan, dan format response yang dikembalikan.
Response Envelope
Format Sukses (Success Format)
Seluruh endpoint (kecuali /datatables) menggunakan envelope berikut untuk operasi yang berhasil:
{
"success": true,
"message": "supplier data successfully added",
"data": { },
"timestamp": "2026-04-16T10:30:00.000Z"
}| Field | Tipe | Keterangan |
|---|---|---|
success | boolean | Selalu true untuk operasi yang berhasil |
message | string | Pesan deskriptif hasil operasi |
data | object/array | Hasil data (format bervariasi per endpoint) |
timestamp | string | Waktu eksekusi dalam format ISO 8601 |
Format Error (Error Format)
{
"success": false,
"error": "Record not found",
"message": "supplier not found",
"timestamp": "2026-04-16T10:30:00.000Z"
}| Field | Tipe | Keterangan |
|---|---|---|
success | boolean | Selalu false untuk operasi yang gagal |
error | string | Kategori error (contoh: "Invalid payload", "Record not found") |
message | string | Pesan error detail yang dapat dibaca |
details | string | Detail error teknis. Hanya muncul jika NODE_ENV=development |
timestamp | string | Waktu eksekusi dalam format ISO 8601 |
Format Error Validasi (Validation Error Format)
Endpoint /create dan /update yang memiliki fieldValidation menghasilkan format error khusus:
{
"success": false,
"error": "Validation failed",
"message": "Invalid data",
"errors": {
"supplier_code": ["Field supplier_code is required"],
"email": ["Field email must be a valid email address"],
"credit_limit": ["Field credit_limit must be at least 0"]
},
"timestamp": "2026-04-16T10:30:00.000Z"
}Field errors berisi object di mana key adalah nama field dan value adalah array pesan error per field.
Referensi Kode Status HTTP (HTTP Status Code Reference)
200 — OK
Operasi berhasil selain pembuatan data baru.
| Endpoint | Kondisi |
|---|---|
/read | Query berhasil (termasuk jika data kosong) |
/first | Query berhasil (termasuk jika count: 0) |
/update | UPDATE berhasil |
/delete | DELETE berhasil |
/adjust | Adjustment berhasil |
/datatables | Query berhasil |
/lookup | Query berhasil |
/aggregate | Agregasi berhasil |
/change-status | Perubahan status berhasil |
/read-composite | Query berhasil |
/update-composite | UPDATE berhasil |
Endpoint /read dan /first mengembalikan 200 meskipun data kosong. Data kosong bukan error, melainkan hasil query yang valid.
201 — Created
Record baru berhasil dibuat. Hanya digunakan oleh endpoint yang membuat data baru.
| Endpoint | Kondisi |
|---|---|
/create | INSERT berhasil |
/create-composite | INSERT header + detail berhasil |
400 — Bad Request
Request tidak dapat diproses karena kesalahan dari sisi client. Error ini terjadi sebelum operasi database utama dijalankan (kecuali FK constraint pada create/update).
| Kategori | Contoh Message | Endpoint |
|---|---|---|
| Payload kosong | Payload cannot be empty | Semua |
| Field wajib hilang | Primary key (supplier_id) is required for update | update, delete, adjust |
| Parameter WHERE hilang | Invalid request format: where parameter is required | delete |
| Format WHERE salah | Invalid where format | read, first, delete |
| Validasi field gagal | Invalid data (+ object errors) | create, update |
| Field select tidak valid | Invalid field(s): unknown_column | read, first, lookup |
| Parameter tidak valid | Page must be greater than 0 | read |
| FK constraint (create/update) | Referenced data not found | create, update |
| Header HTTP hilang | X-Request-Mode header must be set to dynamic | lookup (GET) |
| Adjustment tidak valid | Field "x" is not configured for adjustment | adjust |
| Aggregate tidak valid | Invalid aggregate function "median" | aggregate |
404 — Not Found
Record yang dituju tidak ditemukan di database. Hanya terjadi pada operasi yang membutuhkan record existing.
| Endpoint | Kondisi |
|---|---|
/update | Record tidak ditemukan berdasarkan primary key |
/delete | Record tidak ditemukan berdasarkan WHERE |
/adjust | Record tidak ditemukan sebelum adjustment |
/update-composite | Header record tidak ditemukan |
Endpoint /read dan /first dengan data kosong mengembalikan 200 (bukan 404). Data kosong adalah hasil query yang valid, bukan error.
409 — Conflict
Operasi gagal karena konflik dengan state data saat ini di database.
| Kategori | Kondisi | Endpoint |
|---|---|---|
| Duplicate entry | Unique constraint violation | create, update, create-composite |
| FK constraint (delete) | Record masih direferensikan oleh tabel lain | delete |
| Constraint violation | Guard clause gagal (nilai di bawah minimum) | adjust |
| Resource busy | Distributed lock tidak dapat diperoleh | update, delete, change-status |
Perbedaan FK constraint antara endpoint:
- Create/Update: FK violation di-map ke 400 karena data referensi tidak ditemukan (kesalahan input dari client)
- Delete: FK violation di-map ke 409 karena record tidak bisa dihapus selama masih digunakan (konflik state database)
422 — Unprocessable Entity
Transisi status tidak diizinkan berdasarkan konfigurasi workflow.
| Endpoint | Kondisi |
|---|---|
/change-status | Transisi dari status A ke status B tidak terdaftar di workflow.transitions |
{
"success": false,
"error": "Transition not allowed",
"message": "Cannot change status from 'draft' to 'closed'",
"timestamp": "2026-04-16T10:30:00.000Z"
}429 — Too Many Requests
Rate limit terlampaui. Dikembalikan jika rate limiting middleware aktif.
500 — Internal Server Error
Error yang terjadi di sisi server dan bukan disebabkan oleh kesalahan client. Ini adalah catch-all terakhir di setiap endpoint.
| Kategori | Contoh Penyebab |
|---|---|
| Database error | Connection timeout, query syntax error, database down |
| Lock failure | Failed to acquire lock for update operation |
| Verification failure | Could not verify data existence before delete |
| Error tak terduga | Runtime error, out of memory |
Field details hanya muncul jika NODE_ENV=development, berisi error.message asli untuk keperluan debugging.
Kategori Error (Error Categories)
| Kategori Error | HTTP Code | Scope Endpoint |
|---|---|---|
Invalid payload | 400 | Semua |
Missing required field | 400 | update, delete, adjust, change-status |
Validation failed | 400 | create, update |
Invalid where format | 400 | read, first, delete |
Invalid parameter | 400 | read, aggregate, lookup |
Foreign key constraint | 400 / 409 | 400 pada create/update, 409 pada delete |
Duplicate entry | 409 | create, update, create-composite |
Constraint violation | 409 | adjust |
Record not found | 404 | update, delete, adjust |
Transition not allowed | 422 | change-status |
| Database/server error | 500 | Semua |
Mapping Error Code PostgreSQL
RESTForge memetakan kode error PostgreSQL ke HTTP status code berdasarkan konteks endpoint:
| PG Error Code | Pada Create/Update | Pada Delete | Kategori |
|---|---|---|---|
23505 | 409 | 409 | Unique constraint violation |
23503 | 400 | 409 | Foreign key constraint |
Perbedaan mapping 23503 disebabkan oleh konteks yang berbeda:
- Create/Update: data referensi tidak ada sehingga merupakan kesalahan input dari client (400)
- Delete: data masih direferensikan oleh tabel lain sehingga merupakan konflik state database (409)
Langkah Selanjutnya (Next Steps)
- Format Response untuk ikhtisar format response di seluruh endpoint
- Katalog Action untuk daftar lengkap action yang tersedia