8000 GitHub - inii-man/API-Development-3 Β· GitHub
[go: up one dir, main page]

Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

πŸš€ TaskHub API Development - Training Hari 3

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.


🌟 Fitur Utama & Pembuktian Slide

  1. πŸ“¨ Webhook Receiver & Verifikasi HMAC (Slide 9 – 34):

    • Endpoint POST /webhooks/taskhub dengan pembacaan Buffer byte asli (express.raw({ limit: "64kb" })) sebelum parsing JSON (Slide 19 & 20).
    • Tanda tangan kriptografis HMAC-SHA256 dari timestamp.rawBody dengan perbandingan waktu-konstan crypto.timingSafeEqual anti-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).
  2. πŸ“₯ Pola Durable Inbox & Background Worker (Slide 17 – 27):

    • Menjamin prinsip "Jangan kirim 2xx sebelum tersimpan durabel ke database" (Slide 17).
    • Skema tabel inbox berpenegakan UNIQUE(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).
  3. πŸ”„ 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).
  4. πŸ§ͺ 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, dan tests/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).
  5. πŸ“Š Observabilitas & Kesiapan Produksi (Slide 53 – 58):

    • Structured Logging Pino tanpa kebocoran (Zero-Leak): Mencatat requestId, method, path tanpa query, status, dan latencyMs. Tidak pernah mencetak token, password, body, atau signature! (Slide 54).
    • Probe diagnostik orkestrator kontainer: /health/liveness dan /health/readiness (Slide 57).
    • Pengukuran latensi persentil p50, p95, p99, dan pemantauan backlog antrean inbox (Slide 52 & 55).
  6. 🎨 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.

πŸ›οΈ Diagram Arsitektur Sistem

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
Loading

πŸ“ Struktur Direktori Repository

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

⚑ Langkah Cepat Memulai (Quickstart)

1. Prasyarat Lingkungan

  • Node.js versi 20.x atau lebih baru (node -v).
  • NPM versi 9.x atau lebih baru (npm -v).

2. Instalasi Dependensi

npm install

3. Inisialisasi Basis Data Awal

npm run seed

4. Menjalankan Otomasi Pengujian (Vitest)

Pastikan seluruh 30 skenario uji lulus:

npm test

5. Menjalankan Server Aplikasi

npm start

Server akan aktif di http://127.0.0.1:3000.

6. Membuka Web Playground Interaktif

Buka peramban (browser) Anda dan akses: πŸ‘‰ http://127.0.0.1:3000/playground


πŸ§ͺ Panduan Pengujian Melalui Terminal CLI

Selain melalui Web Playground, Anda dapat menguji seluruh skenario langsung dari terminal:

A. Uji Pengiriman Event Bertanda Tangan 2 Kali (Slide 29 & 31)

Buka jendela terminal baru saat server sedang berjalan:

npm run send:event

Output yang diharapkan:

  • Pengiriman ke-1: HTTP 202 Accepted, { accepted: true, duplicate: false }
  • Pengiriman ke-2: HTTP 202 Accepted, { accepted: true, duplicate: true }

B. Inspeksi Basis Data SQLite (Slide 32)

npm run check:db

Mencetak isi tabel inbox dan tabel effects secara langsung.

C. Menjalankan 5 Uji Negatif Webhook (Slide 33)

npm run test:negative

Menguji penolakan tanda tangan palsu (400), timestamp kedaluwarsa (400), event type salah (422), taskId bukan string (422), dan konflik hash ID sama (409).


πŸ“š Akses Cepat Modul Pembelajaran

  • 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

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

0