RESTForge

Arsitektur & Filosofi Desain

Tiga keputusan desain fundamental RESTForge — code generation, action-based endpoint, dan multi-database setara

RESTForge dibangun di atas tiga keputusan desain fundamental yang membentuk cara kerja framework. Memahami filosofi ini membantu menilai apakah pendekatan RESTForge sesuai dengan kebutuhan dan budaya tim.

Code Generation, Bukan Runtime Interpretation

Banyak framework menggunakan pendekatan runtime interpretation, di mana konfigurasi dibaca dan dijalankan setiap kali request masuk. RESTForge memilih jalur berbeda: konfigurasi JSON di-translate menjadi source code JavaScript saat build, dan runtime hanya menjalankan code yang sudah jadi.

AspekRuntime InterpretationCode Generation (RESTForge)
PerformaOverhead parsing setiap requestTanpa overhead karena code sudah optimal
DebuggingStack trace masuk ke framework internalStack trace masuk ke generated code yang bisa dibaca
KustomisasiSulit karena harus override mekanisme frameworkMudah karena generated code bisa diedit langsung
ToolingButuh tooling khusus frameworkBisa menggunakan tooling Node.js standar (debugger, profiler, linter)

Generated code adalah aset yang dapat di-review, di-version, di-debug, dan di-extend. Tim tetap memegang kendali penuh, bukan tergantung pada vendor framework untuk fix bug atau menambah fitur.

Alur Kerja (Workflow)

┌──────────────┐      ┌───────────────┐      ┌──────────────────┐
│  Payload JSON │─────▶│  Generator    │─────▶│  JavaScript Code │
│  (konfigurasi)│      │  (CLI)        │      │  (siap jalankan) │
└──────────────┘      └───────────────┘      └──────────────────┘


                                              ┌──────────────────┐
                                              │  Express Server  │
                                              │  (runtime)       │
                                              └──────────────────┘

Payload JSON berfungsi sebagai single source of truth. Generator membaca payload dan menghasilkan module JavaScript yang sudah optimal per database. Runtime kemudian menjalankan module tersebut di Express server tanpa overhead interpretasi.

Action-Based Endpoint Pattern

REST tradisional menggunakan HTTP method (GET, POST, PUT, DELETE) untuk membedakan operasi. RESTForge mengadopsi pola action-based di mana operasi dilakukan via HTTP POST dengan nama action di URL path.

POST /api/{project}/{endpoint}/{action}

Contoh Pola URL (URL Pattern Examples)

OperasiPola URL
Membuat data baruPOST /api/inventory/supplier/create
Membaca banyak recordPOST /api/inventory/supplier/read
Membaca satu recordPOST /api/inventory/supplier/first
Mengubah dataPOST /api/inventory/supplier/update
Menghapus dataPOST /api/inventory/supplier/delete
Data untuk tabelPOST /api/inventory/supplier/datatables
Data untuk dropdownPOST /api/inventory/supplier/lookup
Agregasi dataPOST /api/inventory/supplier/aggregate

Alasan Pendekatan Ini Dipilih

ManfaatPenjelasan
Mendukung query kompleksFilter dengan nested condition, multi-operator, dan logika AND/OR dapat dikirim di body tanpa limitasi URL length
Konsisten lintas operasiTim tidak perlu beralih antara GET, POST, PUT, DELETE dengan semantik yang berbeda-beda
Mendukung payload besarOperasi seperti import, bulk create, atau composite master-detail dapat dikirim dalam satu request
Mudah didokumentasikanSetiap action adalah resource terpisah dengan format yang sama sehingga lebih mudah di-document dan di-version

RESTForge tidak sepenuhnya REST purist, tetapi pragmatis. Trade-off ini diambil dengan sadar karena kebutuhan praktis tim backend lebih penting daripada konformitas penuh terhadap standar REST.

Multi-Database Setara (Equal Multi-Database Support)

RESTForge mendukung tiga database dengan posisi setara, bukan satu sebagai default dan lainnya sebagai second-class citizen. Setiap database mendapat template generator dan dialect adapter tersendiri.

DatabaseStatusKarakteristik Spesifik
PostgreSQLSetaraMendukung RETURNING, JSONB, dan fitur lanjutan PostgreSQL
MySQLSetaraINSERT+SELECT pattern untuk return data, charset handling
OracleSetaraUPPERCASE keys, native Date driver, schema awareness

Mengapa Setara, Bukan Abstraction Layer

Pendekatan umum untuk multi-database adalah membangun satu abstraction layer (ORM) yang menyeragamkan akses ke semua database. Pendekatan ini menghasilkan lowest common denominator di mana fitur spesifik setiap database hilang.

RESTForge memilih pendekatan template per database: setiap database mendapat SQL yang spesifik dan optimal. Konsekuensinya, code yang di-generate untuk PostgreSQL memanfaatkan fitur PostgreSQL secara penuh, begitu pula untuk MySQL dan Oracle.

PendekatanKarakteristikPilihan RESTForge
Single ORM AbstractionLowest common denominator, fitur database-specific hilangTidak dipilih karena mengorbankan optimasi per database
Template per DatabaseSQL spesifik dan optimal per databaseDipilih karena tim mendapat code yang sudah optimal

Implikasi untuk Tim

  • Tim dengan investasi Oracle yang besar tidak perlu migrasi ke database lain
  • Tim baru dapat memilih PostgreSQL atau MySQL sesuai preferensi tanpa kekhawatiran perbedaan treatment dari framework
  • Migrasi antar database dapat dilakukan dengan effort minimal karena perubahan hanya di level konfigurasi dan re-generate

On this page