Kurikulum Resmi NQA: Webhook, Microservices, Pengujian, dan Proyek End-to-End
Selamat datang di repository pembelajaran resmi API Development Training - Hari 3. Repository ini dibangun secara komprehensif untuk mengimplementasikan dan membuktikan seluruh 69 slide presentasi pelatihan Hari 3, menjembatani konsep teoretis ke dalam kode operasional siap uji pada stack Node.js 20+, Express, SQLite (WAL Mode), Pino, Vitest, dan Supertest.
-
π¨ Webhook Receiver & Verifikasi HMAC (Slide 9 β 34):
- Endpoint
POST /webhooks/taskhubdengan pembacaan Buffer byte asli (express.raw({ limit: "64kb" })) sebelum parsing JSON (Slide 19 & 20). - Tanda tangan kriptografis HMAC-SHA256 dari
timestamp.rawBodydengan perbandingan waktu-konstancrypto.timingSafeEqualanti-Timing Attack (Slide 11 & 21). - Pembatasan Replay Window berbasis timestamp toleransi 300 detik (Slide 13 & 20).
- Deduplikasi event identik (202 Accepted, duplicate=true) dan deteksi modifikasi/tampering hash (409 Conflict) (Slide 15 & 33).
- Endpoint
-
π₯ Pola Durable Inbox & Background Worker (Slide 17 β 27):
- Menjamin prinsip "Jangan kirim 2xx sebelum tersimpan durabel ke database" (Slide 17).
- Skema tabel
inboxberpenegakanUNIQUE(provider, event_id)anti-race condition (Slide 18 & 24). - Worker asinkron dengan koordinasi Claim/Lease, pencatatan efek demonstrasi ke tabel
effects, penanganan retry bertahap, dan simulasi Dead Letter Queue (DLQ) (Slide 25 & 26).
-
π Komunikasi Microservice: Outbox & SAGA Simulator (Slide 35 β 40):
- Pencegahan Dual Write Problem melalui pola Transactional Outbox yang mengikat penyimpanan Task dan Outbox Event dalam satu transaksi basis data atomik (Slide 38).
- Simulasi celah publisher crash yang membuktikan mengapa consumer tetap wajib idempoten (Slide 39).
- Simulasi pola SAGA (Reservasi β Bayar β Konfirmasi) dilengkapi alur Transaksi Kompensasi saat pembayaran ditolak (Slide 40).
-
π§ͺ Otomasi Pengujian & Workflow 14 Langkah (Slide 41 β 52):
- 30 Skenario Uji Otomatis menggunakan Vitest + Supertest pada
tests/auth.test.js,tests/tasks.test.js,tests/security.test.js, dantests/webhooks.test.js(Slide 44 & 47). - Runner interaktif Workflow 14 Langkah Postman/Insomnia: Login, CRUD, Optimistic Concurrency Control (409), BOLA Violation (403), Mass Assignment (422), Idempotency Key notifikasi, dan Cleanup (Slide 48).
- Matriks 15 skenario uji keamanan deterministik (Slide 50).
- 30 Skenario Uji Otomatis menggunakan Vitest + Supertest pada
-
π Observabilitas & Kesiapan Produksi (Slide 53 β 58):
- Structured Logging Pino tanpa kebocoran (Zero-Leak): Mencatat
requestId,method,pathtanpa query,status, danlatencyMs. Tidak pernah mencetak token, password, body, atau signature! (Slide 54). - Probe diagnostik orkestrator kontainer:
/health/livenessdan/health/readiness(Slide 57). - Pengukuran latensi persentil p50, p95, p99, dan pemantauan backlog antrean inbox (Slide 52 & 55).
- Structured Logging Pino tanpa kebocoran (Zero-Leak): Mencatat
-
π¨ Web Playground Interaktif Modern:
- Antarmuka web glassmorphism dark-mode yang elegan diakses melalui browser pada
http://127.0.0.1:3000/playground. - Dilengkapi Live HMAC Studio, visualizer status sirkuit, pemeriksa tabel SQLite real-time, dan log stream.
- Antarmuka web glassmorphism dark-mode yang elegan diakses melalui browser pada
flowchart TD
subgraph ClientLayer["Klien & Pengirim Eksternal"]
WebhookSender["Pengirim Webhook (TaskHub)"]
BrowserPlayground["Web Playground Interaktif (:3000/playground)"]
TestRunner["Vitest + Supertest (30 Tests)"]
end
subgraph GatewayLayer["API Gateway & Middleware Layer"]
Logging["Structured Logger (Pino - Zero Leak)"]
CORS["CORS Policy (Origin Allowlist)"]
RawBodyParser["express.raw (Maks 64KB Buffer)"]
AuthMiddleware["Auth & Opaque Token Verifier"]
BOLAMiddleware["BOLA / Ownership Guard (403)"]
end
subgraph ControllerLayer["Controllers & Services"]
WebhookRoute["POST /webhooks/taskhub"]
HMACService["HMAC-SHA256 & timingSafeEqual"]
TasksRoute["REST Tasks CRUD & Versioning (409)"]
OutboxSvc["Transactional Outbox Service"]
SagaSvc["SAGA Pattern Coordinator"]
end
subgraph StorageLayer["SQLite Storage (WAL Mode)"]
TableInbox[("Tabel: inbox (Durable)")]
TableEffects[("Tabel: effects (1 Effect/Event)")]
TableTasks[("Tabel: tasks (OCC Versioning)")]
TableOutbox[("Tabel: outbox (Atomik Commit)")]
end
subgraph BackgroundLayer["Asynchronous Workers"]
InboxWorker["Background Inbox Worker (Tick 3s)"]
OutboxRelay["Outbox Relay Publisher"]
end
WebhookSender -->|POST with X-Timestamp & X-Signature| RawBodyParser
RawBodyParser --> WebhookRoute
WebhookRoute --> HMACService
HMACService -->|Valid & Idempoten| TableInbox
TableInbox -->|Balas Seketika| WebhookSender
TableInbox -.->|Claim / Lease| InboxWorker
InboxWorker -->|Catat Demonstrasi| TableEffects
InboxWorker -->|Update processed| TableInbox
BrowserPlayground --> TasksRoute
TasksRoute --> BOLAMiddleware
BOLAMiddleware --> TableTasks
API-Development-3/
βββ .env.example # Templat konfigurasi lingkungan
βββ .env # Konfigurasi lingkungan aktif lokal
βββ package.json # Konfigurasi dependensi dan skrip npm
βββ openapi.yaml # Kontrak formal OpenAPI 3.0 (Contract-First)
βββ postman_collection.json # Koleksi 14 langkah pengujian Postman/Insomnia
βββ postman_environment.json # Variabel lingkungan Postman lokal
βββ PANDUAN_INSTALASI.md # Panduan instalasi dan persiapan lingkungan
βββ README.md # Dokumentasi utama proyek
β
βββ bahan_ajar/ # 10 Modul Bahan Ajar Lengkap (Bedah 69 Slide)
β βββ README.md # Silabus dan peta belajar mandiri
β βββ 00_ringkasan_hari_3_dan_alur_end_to_end.md
β βββ 01_webhook_fondasi_dan_kontrak_delivery.md
β βββ 02_verifikasi_hmac_dan_raw_body.md
β βββ 03_at_least_once_deduplikasi_dan_hash_conflict.md
β βββ 04_durable_inbox_worker_dan_dlq.md
β βββ 05_komunikasi_microservice_outbox_dan_saga.md
β βββ 06_pengujian_api_vitest_supertest_dan_workflow_14_langkah.md
β βββ 07_observability_operasi_dan_kesiapan_produksi.md
β βββ 08_proyek_unit_kerja_evaluasi_dan_rencana_30_60_90.md
β βββ 09_glosarium_dan_kamus_istilah.md # Kamus kosakata sulit terlengkap
β
βββ playground/ # Web Playground Interaktif Modern
β βββ index.html # Antarmuka web glassmorphism dark-mode
β βββ style.css # Desain sistem responsif modern
β βββ app.js # Logika interaktif live polling & studio
β
βββ src/ # Kode Sumber Aplikasi Backend (Dokumentasi Tiap Lini)
β βββ config.js # Validasi konfigurasi Zod (Fail-Fast)
β βββ db.js # SQLite driver (better-sqlite3) & skema tabel
β βββ logger.js # Structured logging Pino tanpa leak kredensial
β βββ app.js # Perakitan Express app dan middleware
β βββ server.js # Entrypoint server HTTP dan worker
β βββ worker.js # Standalone background worker process
β βββ middleware/
β β βββ auth.js # Autentikasi opaque token SHA-256 (401)
β β βββ bola.js # Pencegahan BOLA / IDOR kepemilikan task (403)
β β βββ cors.js # Kebijakan peramban CORS allowlist
β β βββ rateLimiter.js # Pembatas laju permintaan (429)
β βββ routes/
β β βββ auth.js # Endpoint login pengguna
β β βββ tasks.js # CRUD task, OCC versioning, dan idempotency
β β βββ webhooks.js # Endpoint webhook receiver express.raw
β β βββ health.js # Liveness, readiness, dan metrik operasi
β β βββ lab.js # API pendukung Web Playground
β βββ schemas/
β β βββ auth.js # Skema validasi login
β β βββ events.js # Skema validasi kontrak event webhook
β β βββ tasks.js # Skema task anti-mass-assignment
β βββ services/
β βββ webhookService.js # Logika verifikasi HMAC & deduplikasi inbox
β βββ workerService.js # Pemrosesan event inbox dan efek demonstrasi
β βββ outboxService.js # Implementasi Transactional Outbox pattern
β βββ sagaService.js # Orkestrasi SAGA & transaksi kompensasi
β
βββ scripts/ # Skrip Pengujian & Laboratorium CLI
β βββ seed.js # Inisialisasi basis data awal
β βββ send_event.js # Skrip kirim event bertanda tangan 2x (Slide 29)
β βββ check_db.js # Inspeksi tabel inbox & effects (Slide 32)
β βββ run_negative_tests.js # Pengujian 5 skenario negatif webhook (Slide 33)
β
βββ tests/ # Pengujian Otomatis Terintegrasi (Vitest)
βββ auth.test.js # 5 Uji otentikasi dan penolakan token
βββ tasks.test.js # 11 Uji CRUD, BOLA, dan versioning
βββ security.test.js # 6 Uji kontrol input, CORS, dan health
βββ webhooks.test.js # 8 Uji HMAC, stale timestamp, dan dedup
- Node.js versi 20.x atau lebih baru (
node -v). - NPM versi 9.x atau lebih baru (
npm -v).
npm installnpm run seedPastikan seluruh 30 skenario uji lulus:
npm testnpm startServer akan aktif di http://127.0.0.1:3000.
Buka peramban (browser) Anda dan akses: π http://127.0.0.1:3000/playground
Selain melalui Web Playground, Anda dapat menguji seluruh skenario langsung dari terminal:
Buka jendela terminal baru saat server sedang berjalan:
npm run send:eventOutput yang diharapkan:
- Pengiriman ke-1:
HTTP 202 Accepted, { accepted: true, duplicate: false } - Pengiriman ke-2:
HTTP 202 Accepted, { accepted: true, duplicate: true }
npm run check:dbMencetak isi tabel inbox dan tabel effects secara langsung.
npm run test:negativeMenguji penolakan tanda tangan palsu (400), timestamp kedaluwarsa (400), event type salah (422), taskId bukan string (422), dan konflik hash ID sama (409).
- Silabus & Peta Modul
- Modul 01: Webhook & Kontrak TaskHub
- Modul 02: HMAC & Raw Body Verification
- Modul 03: At-Least-Once Delivery & Deduplikasi
- Modul 04: Durable Inbox & Background Worker
- Modul 05: Microservices Outbox & SAGA
- Modul 06: Vitest & Workflow 14 Langkah
- Modul 07: Observabilitas & Checklist Produksi
- Modul 08: Panduan Proyek & Rencana 30/60/90 Hari
- Modul 09: Kamus Kosakata & Glosarium Lengkap