Struktur Payload
Anatomi file payload JSON dan properti konfigurasi yang tersedia
Payload adalah file JSON yang berfungsi sebagai blueprint untuk API generation. Satu file payload mendefinisikan satu endpoint API untuk satu tabel database, termasuk kolom yang di-expose, query yang digunakan, dan action yang tersedia.
Ikhtisar (Overview)
Pipeline kerja RESTForge dimulai dari payload:
┌──────────────┐ ┌───────────────┐ ┌──────────────────┐
│ Payload JSON │─────▶│ Generator │─────▶│ JavaScript Code │
│ (konfigurasi)│ │ (CLI) │ │ (siap jalankan) │
└──────────────┘ └───────────────┘ └──────────────────┘Payload JSON berfungsi sebagai single source of truth. Generator membaca payload dan menghasilkan module JavaScript yang optimal per database. Module inilah yang dijalankan oleh Express server saat runtime.
Contoh Payload Dasar (Basic Payload Example)
{
"tableName": "supplier",
"primaryKey": "supplier_id",
"fieldName": [
"supplier_id",
"supplier_code",
"supplier_name",
"contact_person",
"phone",
"email",
"is_active"
],
"datatablesQuery": "file:query/supplier-datatables.sql",
"datatablesWhere": [
"supplier_code",
"supplier_name",
"contact_person",
"all"
],
"action": {
"datatables": true,
"create": true,
"update": true,
"delete": true,
"first": true,
"lookup": true,
"read": true
}
}Payload di atas menghasilkan tujuh endpoint API untuk tabel supplier dengan kemampuan pencarian di kolom supplier_code, supplier_name, dan contact_person.
Properti Inti (Core Properties)
tableName
Nama tabel di database. Jika tabel berada di schema selain public, gunakan format "schema.table_name".
"tableName": "supplier" // schema default (public)
"tableName": "inventory.supplier" // schema eksplisitprimaryKey
Nama kolom primary key. Jika tidak disebutkan, generator menggunakan fieldName[0] sebagai fallback.
"primaryKey": "supplier_id"Selalu sertakan primaryKey secara eksplisit. Property ini digunakan oleh generator untuk WHERE clause pada operasi update, delete, dan first.
fieldName
Array berisi nama kolom yang akan di-handle oleh API. Urutan yang direkomendasikan:
- Primary key
- Code/number (unique identifier)
- Name/title
- Descriptive fields
- Status fields (
is_active,status) - Audit fields (
created_at,created_by,updated_at,updated_by)
"fieldName": [
"supplier_id", // 1. Primary key
"supplier_code", // 2. Code
"supplier_name", // 3. Name
"contact_person", // 4. Descriptive
"phone", // 4. Descriptive
"email", // 4. Descriptive
"is_active", // 5. Status
"created_at", // 6. Audit
"created_by" // 6. Audit
]datatablesQuery
Query SQL untuk endpoint datatables. Mendukung dua format:
Inline query:
"datatablesQuery": "SELECT supplier_id, supplier_code, supplier_name FROM supplier"External file (direkomendasikan untuk query panjang atau query dengan JOIN):
"datatablesQuery": "file:query/supplier-datatables.sql"File SQL disimpan di folder payload/query/ relatif terhadap folder payload/. Query tidak boleh mengandung WHERE, ORDER BY, atau LIMIT karena ketiga clause tersebut ditambahkan secara otomatis oleh generator.
datatablesWhere
Array kolom yang dapat di-search di endpoint datatables. Tambahkan "all" untuk mengaktifkan pencarian di seluruh kolom yang terdaftar.
"datatablesWhere": ["supplier_code", "supplier_name", "contact_person", "all"]Hindari kolom berikut untuk search: primary key (UUID), foreign key, timestamp, dan kolom dengan tipe data TEXT yang terlalu panjang.
action
Definisi action yang akan di-generate. Set true untuk action yang dibutuhkan dan false atau hilangkan untuk yang tidak.
| Action | Fungsi |
|---|---|
datatables | Data dengan pagination untuk DataTables.net |
create | Insert data baru |
update | Update data yang ada |
delete | Hapus data |
first | Membaca satu record berdasarkan kondisi |
lookup | Data untuk dropdown atau autocomplete |
read | Membaca banyak record |
Tipe Query Deklaratif (Declarative Query Types)
Selain datatablesQuery, payload mendukung tipe query tambahan untuk endpoint yang berbeda:
| Property | Digunakan oleh Endpoint | Fungsi |
|---|---|---|
datatablesQuery | /datatables | Query utama untuk tabel data |
viewQuery | /read, /first | Virtual view tanpa perlu membuat database VIEW |
viewName | /read, /first, /lookup | Merujuk ke database VIEW yang sudah ada |
exportQuery | /export | Query khusus untuk export Excel (mendukung alias kolom) |
Prioritas Resolusi (Resolution Priority)
Setiap endpoint memiliki urutan prioritas dalam memilih sumber data:
/datatables → datatablesQuery → fallback: SELECT * FROM tableName
/read → viewName → viewQuery → tableName
/first → viewName → viewQuery → tableName
/lookup → viewName → tableName
/export → exportQuery → fallback: SELECT fieldName FROM tableNameContoh penggunaan viewQuery untuk endpoint /read dan /first yang memerlukan JOIN:
{
"tableName": "supplier",
"primaryKey": "supplier_id",
"viewQuery": "SELECT s.supplier_id, s.supplier_code, s.supplier_name, c.country_name FROM supplier s LEFT JOIN country c ON c.country_id = s.country_id",
"datatablesQuery": "SELECT supplier_id, supplier_code, supplier_name FROM supplier"
}Dengan konfigurasi ini, endpoint /datatables menggunakan query sederhana yang cepat, sedangkan /read dan /first menggunakan query dengan JOIN yang menampilkan data lebih lengkap.
Format File Reference
Untuk query panjang, simpan di file terpisah:
{
"datatablesQuery": "file:query/supplier_list.sql",
"viewQuery": "file:query/supplier_detail.sql",
"exportQuery": "file:query/supplier_export.sql"
}File SQL disimpan di folder payload/query/ relatif terhadap lokasi payload JSON.
Properti Opsional Lanjutan (Optional Advanced Properties)
Selain properti inti, payload mendukung properti lanjutan untuk fitur yang lebih spesifik:
| Property | Fungsi |
|---|---|
fieldValidation | Validasi input deklaratif (required, pattern, format, min/max, dan lainnya) |
fieldNameLookup | Konfigurasi field id dan text untuk endpoint lookup |
masterDetail | Konfigurasi operasi composite (header + detail items) |
aggregateConfig | Konfigurasi fungsi agregasi (COUNT, SUM, AVG, GROUP BY) |
adjustConfig | Konfigurasi atomic increment/decrement field numerik |
importConfig | Konfigurasi import Excel (upsert keys, validasi import) |
workflow | Konfigurasi state machine dan transisi status |
components | Konfigurasi component engine (handler dan processor) |
Detail setiap properti lanjutan tersedia di halaman dokumentasi masing-masing di bagian Panduan Fitur. Payload tanpa properti lanjutan tetap berfungsi normal dengan fitur CRUD standar.
Praktik Terbaik (Best Practices)
Penamaan file payload: Gunakan nama yang sama dengan endpoint. File supplier.json menghasilkan endpoint supplier, file stock_inbound.json menghasilkan endpoint stock_inbound.
Urutan field: Ikuti konvensi urutan (PK, code, name, descriptive, status, audit) agar konsisten di seluruh project.
Pemilihan search column: Pilih kolom yang sering di-search oleh pengguna dan bertipe teks. Hindari UUID, timestamp, atau kolom TEXT yang terlalu panjang.
Primary key eksplisit: Selalu sertakan primaryKey meskipun primary key bernama id, agar generator tidak bergantung pada fallback.
External SQL file: Gunakan file SQL terpisah untuk query yang mengandung JOIN atau lebih dari satu baris. Hal ini memudahkan maintenance dan review.
Langkah Selanjutnya (Next Steps)
- Membuat Payload untuk tutorial langkah demi langkah membuat payload pertama
- Pola URL untuk memahami bagaimana action di payload dipetakan ke URL endpoint