RESTForge

Body Options

Format request body {data, options} dan cara mengirim opsi tambahan ke handler

Body Options memungkinkan pengiriman opsi tambahan bersamaan dengan data utama dalam satu request body. Opsi ini berfungsi sebagai flag atau parameter kontrol yang dapat dibaca oleh component engine handler dan processor untuk menjalankan logic conditional.

Ikhtisar (Overview)

Tanpa Body Options, tidak ada mekanisme standar untuk mengirimkan instruksi tambahan ke handler/processor selain melalui header HTTP atau query parameter. Hal ini menyulitkan skenario seperti:

  • Mengontrol apakah notifikasi email dikirim setelah create
  • Menentukan apakah event perlu di-publish ke message broker
  • Mengirimkan flag khusus untuk conditional logic di processor
  • Meneruskan metadata bisnis yang bukan bagian dari data tabel

Body Options menyelesaikan masalah ini dengan menyediakan format body terstruktur {data, options} yang secara otomatis dikenali oleh middleware.

Format Request Body

Format Standar (Standard Format)

Format body lama tetap didukung sepenuhnya. Data dikirim langsung di body tanpa wrapper:

{
    "supplier_code": "SUP-001",
    "supplier_name": "PT Maju Jaya",
    "email": "contact@majujaya.com",
    "is_active": true
}

Format dengan Options (Format with Options)

Data dibungkus dalam property data, dan opsi tambahan ditempatkan di property options:

{
    "data": {
        "supplier_code": "SUP-001",
        "supplier_name": "PT Maju Jaya",
        "email": "contact@majujaya.com",
        "is_active": true
    },
    "options": {
        "send_feedback_email": true,
        "send_to_kafka": false,
        "custom_flag": "any_value"
    }
}

Aturan Deteksi (Detection Rules)

Middleware mendeteksi format baru berdasarkan tiga kondisi yang harus terpenuhi seluruhnya:

KondisiPersyaratan
Body memiliki tepat 2 keydata dan options
data bertipe objectBukan null, bukan array, bukan string
options bertipe objectBukan null, bukan array, bukan string

Jika salah satu kondisi tidak terpenuhi, body diproses menggunakan format standar. Tabel berikut menunjukkan perilaku untuk berbagai format body:

Format BodyDikenali sebagai OptionsKeterangan
{ field: "value" }TidakFormat lama, diproses tanpa perubahan
{ data: {...}, options: {...} }YaData di-extract, options diteruskan
{ rootKey: {...} }TidakFormat composite lama
{ data: { rootKey: {...} }, options: {...} }YaFormat composite dengan options
{ data: "string", options: {...} }Tidakdata bukan object
{ data: {...}, options: {...}, extra: "x" }TidakLebih dari 2 key
{ data: {...} }TidakHanya 1 key

Aturan "tepat 2 key" menghindari false positive jika tabel kebetulan memiliki kolom bernama data atau options. Fitur ini sepenuhnya backward compatible.

Action yang Didukung (Supported Actions)

ActionBody Options Aktif
createYa
updateYa
deleteYa
create-compositeYa
update-compositeYa
adjustYa
Workflow actionsYa

Contoh Penggunaan (Usage Examples)

CREATE dengan Options

POST /api/mini-inventory/supplier/create

{
    "data": {
        "supplier_code": "SUP-001",
        "supplier_name": "PT Maju Jaya",
        "is_active": true
    },
    "options": {
        "send_feedback_email": true,
        "notify_admin": false
    }
}

UPDATE-COMPOSITE dengan Options

POST /api/mini-inventory/stock-inbound/update-composite

{
    "data": {
        "stock_inbound": {
            "stock_inbound_id": "d4e57872-...",
            "notes": "Diperbarui",
            "stock_inbound_item": {
                "update": [
                    { "stock_inbound_item_id": "a1b2c3d4-...", "qty_received": 30 }
                ],
                "insert": [],
                "delete": []
            }
        }
    },
    "options": {
        "recalculate_totals": true,
        "notify_warehouse": true
    }
}

Mengakses Options (Accessing Options)

Dari Handler (From Handler)

Pada konfigurasi component di payload JSON, tambahkan {options} sebagai parameter template variable:

Konfigurasi component di payload
{
    "params": [
        { "value": "{tableName}" },
        { "value": "{requestData}" },
        { "value": "{options}" }
    ]
}

Handler menerima options sebagai parameter fungsi:

src/components/handlers/custom_handler.js
async function handleBeforeInsert(tableName, requestData, options, services) {
    if (options.send_feedback_email) {
        // Logic pengiriman email
    }
    return { success: true };
}

Template variable mendukung dot notation untuk mengakses property spesifik:

  • {options} menghasilkan seluruh object options
  • {options.send_feedback_email} menghasilkan true
  • {options.custom_flag} menghasilkan "any_value"

Dari Processor (From Processor)

Processor dapat mengakses options melalui req.bodyOptions:

src/modules/{project}/processor/{endpoint}/{name}.js
async function process(input, services, req) {
    const options = req.bodyOptions || {};

    if (options.send_to_kafka !== false) {
        // Default: publish ke Kafka jika tidak di-disable
    }

    return { success: true, statusCode: 201, data: { processed: true } };
}

Alur Pemrosesan (Processing Flow)

HTTP Request


bodyParser.json()          ← Parse JSON body


Idempotency Middleware     ← Hash body asli (termasuk options)


Body Options Middleware    ← Deteksi {data, options}, extract ke req.body dan req.bodyOptions


Route Handler              ← req.body = data saja, req.bodyOptions = options


Component Engine           ← Resolve {options} template variable dari context


Handler / Processor        ← Menerima options sebagai parameter

Idempotency middleware berjalan sebelum body options middleware. Dua request dengan data yang sama tetapi options berbeda menghasilkan hash yang berbeda dan tidak dianggap sebagai duplikat.

Panduan Penggunaan (Usage Guidelines)

Gunakan options untuk:

KategoriContoh
Flag kontrol behaviorsend_email, notify_admin, skip_audit
Mode operasidry_run, force_update, soft_delete
Parameter integrasisend_to_kafka, sync_to_erp
Metadata non-datareason, source_system, batch_id

Jangan gunakan options untuk:

KategoriAlasan
Data kolom tabelKirim langsung di data
Kriteria WHEREMasukkan di data.where (untuk delete)
Informasi autentikasiGunakan header x-api-key atau Authorization
Pagination/sortingGunakan parameter pada endpoint read

Langkah Selanjutnya (Next Steps)

On this page