lapeeh 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/.env.example +14 -0
  2. package/LICENSE +21 -0
  3. package/bin/index.js +934 -0
  4. package/doc/en/ARCHITECTURE_GUIDE.md +79 -0
  5. package/doc/en/CHANGELOG.md +203 -0
  6. package/doc/en/CHEATSHEET.md +90 -0
  7. package/doc/en/CLI.md +111 -0
  8. package/doc/en/CONTRIBUTING.md +119 -0
  9. package/doc/en/DEPLOYMENT.md +171 -0
  10. package/doc/en/FAQ.md +69 -0
  11. package/doc/en/FEATURES.md +99 -0
  12. package/doc/en/GETTING_STARTED.md +84 -0
  13. package/doc/en/INTRODUCTION.md +62 -0
  14. package/doc/en/PACKAGES.md +63 -0
  15. package/doc/en/PERFORMANCE.md +98 -0
  16. package/doc/en/ROADMAP.md +104 -0
  17. package/doc/en/SECURITY.md +95 -0
  18. package/doc/en/STRUCTURE.md +79 -0
  19. package/doc/en/TUTORIAL.md +145 -0
  20. package/doc/id/ARCHITECTURE_GUIDE.md +76 -0
  21. package/doc/id/CHANGELOG.md +203 -0
  22. package/doc/id/CHEATSHEET.md +90 -0
  23. package/doc/id/CLI.md +139 -0
  24. package/doc/id/CONTRIBUTING.md +119 -0
  25. package/doc/id/DEPLOYMENT.md +171 -0
  26. package/doc/id/FAQ.md +69 -0
  27. package/doc/id/FEATURES.md +169 -0
  28. package/doc/id/GETTING_STARTED.md +91 -0
  29. package/doc/id/INTRODUCTION.md +62 -0
  30. package/doc/id/PACKAGES.md +63 -0
  31. package/doc/id/PERFORMANCE.md +100 -0
  32. package/doc/id/ROADMAP.md +107 -0
  33. package/doc/id/SECURITY.md +94 -0
  34. package/doc/id/STRUCTURE.md +79 -0
  35. package/doc/id/TUTORIAL.md +145 -0
  36. package/docker-compose.yml +24 -0
  37. package/ecosystem.config.js +17 -0
  38. package/eslint.config.mjs +26 -0
  39. package/gitignore.template +30 -0
  40. package/lib/bootstrap.ts +210 -0
  41. package/lib/core/realtime.ts +34 -0
  42. package/lib/core/redis.ts +139 -0
  43. package/lib/core/serializer.ts +63 -0
  44. package/lib/core/server.ts +70 -0
  45. package/lib/core/store.ts +116 -0
  46. package/lib/middleware/auth.ts +63 -0
  47. package/lib/middleware/error.ts +50 -0
  48. package/lib/middleware/multipart.ts +13 -0
  49. package/lib/middleware/rateLimit.ts +14 -0
  50. package/lib/middleware/requestLogger.ts +27 -0
  51. package/lib/middleware/visitor.ts +178 -0
  52. package/lib/utils/logger.ts +100 -0
  53. package/lib/utils/pagination.ts +56 -0
  54. package/lib/utils/response.ts +88 -0
  55. package/lib/utils/validator.ts +394 -0
  56. package/nodemon.json +6 -0
  57. package/package.json +126 -0
  58. package/readme.md +357 -0
  59. package/scripts/check-update.js +92 -0
  60. package/scripts/config-clear.js +45 -0
  61. package/scripts/generate-jwt-secret.js +38 -0
  62. package/scripts/init-project.js +84 -0
  63. package/scripts/make-module.js +89 -0
  64. package/scripts/release.js +494 -0
  65. package/scripts/seed-json.js +158 -0
  66. package/scripts/verify-rbac-functional.js +187 -0
  67. package/src/config/app.ts +9 -0
  68. package/src/config/cors.ts +5 -0
  69. package/src/modules/Auth/auth.controller.ts +519 -0
  70. package/src/modules/Rbac/rbac.controller.ts +533 -0
  71. package/src/routes/auth.ts +74 -0
  72. package/src/routes/index.ts +7 -0
  73. package/src/routes/rbac.ts +42 -0
  74. package/storage/logs/.gitkeep +0 -0
  75. package/tsconfig.build.json +12 -0
  76. package/tsconfig.json +30 -0
@@ -0,0 +1,100 @@
1
+ # Panduan Performa & Skalabilitas lapeeh Framework
2
+
3
+ Dokumen ini menjelaskan cara memaksimalkan performa aplikasi lapeeh Anda menggunakan fitur-fitur canggih seperti Fast-Serialization dan Clustering.
4
+
5
+ ## 1. High Performance Serialization (Fastify-Style)
6
+
7
+ Express secara default menggunakan `JSON.stringify()` yang lambat karena harus memeriksa tipe data setiap field secara runtime. lapeeh mengadopsi teknik **Schema Based Serialization** (seperti Fastify) yang bisa meningkatkan throughput JSON hingga **2x-3x lipat**.
8
+
9
+ ### Cara Penggunaan
10
+
11
+ Gunakan `sendFastSuccess` di controller Anda untuk endpoint yang membutuhkan performa tinggi (misalnya: list data yang besar).
12
+
13
+ ```typescript
14
+ import { Request, Response } from "express";
15
+ import { getSerializer, createResponseSchema } from "../core/serializer";
16
+ import { sendFastSuccess } from "../utils/response";
17
+
18
+ // 1. Definisikan Schema Output (JSON Schema Standard)
19
+ const userSchema = {
20
+ type: "object",
21
+ properties: {
22
+ id: { type: "integer" },
23
+ name: { type: "string" },
24
+ email: { type: "string" },
25
+ // Password tidak dimasukkan, jadi otomatis tidak akan terkirim (aman!)
26
+ },
27
+ };
28
+
29
+ // 2. Compile Serializer (Otomatis dicache oleh framework)
30
+ const userListSerializer = getSerializer(
31
+ "user-list",
32
+ createResponseSchema({
33
+ type: "array",
34
+ items: userSchema,
35
+ })
36
+ );
37
+
38
+ export async function getUsers(req: Request, res: Response) {
39
+ // Contoh pengambilan data dari database
40
+ const users = await db.users.findMany();
41
+
42
+ // 3. Kirim response super cepat
43
+ return sendFastSuccess(res, 200, userListSerializer, {
44
+ status: "success",
45
+ message: "Data fetched",
46
+ data: users,
47
+ });
48
+ }
49
+ ```
50
+
51
+ ---
52
+
53
+ lapeeh dirancang untuk siap di-scale secara horizontal (menambah jumlah server, bukan memperbesar spesifikasi server).
54
+
55
+ ## 2. Horizontal Scaling (Load Balancer & Cluster)
56
+
57
+ Lapeeh dirancang untuk siap di-scale secara horizontal (menambah jumlah server, bukan memperbesar spesifikasi server).
58
+
59
+ - **App Instances**: Beberapa instance aplikasi lapeeh yang berjalan paralel.
60
+
61
+ - **Nginx**: Bertindak sebagai Load Balancer yang membagi trafik ke server-server aplikasi.
62
+ - **Redis**: Menyimpan Session, Rate Limit, dan Cache agar bisa diakses oleh semua server (Shared State).
63
+ - **App Instances**: Beberapa instance aplikasi Lapeeh yang berjalan paralel.
64
+
65
+ ### Cara Menjalankan Cluster (Docker)
66
+
67
+ Kami telah menyediakan konfigurasi siap pakai di `docker-compose.cluster.yml`.
68
+
69
+ 1. **Build & Run Cluster**:
70
+
71
+ ```bash
72
+ docker-compose -f docker-compose.cluster.yml up --build
73
+ ```
74
+
75
+ 2. **Akses Aplikasi**:
76
+ Buka `http://localhost:8080`.
77
+ Nginx akan otomatis membagi request Anda ke `app-1` atau `app-2`.
78
+
79
+ 3. **Cek Status**:
80
+ ```bash
81
+ docker-compose -f docker-compose.cluster.yml ps
82
+ ```
83
+
84
+ ### Konfigurasi Rate Limiter Terdistribusi
85
+
86
+ Middleware `src/middleware/rateLimit.ts` telah diupdate untuk menggunakan Redis Store.
87
+ Ini artinya jika User A terkena limit di Server 1, dia juga akan terblokir di Server 2.
88
+
89
+ ```typescript
90
+ // src/middleware/rateLimit.ts
91
+ store: redis ? new RedisStore({ sendCommand: ... }) : undefined
92
+ ```
93
+
94
+ ---
95
+
96
+ ## 3. Tips Optimasi Lainnya
97
+
98
+ - **Gunakan `.lean()` / Select**: Saat query database, selalu pilih field yang dibutuhkan saja.
99
+ - **Compression**: Aktifkan gzip/brotli di Nginx (sudah ada di config default Nginx umumnya).
100
+ - **Keep-Alive**: Gunakan koneksi database yang persistent (sudah dihandle oleh Prisma).
@@ -0,0 +1,107 @@
1
+ # Roadmap & Future Requests (Rencana Pengembangan)
2
+
3
+ Dokumen ini berisi daftar fitur yang direncanakan untuk membuat **lapeeh Framework** setara dengan framework backend enterprise lainnya (seperti NestJS, Laravel, atau Django).
4
+
5
+ Ini adalah **Undangan Terbuka** bagi para kontributor! Jika Anda tertarik mengerjakan salah satu fitur di bawah ini, silakan buat Issue/PR.
6
+
7
+ ---
8
+
9
+ ## 🏗️ Core & Architecture
10
+
11
+ ### 1. Dependency Injection (DI) Container
12
+
13
+ - **Konsep**: Saat ini lapeeh menggunakan pendekatan import langsung. Implementasi DI sederhana (seperti `InversifyJS` atau custom container) akan memudahkan unit testing dan decoupling.
14
+
15
+ * **Konsep**: Saat ini Lapeeh menggunakan pendekatan import langsung. Implementasi DI sederhana (seperti `InversifyJS` atau custom container) akan memudahkan unit testing dan decoupling.
16
+ * **Inspirasi**: NestJS Providers, Angular DI.
17
+
18
+ ### 2. Event Emitter (Pub/Sub)
19
+
20
+ - **Tujuan**: Decoupling logic antar modul.
21
+ - **Contoh**: Saat user register -> Emit event `UserRegistered` -> Listener `SendWelcomeEmail` & `CreateWallet` berjalan terpisah.
22
+ - **Status**: Belum ada (bisa pakai `eventemitter3`).
23
+
24
+ ### 3. API Documentation Generator (Swagger/OpenAPI)
25
+
26
+ - **Tujuan**: Auto-generate dokumentasi API interaktif.
27
+ - **Rencana**: Membaca file route dan validator schema, lalu men-generate spesifikasi Swagger UI secara otomatis di `/api/docs`.
28
+
29
+ ---
30
+
31
+ ## 🛠️ Fitur Enterprise (The "Missing" Parts)
32
+
33
+ ### 4. Job Queues & Background Workers
34
+
35
+ - **Tujuan**: Memproses tugas berat di background agar tidak memblokir HTTP request.
36
+ - **Teknologi**: Integrasi dengan **BullMQ** (Redis).
37
+ - **Fitur**:
38
+ - Decorators/Helpers untuk mendefinisikan Job.
39
+ - Dashboard monitoring job (seperti Horizon di Laravel).
40
+ - Retry mechanism & Failed job handling.
41
+
42
+ ### 5. Task Scheduling (Cron Jobs)
43
+
44
+ - **Tujuan**: Menjalankan tugas berkala (misal: "Kirim rekap email setiap jam 12 malam").
45
+ - **Rencana**: Wrapper di atas `node-cron` yang terintegrasi dengan struktur framework.
46
+ - **CLI**: `npm run schedule:run`.
47
+
48
+ ### 6. Storage Abstraction Layer
49
+
50
+ - **Tujuan**: Satu interface untuk upload file ke berbagai provider (Local, AWS S3, Google Cloud Storage, MinIO).
51
+ - **Konsep**:
52
+ ```typescript
53
+ // Tidak peduli drivernya apa, kodenya sama:
54
+ await Storage.disk("s3").put("avatars/1.jpg", fileBuffer);
55
+ ```
56
+
57
+ ### 7. Mailer Service
58
+
59
+ - **Tujuan**: Standarisasi pengiriman email.
60
+ - **Fitur**:
61
+ - Support SMTP, Mailgun, SES.
62
+ - Support Template Engine (Handlebars/EJS) untuk body email.
63
+ - Queue integration (kirim email di background).
64
+
65
+ ---
66
+
67
+ ## 🧪 Testing & Quality Assurance
68
+
69
+ ### 8. Native Testing Suite
70
+
71
+ - **Tujuan**: Memudahkan user menulis test.
72
+ - **Rencana**:
73
+ - Integrasi **Vitest** atau **Jest** pre-configured.
74
+ - Helper untuk HTTP Testing (supertest wrapper).
75
+ - Helper untuk Database Transaction (rollback setelah test selesai).
76
+ - Command: `npm run test`, `npm run make:test`.
77
+
78
+ ---
79
+
80
+ ## 🌐 Globalization & Security
81
+
82
+ ### 9. Localization (i18n)
83
+
84
+ - **Tujuan**: Mendukung respon API dalam berbagai bahasa.
85
+ - **Fitur**: Mendeteksi header `Accept-Language` dan mengembalikan pesan error/success sesuai bahasa user.
86
+
87
+ ### 10. API Versioning
88
+
89
+ - **Ide**: Saat menjalankan `npx lapeeh`, muncul menu interaktif untuk memilih fitur yang mau diinstall (pilih DB, pilih mau pakai Redis atau tidak, dll).
90
+
91
+ * **Tujuan**: Mendukung multiple versi API (v1, v2) tanpa merusak klien lama.
92
+ * **Rencana**: Routing strategy berbasis URL prefix (`/api/v1/...`) atau Header.
93
+
94
+ ---
95
+
96
+ ## 💻 CLI Enhancements
97
+
98
+ ### 11. Interactive CLI (TUI)
99
+
100
+ - **Tujuan**: Membuat CLI lebih user friendly.
101
+ - **Ide**: Saat menjalankan `npx @lapeeh/lapeeh`, muncul menu interaktif untuk memilih fitur yang mau diinstall (pilih DB, pilih mau pakai Redis atau tidak, dll).
102
+
103
+ ---
104
+
105
+ ## Tertarik Berkontribusi?
106
+
107
+ Pilih salah satu topik di atas, buat Issue di GitHub dengan judul `[Proposal] Nama Fitur`, dan mari kita diskusikan cara implementasinya! 🚀
@@ -0,0 +1,94 @@
1
+ # Security Best Practices (Panduan Keamanan)
2
+
3
+ Keamanan bukan fitur tambahan, melainkan prioritas utama. lapeeh Framework sudah dikonfigurasi dengan standar keamanan yang baik (Secure by Default), namun Anda tetap perlu memahami cara menjaga aplikasi tetap aman.
4
+
5
+ ## 1. Perlindungan Bawaan (Built-in Protection)
6
+
7
+ Secara default, lapeeh sudah mengaktifkan:
8
+
9
+ ### Helmet (HTTP Headers)
10
+
11
+ Mengamankan aplikasi dari serangan umum web vulnerabilities dengan mengatur HTTP headers yang tepat.
12
+
13
+ - **XSS Filter**: Aktif.
14
+ - **Frameguard**: Mencegah Clickjacking.
15
+ - **HSTS**: Memaksa browser menggunakan HTTPS (di production).
16
+
17
+ ### Rate Limiting
18
+
19
+ Mencegah serangan _Brute Force_ dan _DDoS_ sederhana.
20
+
21
+ - **Default**: 100 request per 15 menit per IP.
22
+ - **Lokasi Config**: `src/middleware/rateLimit.ts`.
23
+
24
+ ### CORS (Cross-Origin Resource Sharing)
25
+
26
+ Mengontrol domain mana yang boleh mengakses API Anda.
27
+
28
+ - **Lokasi Config**: `src/core/server.ts`.
29
+ - **Saran**: Di production, ubah `origin: "*"` menjadi domain frontend spesifik Anda (misal `origin: "https://frontend-anda.com"`).
30
+
31
+ ## 2. Praktik Terbaik Developer
32
+
33
+ Framework tidak bisa melindungi dari kode yang buruk. Berikut hal yang WAJIB Anda lakukan:
34
+
35
+ ### a. Validasi Input (Wajib!)
36
+
37
+ Jangan pernah mempercayai input user. Selalu gunakan `Validator`.
38
+
39
+ **❌ Tidak Aman (Raw Query):**
40
+
41
+ ```typescript
42
+ // Bahaya SQL Injection jika pakai raw query manual tanpa sanitasi
43
+ const user = await db.query(
44
+ `SELECT * FROM users WHERE email = '${req.body.email}'`
45
+ );
46
+ ```
47
+
48
+ **✅ Aman (Validator + Parameterized Query):**
49
+
50
+ ```typescript
51
+ const valid = await Validator.make(req.body, { email: "required|email" });
52
+ // Gunakan parameterized query atau ORM/Query Builder pilihan Anda
53
+ const user = await db.users.findOne({
54
+ where: { email: valid.validated().email },
55
+ });
56
+ ```
57
+
58
+ ### b. Manajemen Password
59
+
60
+ - **Hashing**: Jangan pernah simpan password plain text. Gunakan `bcryptjs` (sudah terintegrasi di AuthController).
61
+ - **Strength**: Validasi password minimal 8 karakter.
62
+ ```typescript
63
+ password: "required|string|min:8";
64
+ ```
65
+
66
+ ### c. JWT & Session
67
+
68
+ - **Secret Key**: Pastikan `JWT_SECRET` di `.env` adalah string acak yang panjang (32+ karakter).
69
+ - **Expiration**: Token akses (`ACCESS_TOKEN_EXPIRES_IN`) sebaiknya pendek (misal 15 menit - 1 jam). Gunakan Refresh Token (fitur roadmap) untuk sesi panjang.
70
+
71
+ ### d. Error Handling
72
+
73
+ Jangan pernah mengekspos detail error sistem (stack trace) ke user di Production.
74
+
75
+ **❌ Buruk:**
76
+
77
+ ```typescript
78
+ res.status(500).json({ error: err.message, stack: err.stack }); // Hacker bisa lihat struktur folder server
79
+ ```
80
+
81
+ **✅ Aman (lapeeh Default):**
82
+ lapeeh sudah menangani ini. Di mode `production`, error internal hanya akan menampilkan "Internal Server Error" tanpa detail sensitif.
83
+
84
+ ## 3. Checklist Sebelum Deploy
85
+
86
+ - [ ] Pastikan `NODE_ENV=production` di server.
87
+ - [ ] Ganti `JWT_SECRET` default dengan yang baru (`npm run generate:jwt`).
88
+ - [ ] Batasi CORS origin hanya ke domain frontend Anda.
89
+ - [ ] Pastikan database tidak bisa diakses publik (gunakan firewall/private IP).
90
+ - [ ] Gunakan HTTPS (SSL/TLS). API tanpa HTTPS sangat mudah disadap.
91
+
92
+ ## 4. Melaporkan Celah Keamanan
93
+
94
+ Jika Anda menemukan celah keamanan di framework ini, mohon **JANGAN** buat Issue publik. Kirim email langsung ke maintainer (lihat `package.json`) agar bisa diperbaiki (patched) sebelum diexploitasi orang jahat.
@@ -0,0 +1,79 @@
1
+ # 🏗️ Struktur Proyek
2
+
3
+ lapeeh Framework didesain agar **intuitif**. Kami memisahkan kode aplikasi Anda (_User Space_) dari mesin framework (_Core_), sehingga Anda bisa fokus membangun fitur tanpa terganggu kompleksitas sistem.
4
+
5
+ ## 🗺️ Peta Navigasi
6
+
7
+ Berikut adalah peta mental untuk memahami folder lapeeh:
8
+
9
+ | Folder | Ikon | Fungsi | Status |
10
+ | :------------- | :--: | :------------------------------------------------------------- | :---------------- |
11
+ | **`src/`** | 🏠 | **KODE APLIKASI ANDA**. Disini Anda bekerja setiap hari. | **Wajib Edit** |
12
+ | **`scripts/`** | 🤖 | **Asisten Otomatis**. Script untuk rilis, generate modul, dll. | **Boleh Edit** |
13
+ | **`bin/`** | 🚀 | **CLI Tools**. Entry point untuk perintah `npx lapeeh`. | **Jarang Edit** |
14
+ | **`lib/`** | ⚙️ | **Mesin Framework**. Core logic server & database. | **DILARANG Edit** |
15
+
16
+ ---
17
+
18
+ ## 1. 🏠 Folder `src/` (User Space)
19
+
20
+ Ini adalah "kandang" Anda. 99% kode fitur baru akan ditulis di sini.
21
+
22
+ ### `src/modules/` (Arsitektur Modular)
23
+
24
+ lapeeh menggunakan pendekatan **Modular**. Satu fitur = Satu folder.
25
+
26
+ - **Contoh**: Folder `src/modules/Auth/` berisi semua logika login/register.
27
+ - **Keuntungan**: Kode rapi, mudah dicari, dan mudah dihapus jika fitur tidak dipakai lagi.
28
+
29
+ ### `src/routes/`
30
+
31
+ Pintu gerbang API Anda.
32
+
33
+ - Mendefinisikan URL (misal: `/api/users`).
34
+ - Menghubungkan URL ke **Controller**.
35
+
36
+ ### `src/config/`
37
+
38
+ Pusat pengaturan aplikasi.
39
+
40
+ - `app.ts`: Konfigurasi global.
41
+ - `cors.ts`: Keamanan akses domain.
42
+
43
+ ---
44
+
45
+ ## 2. 🤖 Folder `scripts/` (Asisten Robot)
46
+
47
+ Jangan lakukan hal membosankan secara manual! lapeeh menyediakan robot di sini:
48
+
49
+ - **`release.js`**: **Super Script** untuk merilis versi baru.
50
+ - ✨ Otomatis bump versi (package.json).
51
+ - 📝 **Auto-Blog**: Membuat artikel rilis otomatis dari history Git Commit.
52
+ - 🔄 **Auto-Sync**: Sinkronisasi dokumentasi ke website.
53
+ - 🚀 Push ke Git & Publish ke NPM dalam satu perintah.
54
+ - **`make-module.js`**: Generator untuk membuat struktur folder module baru dalam sekejap.
55
+
56
+ ---
57
+
58
+ ## 3. 🚀 Folder `bin/` (CLI & Update)
59
+
60
+ Folder ini menangani perintah terminal `npx lapeeh`.
61
+
62
+ - Menyediakan fitur **Auto-Update Check** saat Anda menjalankan `npm run dev`.
63
+ - Menangani perintah `upgrade` untuk menyinkronkan proyek Anda dengan versi lapeeh terbaru tanpa merusak kode Anda.
64
+
65
+ ---
66
+
67
+ ## 4. ⚙️ Folder `lib/` (The Core)
68
+
69
+ "Ruang Mesin" lapeeh. Berisi setup Express, koneksi Database, Logger, dan Middleware dasar.
70
+
71
+ > ⚠️ **Peringatan**: Mengubah isi folder ini bisa membuat aplikasi sulit di-update ke versi lapeeh selanjutnya.
72
+
73
+ ---
74
+
75
+ ## 📄 File Penting Lainnya
76
+
77
+ - **`.env`**: **Kunci Rahasia**. Simpan password DB dan API Key disini. (Jangan di-upload ke Git!)
78
+ - **`package.json`**: Daftar "belanjaan" library proyek Anda.
79
+ - **`ecosystem.config.js`**: Siap deploy? File ini mengatur cara aplikasi berjalan di server production (VPS) menggunakan PM2.
@@ -0,0 +1,145 @@
1
+ # Tutorial: Membangun API Perpustakaan
2
+
3
+ Dalam tutorial ini, kita akan membangun fitur "Manajemen Buku" sederhana menggunakan semua fitur unggulan lapeeh Framework:
4
+
5
+ 1. **CLI** untuk generate kode.
6
+ 2. **Validator** untuk validasi input.
7
+ 3. **Fast Serialization** untuk respon cepat.
8
+
9
+ > **Catatan**: Tutorial ini menggunakan array in-memory untuk penyimpanan data agar tetap sederhana. lapeeh v3.0.0 bersifat database-agnostic, jadi Anda bebas menggantinya dengan Prisma, TypeORM, atau library database lainnya.
10
+
11
+ ## Langkah 1: Generate Module (Controller & Route)
12
+
13
+ Kita akan membuat controller dan route untuk fitur Buku.
14
+
15
+ ```bash
16
+ npm run make:module Book
17
+ ```
18
+
19
+ Framework akan membuat:
20
+
21
+ - `src/controllers/bookController.ts`
22
+ - `src/routes/book.ts`
23
+
24
+ ## Langkah 2: Implementasi Controller
25
+
26
+ Buka `src/controllers/bookController.ts` dan kita implementasikan fitur **Create** dan **List**.
27
+
28
+ ### Setup Import & Data Store
29
+
30
+ ```typescript
31
+ import { Request, Response } from "express";
32
+ import { sendFastSuccess, sendError } from "@/utils/response";
33
+ import { Validator } from "@/utils/validator";
34
+ import { getSerializer, createResponseSchema } from "@/core/serializer";
35
+
36
+ // Simpan data di memory (Array sederhana)
37
+ interface Book {
38
+ id: string;
39
+ title: string;
40
+ author: string;
41
+ isbn: string;
42
+ stock: number;
43
+ }
44
+ const books: Book[] = [];
45
+
46
+ // 1. Definisikan Schema Output (untuk Fastify Serialization)
47
+ const bookSchema = {
48
+ type: "object",
49
+ properties: {
50
+ id: { type: "string" },
51
+ title: { type: "string" },
52
+ author: { type: "string" },
53
+ isbn: { type: "string" },
54
+ stock: { type: "number" },
55
+ },
56
+ };
57
+
58
+ // 2. Buat Serializer
59
+ const bookDetailSerializer = getSerializer(
60
+ "book-detail",
61
+ createResponseSchema(bookSchema)
62
+ );
63
+ const bookListSerializer = getSerializer(
64
+ "book-list",
65
+ createResponseSchema({
66
+ type: "array",
67
+ items: bookSchema,
68
+ })
69
+ );
70
+ ```
71
+
72
+ ### Implementasi Create (dengan Validasi)
73
+
74
+ ```typescript
75
+ export async function createBook(req: Request, res: Response) {
76
+ // 1. Validasi Input
77
+ const validator = await Validator.make(req.body, {
78
+ title: "required|string|min:3",
79
+ author: "required|string",
80
+ isbn: "required|string",
81
+ stock: "required|number|min:1",
82
+ });
83
+
84
+ if (validator.fails()) {
85
+ return sendError(res, 400, "Validation Error", validator.errors());
86
+ }
87
+
88
+ // 2. Simpan Data (In-Memory)
89
+ const newBook: Book = {
90
+ id: Date.now().toString(),
91
+ ...validator.validated(),
92
+ };
93
+ books.push(newBook);
94
+
95
+ // 3. Kirim Response (Serialized)
96
+ return sendFastSuccess(res, bookDetailSerializer(newBook), 201);
97
+ }
98
+
99
+ export async function listBooks(req: Request, res: Response) {
100
+ // Return semua buku
101
+ return sendFastSuccess(res, bookListSerializer(books));
102
+ }
103
+ ```
104
+
105
+ ## Langkah 3: Register Route
106
+
107
+ Buka `src/routes/book.ts`. CLI sudah membuat struktur dasarnya. Kita hanya perlu menghubungkannya dengan fungsi controller kita.
108
+
109
+ ```typescript
110
+ import { Router } from "express";
111
+ import { createBook, listBooks } from "../controllers/bookController";
112
+
113
+ const router = Router();
114
+
115
+ router.post("/", createBook);
116
+ router.get("/", listBooks);
117
+
118
+ export default router;
119
+ ```
120
+
121
+ ## Langkah 4: Test API Anda
122
+
123
+ Jalankan server:
124
+
125
+ ```bash
126
+ npm run dev
127
+ ```
128
+
129
+ Test dengan curl atau Postman:
130
+
131
+ **Buat Buku Baru:**
132
+
133
+ ```bash
134
+ curl -X POST http://localhost:8000/api/book \
135
+ -H "Content-Type: application/json" \
136
+ -d '{"title":"Panduan lapeeh", "author":"Tim lapeeh", "isbn":"12345", "stock":10}'
137
+ ```
138
+
139
+ **List Buku:**
140
+
141
+ ```bash
142
+ curl http://localhost:8000/api/book
143
+ ```
144
+
145
+ Selamat! Anda telah membangun API yang cepat dan tervalidasi tanpa terjebak dalam konfigurasi database yang rumit.
@@ -0,0 +1,24 @@
1
+ version: "3.9"
2
+ services:
3
+ redis:
4
+ image: redis:7-alpine
5
+ command:
6
+ - "redis-server"
7
+ - "--appendonly"
8
+ - "yes"
9
+ - "--user"
10
+ - "default on >12341234 ~* +@all"
11
+ - "--user"
12
+ - "lapeeh on >12341234 ~* +@all"
13
+ ports:
14
+ - "6379:6379"
15
+ volumes:
16
+ - redis_data:/data
17
+ healthcheck:
18
+ test: ["CMD", "redis-cli", "ping"]
19
+ interval: 10s
20
+ timeout: 5s
21
+ retries: 5
22
+
23
+ volumes:
24
+ redis_data:
@@ -0,0 +1,17 @@
1
+ module.exports = {
2
+ apps: [{
3
+ name: "lapeeh-app",
4
+ script: "./node_modules/lapeeh/bin/index.js",
5
+ args: "start",
6
+ instances: "max",
7
+ exec_mode: "cluster",
8
+ watch: false,
9
+ max_memory_restart: '1G',
10
+ env: {
11
+ NODE_ENV: "production",
12
+ },
13
+ env_production: {
14
+ NODE_ENV: "production",
15
+ }
16
+ }]
17
+ };
@@ -0,0 +1,26 @@
1
+ import globals from "globals";
2
+ import pluginJs from "@eslint/js";
3
+ import tseslint from "typescript-eslint";
4
+
5
+ export default [
6
+ { files: ["**/*.{js,mjs,cjs,ts}"] },
7
+ { languageOptions: { globals: globals.node } },
8
+ pluginJs.configs.recommended,
9
+ ...tseslint.configs.recommended,
10
+ {
11
+ rules: {
12
+ "@typescript-eslint/no-unused-vars": [
13
+ "error",
14
+ {
15
+ "argsIgnorePattern": "^_",
16
+ "varsIgnorePattern": "^_",
17
+ "caughtErrorsIgnorePattern": "^_"
18
+ }
19
+ ],
20
+ "@typescript-eslint/no-explicit-any": "warn"
21
+ }
22
+ },
23
+ {
24
+ ignores: ["dist/", "node_modules/", "generated/", "scripts/"]
25
+ }
26
+ ];
@@ -0,0 +1,30 @@
1
+ # Node modules
2
+ node_modules
3
+ npm-debug.log
4
+ yarn-error.log
5
+ pnpm-lock.yaml
6
+
7
+ # Environment variables
8
+ .env
9
+ .env.local
10
+ .env.development
11
+ .env.test
12
+ .env.production
13
+
14
+ # Build output
15
+ dist
16
+ build
17
+ coverage
18
+
19
+ # IDEs
20
+ .vscode/sftp.json
21
+ .idea/
22
+ *.swp
23
+ *.swo
24
+ .DS_Store
25
+
26
+ # Logs
27
+ testing/*
28
+ # Logs
29
+ storage/logs/*
30
+ !storage/logs/.gitkeep