lapeh 2.2.2 → 2.2.3

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.
@@ -0,0 +1,108 @@
1
+ # Getting Started with Lapeh Framework
2
+
3
+ Selamat datang di dokumentasi resmi **Lapeh Framework**. Panduan ini akan membantu Anda memulai instalasi, konfigurasi, dan pemahaman dasar tentang struktur proyek.
4
+
5
+ ## Persyaratan Sistem
6
+
7
+ Sebelum memulai, pastikan sistem Anda memenuhi persyaratan berikut:
8
+
9
+ - **Node.js**: Versi 18.x atau lebih baru.
10
+ - **Database**: PostgreSQL (Recommended) atau MySQL/MariaDB.
11
+ - **Package Manager**: NPM (bawaan Node.js).
12
+
13
+ ## Instalasi
14
+
15
+ Cara termudah untuk memulai adalah menggunakan CLI generator `npx`.
16
+
17
+ ### 1. Buat Project Baru
18
+
19
+ Jalankan perintah berikut di terminal Anda:
20
+
21
+ ```bash
22
+ npx lapeh@latest nama-project-anda
23
+ ```
24
+
25
+ Atau untuk setup lengkap (dengan data dummy user & role):
26
+
27
+ ```bash
28
+ npx lapeh@latest nama-project-anda --full
29
+ ```
30
+
31
+ ### 2. Setup Awal
32
+
33
+ Setelah project dibuat, masuk ke direktori project dan jalankan setup wizard:
34
+
35
+ ```bash
36
+ cd nama-project-anda
37
+ npm run first
38
+ ```
39
+
40
+ Script ini akan melakukan hal-hal berikut secara otomatis:
41
+
42
+ 1. Menyalin `.env.example` ke `.env`.
43
+ 2. Menginstall semua dependency (`npm install`).
44
+ 3. Membuat **JWT Secret** yang aman.
45
+ 4. Menjalankan migrasi database (membuat tabel).
46
+ 5. Menjalankan seeder (mengisi data awal).
47
+
48
+ ### 3. Jalankan Server Development
49
+
50
+ ```bash
51
+ npm run dev
52
+ ```
53
+
54
+ Server akan berjalan di `http://localhost:4000` (atau port yang Anda tentukan di `.env`).
55
+
56
+ ## Struktur Direktori
57
+
58
+ Berikut adalah struktur folder standar Lapeh Framework:
59
+
60
+ ```
61
+ my-app/
62
+ ├── bin/ # Script CLI untuk npx
63
+ ├── doc/ # Dokumentasi proyek
64
+ ├── prisma/ # Konfigurasi Database & Schema
65
+ │ ├── migrations/ # File history migrasi database
66
+ │ ├── base.prisma.template # Template konfigurasi database
67
+ │ ├── schema.prisma # File schema gabungan (Auto-generated)
68
+ │ └── seed.ts # Script untuk mengisi data awal
69
+ ├── scripts/ # Script utility (Generator, Compiler)
70
+ ├── src/ # Source code utama aplikasi
71
+ │ ├── controllers/ # Logika bisnis (Handler request)
72
+ │ ├── core/ # Konfigurasi inti (DB, Redis, Server)
73
+ │ ├── middleware/ # Middleware Express (Auth, RateLimit)
74
+ │ ├── models/ # Definisi Schema Prisma per-fitur
75
+ │ ├── routes/ # Definisi routing API
76
+ │ ├── utils/ # Helper function (Response, Validator)
77
+ │ └── index.ts # Entry point aplikasi
78
+ ├── .env # Variabel lingkungan (Rahasia)
79
+ ├── package.json # Dependensi & Script NPM
80
+ └── tsconfig.json # Konfigurasi TypeScript
81
+ ```
82
+
83
+ ## Konfigurasi Environment (.env)
84
+
85
+ File `.env` menyimpan konfigurasi penting. Berikut adalah variabel kunci:
86
+
87
+ ```ini
88
+ # Server
89
+ PORT=4000
90
+ NODE_ENV=development
91
+
92
+ # Database (Ganti sesuai kredensial Anda)
93
+ DATABASE_URL="postgresql://user:password@localhost:5432/mydb?schema=public"
94
+
95
+ # Security
96
+ JWT_SECRET="rahasia-super-panjang-dan-acak"
97
+ ACCESS_TOKEN_EXPIRES_IN=3600 # 1 jam
98
+
99
+ # Redis (Opsional - otomatis mock jika tidak ada)
100
+ REDIS_URL="redis://localhost:6379"
101
+ NO_REDIS=false # Set true untuk memaksa mode mock
102
+ ```
103
+
104
+ ## Langkah Selanjutnya
105
+
106
+ - Pelajari cara menggunakan **[CLI Tools](CLI.md)** untuk mempercepat development.
107
+ - Pahami **[Fitur & Konsep Inti](FEATURES.md)** framework.
108
+ - Ikuti **[Tutorial Studi Kasus](TUTORIAL.md)** untuk membangun fitur nyata.
@@ -0,0 +1,60 @@
1
+ # Pengenalan Lapeh Framework
2
+
3
+ ## Apa itu Lapeh?
4
+
5
+ **Lapeh** adalah framework Backend untuk Node.js yang dibangun di atas **Express** dan **TypeScript**.
6
+
7
+ Jika Anda pernah menggunakan **Laravel** (PHP) atau **NestJS** (Node.js), Anda akan merasa sangat familiar. Lapeh mengambil filosofi kemudahan & struktur rapi dari Laravel, namun tetap mempertahankan fleksibilitas dan kecepatan Express.
8
+
9
+ Nama "Lapeh" diambil dari bahasa Minang yang berarti "Lepas" atau "Bebas", melambangkan kebebasan developer untuk membangun aplikasi dengan cepat tanpa terbebani konfigurasi yang rumit.
10
+
11
+ ## Mengapa Lapeh Dibuat?
12
+
13
+ Di ekosistem Node.js, developer sering mengalami "Decision Fatigue" (Kelelahan memilih):
14
+ - "Pakai ORM apa? Prisma, TypeORM, atau Drizzle?"
15
+ - "Validasi pakai Joi, Zod, atau express-validator?"
16
+ - "Struktur foldernya gimana? MVC? Clean Architecture?"
17
+ - "Auth-nya gimana?"
18
+
19
+ Lapeh menjawab semua itu dengan **Opinionated Defaults**:
20
+ 1. **ORM**: Prisma (Standar industri saat ini).
21
+ 2. **Validasi**: Zod (dengan wrapper syntax ala Laravel).
22
+ 3. **Struktur**: MVC Modular (Controller, Model, Route terpisah tapi kohesif).
23
+ 4. **Auth**: JWT + RBAC (Role Based Access Control) siap pakai.
24
+
25
+ ## Perbandingan dengan Framework Lain
26
+
27
+ | Fitur | Express (Raw) | NestJS | Lapeh Framework |
28
+ | :--- | :--- | :--- | :--- |
29
+ | **Learning Curve** | Rendah (tapi bingung struktur) | Tinggi (Angular-style, Decorators) | **Sedang** (Express + Struktur Jelas) |
30
+ | **Boilerplate** | Kosong | Sangat Banyak | **Pas (Ready to use)** |
31
+ | **Type Safety** | Manual | Strict | **Strict (TypeScript Native)** |
32
+ | **Kecepatan Dev** | Lambat (setup manual) | Sedang | **Cepat (CLI Generator)** |
33
+ | **Fleksibilitas** | Sangat Tinggi | Kaku | **Tinggi** |
34
+
35
+ ## Filosofi "The Lapeh Way"
36
+
37
+ 1. **Developer Experience (DX) First**: CLI tools, error message yang jelas, dan hot-reload adalah prioritas.
38
+ 2. **Performance by Default**: Serialisasi JSON cepat (Fastify-style) dan Redis caching terintegrasi.
39
+ 3. **Explicit is Better than Implicit**: Tidak ada "sihir" yang terlalu gelap. Kode controller Anda adalah kode Express biasa yang Anda mengerti.
40
+ 4. **Production Ready**: Security (Helmet, Rate Limit) dan Scalability (Docker, Cluster) bukan pikiran belakangan, tapi bawaan.
41
+
42
+ ## Siklus Hidup Request (Request Lifecycle)
43
+
44
+ Bagaimana Lapeh menangani satu permintaan dari user?
45
+
46
+ 1. **Request Masuk** (`GET /api/users`)
47
+ 2. **Security Middleware**: Helmet (Headers), CORS, Rate Limiter.
48
+ 3. **Global Middleware**: Request Logger, Body Parser (JSON).
49
+ 4. **Routing**: Mencocokkan URL di `src/routes/`.
50
+ 5. **Auth Middleware** (Opsional): Cek token JWT & Role.
51
+ 6. **Validator** (Opsional): Validasi input body/query.
52
+ 7. **Controller**: Logika bisnis utama dijalankan.
53
+ - Panggil Database (Prisma).
54
+ - Panggil Cache (Redis).
55
+ 8. **Serializer**: Data diformat & disanitasi (misal: hide password).
56
+ 9. **Response**: JSON dikirim kembali ke user.
57
+
58
+ ---
59
+
60
+ **Selanjutnya:** Pelajari struktur folder di [Struktur Proyek](STRUCTURE.md).
@@ -0,0 +1,66 @@
1
+ # Referensi Package & Dependencies
2
+
3
+ Dokumen ini menjelaskan fungsi dari setiap library (package) yang terinstall di Lapeh Framework, sehingga Anda mengerti kegunaan "alat-alat" yang ada di dalam kotak peralatan Anda.
4
+
5
+ ## Core Framework (Fondasi)
6
+
7
+ Package-package ini adalah nyawa dari framework ini.
8
+
9
+ | Package | Deskripsi | Kenapa Kita Pakai? |
10
+ | :--- | :--- | :--- |
11
+ | **`express`** | Web Framework untuk Node.js. | Standar industri, ringan, dan komunitasnya terbesar. |
12
+ | **`dotenv`** | Memuat variabel dari file `.env`. | Agar konfigurasi rahasia (DB password, API Key) tidak di-hardcode. |
13
+ | **`cors`** | Cross-Origin Resource Sharing. | Mengizinkan frontend (React/Vue) dari domain berbeda untuk mengakses API kita. |
14
+ | **`helmet`** | Middleware keamanan HTTP headers. | Melindungi aplikasi dari serangan umum (XSS, Clickjacking) dengan mengatur header HTTP secara otomatis. |
15
+
16
+ ## Database & ORM
17
+
18
+ | Package | Deskripsi | Kenapa Kita Pakai? |
19
+ | :--- | :--- | :--- |
20
+ | **`@prisma/client`** | Query builder & ORM. | Type-safe query database. Autocomplete-nya sangat membantu developer. |
21
+ | **`pg`** | Driver PostgreSQL. | Driver native untuk koneksi ke database Postgres. |
22
+ | **`@prisma/adapter-*`** | Adapter serverless. | (Opsional) Persiapan untuk deployment ke environment serverless (seperti Vercel/Neon). |
23
+
24
+ ## Authentication & Security
25
+
26
+ | Package | Deskripsi | Kenapa Kita Pakai? |
27
+ | :--- | :--- | :--- |
28
+ | **`jsonwebtoken`** | Implementasi JWT. | Standar token untuk autentikasi stateless (API). |
29
+ | **`bcryptjs`** | Hashing password. | Mengamankan password user di database (satu arah). |
30
+ | **`express-rate-limit`** | Pembatas request. | Mencegah serangan DDoS ringan atau Brute Force login. |
31
+
32
+ ## Utilities & Helper
33
+
34
+ | Package | Deskripsi | Kenapa Kita Pakai? |
35
+ | :--- | :--- | :--- |
36
+ | **`zod`** | Schema validation library. | Memvalidasi input user (req.body) dengan syntax yang kuat dan mudah dibaca. |
37
+ | **`fast-json-stringify`** | Serializer JSON cepat. | Mengubah object ke JSON string 2x-3x lebih cepat dari `JSON.stringify` bawaan. |
38
+ | **`uuid`** | Generator ID unik. | Membuat string acak unik (UUID v4). |
39
+ | **`slugify`** | String formatter. | Mengubah "Judul Artikel Keren" menjadi `judul-artikel-keren` (URL friendly). |
40
+ | **`multer`** | Middleware upload file. | Menangani `multipart/form-data` untuk upload gambar/dokumen. |
41
+ | **`winston`** | Logger library. | Mencatat log aplikasi (error/info) ke file atau console dengan format rapi. |
42
+
43
+ ## Realtime & Caching
44
+
45
+ | Package | Deskripsi | Kenapa Kita Pakai? |
46
+ | :--- | :--- | :--- |
47
+ | **`socket.io`** | Library WebSocket. | Fitur komunikasi real-time dua arah (chat, notifikasi live). |
48
+ | **`ioredis`** | Client Redis yang robust. | Driver terbaik untuk Redis di Node.js. |
49
+ | **`ioredis-mock`** | Simulasi Redis di memori. | Memungkinkan development tanpa perlu install Redis server asli (sangat berguna untuk pemula). |
50
+
51
+ ## Development Tools (DevDependencies)
52
+
53
+ Package ini hanya dipakai saat koding, tidak ikut terinstall di server production.
54
+
55
+ | Package | Deskripsi | Fungsi |
56
+ | :--- | :--- | :--- |
57
+ | **`typescript`** | Compiler TS. | Mengubah kode `.ts` menjadi `.js`. |
58
+ | **`nodemon`** | Auto-restarter. | Restart server otomatis setiap kita save file. |
59
+ | **`eslint`** | Linter (Polisi Kode). | Mencari potensi error dan variabel yang tidak terpakai. |
60
+ | **`@types/*`** | Definisi Tipe. | Memberikan intellisense (saran kode) untuk library JavaScript biasa. |
61
+ | **`prisma`** | Prisma CLI. | Alat untuk migrasi database (`prisma migrate`) dan generate client. |
62
+ | **`tsc-alias`** | Path resolver. | Mengubah alias `@/core` menjadi path relatif `../core` saat build production. |
63
+
64
+ ---
65
+
66
+ Dengan memahami daftar ini, Anda tahu persis apa yang terjadi di balik layar aplikasi Anda. Tidak ada "Bloatware", setiap package punya tujuan spesifik.
package/doc/ROADMAP.md ADDED
@@ -0,0 +1,93 @@
1
+ # Roadmap & Future Requests (Rencana Pengembangan)
2
+
3
+ Dokumen ini berisi daftar fitur yang direncanakan untuk membuat **Lapeh 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
+ * **Tujuan**: Membuat kode lebih testable dan modular.
13
+ * **Konsep**: Saat ini Lapeh menggunakan pendekatan import langsung. Implementasi DI sederhana (seperti `InversifyJS` atau custom container) akan memudahkan unit testing dan decoupling.
14
+ * **Inspirasi**: NestJS Providers, Angular DI.
15
+
16
+ ### 2. Event Emitter (Pub/Sub)
17
+ * **Tujuan**: Decoupling logic antar modul.
18
+ * **Contoh**: Saat user register -> Emit event `UserRegistered` -> Listener `SendWelcomeEmail` & `CreateWallet` berjalan terpisah.
19
+ * **Status**: Belum ada (bisa pakai `eventemitter3`).
20
+
21
+ ### 3. API Documentation Generator (Swagger/OpenAPI)
22
+ * **Tujuan**: Auto-generate dokumentasi API interaktif.
23
+ * **Rencana**: Membaca file route dan validator schema, lalu men-generate spesifikasi Swagger UI secara otomatis di `/api/docs`.
24
+
25
+ ---
26
+
27
+ ## 🛠️ Fitur Enterprise (The "Missing" Parts)
28
+
29
+ ### 4. Job Queues & Background Workers
30
+ * **Tujuan**: Memproses tugas berat di background agar tidak memblokir HTTP request.
31
+ * **Teknologi**: Integrasi dengan **BullMQ** (Redis).
32
+ * **Fitur**:
33
+ * Decorators/Helpers untuk mendefinisikan Job.
34
+ * Dashboard monitoring job (seperti Horizon di Laravel).
35
+ * Retry mechanism & Failed job handling.
36
+
37
+ ### 5. Task Scheduling (Cron Jobs)
38
+ * **Tujuan**: Menjalankan tugas berkala (misal: "Kirim rekap email setiap jam 12 malam").
39
+ * **Rencana**: Wrapper di atas `node-cron` yang terintegrasi dengan struktur framework.
40
+ * **CLI**: `npm run schedule:run`.
41
+
42
+ ### 6. Storage Abstraction Layer
43
+ * **Tujuan**: Satu interface untuk upload file ke berbagai provider (Local, AWS S3, Google Cloud Storage, MinIO).
44
+ * **Konsep**:
45
+ ```typescript
46
+ // Tidak peduli drivernya apa, kodenya sama:
47
+ await Storage.disk('s3').put('avatars/1.jpg', fileBuffer);
48
+ ```
49
+
50
+ ### 7. Mailer Service
51
+ * **Tujuan**: Standarisasi pengiriman email.
52
+ * **Fitur**:
53
+ * Support SMTP, Mailgun, SES.
54
+ * Support Template Engine (Handlebars/EJS) untuk body email.
55
+ * Queue integration (kirim email di background).
56
+
57
+ ---
58
+
59
+ ## 🧪 Testing & Quality Assurance
60
+
61
+ ### 8. Native Testing Suite
62
+ * **Tujuan**: Memudahkan user menulis test.
63
+ * **Rencana**:
64
+ * Integrasi **Vitest** atau **Jest** pre-configured.
65
+ * Helper untuk HTTP Testing (supertest wrapper).
66
+ * Helper untuk Database Transaction (rollback setelah test selesai).
67
+ * Command: `npm run test`, `npm run make:test`.
68
+
69
+ ---
70
+
71
+ ## 🌐 Globalization & Security
72
+
73
+ ### 9. Localization (i18n)
74
+ * **Tujuan**: Mendukung respon API dalam berbagai bahasa.
75
+ * **Fitur**: Mendeteksi header `Accept-Language` dan mengembalikan pesan error/success sesuai bahasa user.
76
+
77
+ ### 10. API Versioning
78
+ * **Tujuan**: Mendukung multiple versi API (v1, v2) tanpa merusak klien lama.
79
+ * **Rencana**: Routing strategy berbasis URL prefix (`/api/v1/...`) atau Header.
80
+
81
+ ---
82
+
83
+ ## 💻 CLI Enhancements
84
+
85
+ ### 11. Interactive CLI (TUI)
86
+ * **Tujuan**: Membuat CLI lebih user friendly.
87
+ * **Ide**: Saat menjalankan `npx lapeh`, muncul menu interaktif untuk memilih fitur yang mau diinstall (pilih DB, pilih mau pakai Redis atau tidak, dll).
88
+
89
+ ---
90
+
91
+ ## Tertarik Berkontribusi?
92
+
93
+ Pilih salah satu topik di atas, buat Issue di GitHub dengan judul `[Proposal] Nama Fitur`, dan mari kita diskusikan cara implementasinya! 🚀
@@ -0,0 +1,93 @@
1
+ # Security Best Practices (Panduan Keamanan)
2
+
3
+ Keamanan bukan fitur tambahan, melainkan prioritas utama. Lapeh 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, Lapeh 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 (walau Prisma aman, tetap hati-hati)
43
+ const user =
44
+ await prisma.$queryRaw`SELECT * FROM users WHERE email = ${req.body.email}`;
45
+ ```
46
+
47
+ **✅ Aman (Validator + Prisma Client):**
48
+
49
+ ```typescript
50
+ const valid = await Validator.make(req.body, { email: "required|email" });
51
+ // Prisma Client otomatis sanitize input
52
+ const user = await prisma.user.findUnique({
53
+ where: { email: valid.validated().email },
54
+ });
55
+ ```
56
+
57
+ ### b. Manajemen Password
58
+
59
+ - **Hashing**: Jangan pernah simpan password plain text. Gunakan `bcryptjs` (sudah terintegrasi di AuthController).
60
+ - **Strength**: Validasi password minimal 8 karakter.
61
+ ```typescript
62
+ password: "required|string|min:8";
63
+ ```
64
+
65
+ ### c. JWT & Session
66
+
67
+ - **Secret Key**: Pastikan `JWT_SECRET` di `.env` adalah string acak yang panjang (32+ karakter).
68
+ - **Expiration**: Token akses (`ACCESS_TOKEN_EXPIRES_IN`) sebaiknya pendek (misal 15 menit - 1 jam). Gunakan Refresh Token (fitur roadmap) untuk sesi panjang.
69
+
70
+ ### d. Error Handling
71
+
72
+ Jangan pernah mengekspos detail error sistem (stack trace) ke user di Production.
73
+
74
+ **❌ Buruk:**
75
+
76
+ ```typescript
77
+ res.status(500).json({ error: err.message, stack: err.stack }); // Hacker bisa lihat struktur folder server
78
+ ```
79
+
80
+ **✅ Aman (Lapeh Default):**
81
+ Lapeh sudah menangani ini. Di mode `production`, error internal hanya akan menampilkan "Internal Server Error" tanpa detail sensitif.
82
+
83
+ ## 3. Checklist Sebelum Deploy
84
+
85
+ - [ ] Pastikan `NODE_ENV=production` di server.
86
+ - [ ] Ganti `JWT_SECRET` default dengan yang baru (`npm run generate:jwt`).
87
+ - [ ] Batasi CORS origin hanya ke domain frontend Anda.
88
+ - [ ] Pastikan database tidak bisa diakses publik (gunakan firewall/private IP).
89
+ - [ ] Gunakan HTTPS (SSL/TLS). API tanpa HTTPS sangat mudah disadap.
90
+
91
+ ## 4. Melaporkan Celah Keamanan
92
+
93
+ 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,72 @@
1
+ # Bedah Struktur Proyek
2
+
3
+ Untuk memahami Lapeh Framework sepenuhnya, Anda perlu tahu apa fungsi setiap file dan folder. Berikut adalah "Tour" lengkap ke dalam direktori proyek.
4
+
5
+ ## Root Directory
6
+
7
+ | File/Folder | Deskripsi |
8
+ | :--- | :--- |
9
+ | `bin/` | Berisi script eksekusi untuk CLI (`npx lapeh`). Anda jarang menyentuh ini. |
10
+ | `doc/` | Dokumentasi proyek ini berada. |
11
+ | `prisma/` | Jantung konfigurasi Database. |
12
+ | `scripts/` | Kumpulan script Node.js untuk utility (generator, compiler schema, dll). |
13
+ | `src/` | **Source Code Utama**. 99% kodingan Anda ada di sini. |
14
+ | `.env` | Variabel rahasia (Database URL, API Keys). **Jangan commit file ini ke Git!** |
15
+ | `docker-compose.yml` | Konfigurasi Docker untuk menjalankan Database & Redis lokal. |
16
+ | `nodemon.json` | Konfigurasi auto-restart saat development. |
17
+ | `package.json` | Daftar library (dependencies) dan perintah (`npm run ...`). |
18
+ | `tsconfig.json` | Konfigurasi TypeScript. |
19
+
20
+ ## Folder `src/` (Source Code)
21
+
22
+ Ini adalah tempat Anda bekerja setiap hari.
23
+
24
+ ### `src/controllers/`
25
+ Berisi logika aplikasi. Controller menerima Request, memprosesnya, dan mengembalikan Response.
26
+ - **Contoh**: `authController.ts` menangani login/register.
27
+ - **Tips**: Jangan taruh *business logic* yang terlalu kompleks di sini. Gunakan Service (opsional) jika controller sudah terlalu gemuk.
28
+
29
+ ### `src/models/`
30
+ Berisi definisi tabel database (Schema Prisma).
31
+ - **Unik di Lapeh**: Kami memecah `schema.prisma` yang besar menjadi file-file kecil per fitur (misal `user.prisma`, `product.prisma`) agar mudah di-manage. Script `prisma:migrate` akan menggabungkannya nanti.
32
+
33
+ ### `src/routes/`
34
+ Mendefinisikan URL endpoint.
35
+ - Menghubungkan URL (misal `/api/login`) ke fungsi di Controller.
36
+ - Menempelkan Middleware (misal `requireAuth`).
37
+
38
+ ### `src/middleware/`
39
+ Kode yang berjalan *sebelum* Controller.
40
+ - `auth.ts`: Cek JWT Token.
41
+ - `rateLimit.ts`: Batasi jumlah request.
42
+ - `requestLogger.ts`: Log setiap request yang masuk.
43
+
44
+ ### `src/utils/`
45
+ Fungsi bantuan (Helper) yang bisa dipakai di mana saja.
46
+ - `validator.ts`: Validasi input ala Laravel.
47
+ - `response.ts`: Standar format JSON response (`sendSuccess`, `sendError`).
48
+ - `logger.ts`: Sistem logging (Winston).
49
+
50
+ ### `src/core/`
51
+ Bagian "Mesin" framework. Anda jarang perlu mengubah ini kecuali ingin memodifikasi behavior dasar framework.
52
+ - `server.ts`: Setup Express App.
53
+ - `database.ts`: Instance Prisma Client.
54
+ - `redis.ts`: Koneksi Redis.
55
+ - `serializer.ts`: Logic caching JSON Schema.
56
+
57
+ ## Folder `prisma/`
58
+
59
+ - `migrations/`: History perubahan database (SQL file). Jangan diedit manual.
60
+ - `base.prisma.template`: Header dari schema database (berisi konfigurasi datasource db).
61
+ - `seed.ts`: Script untuk mengisi data awal (Data Seeding).
62
+
63
+ ## Folder `scripts/`
64
+
65
+ Script-script "Magic" yang dijalankan `npm run`.
66
+ - `make-controller.js`: Generator controller.
67
+ - `compile-schema.js`: Penggabung file `.prisma`.
68
+ - `init-project.js`: Wizard setup awal.
69
+
70
+ ---
71
+
72
+ Dengan memahami struktur ini, Anda tidak akan tersesat saat ingin menambah fitur baru atau mencari bug.
@@ -0,0 +1,192 @@
1
+ # Tutorial: Membangun API Perpustakaan
2
+
3
+ Dalam tutorial ini, kita akan membangun fitur "Manajemen Buku" sederhana menggunakan semua fitur unggulan Lapeh Framework:
4
+ 1. **CLI** untuk generate kode.
5
+ 2. **Validator** untuk validasi input.
6
+ 3. **Fast Serialization** untuk respon cepat.
7
+ 4. **RBAC** untuk proteksi delete (Admin only).
8
+
9
+ ## Langkah 1: Generate Model Database
10
+
11
+ Kita butuh tabel `books`. Gunakan CLI `make:model`.
12
+
13
+ ```bash
14
+ npm run make:model Book
15
+ ```
16
+
17
+ File baru akan muncul di `src/models/book.prisma`. Edit file tersebut:
18
+
19
+ ```prisma
20
+ // src/models/book.prisma
21
+
22
+ model Book {
23
+ id BigInt @id @default(autoincrement())
24
+ title String
25
+ author String
26
+ isbn String @unique
27
+ publishedAt DateTime
28
+ stock Int @default(0)
29
+ created_at DateTime @default(now())
30
+ updated_at DateTime @updatedAt
31
+
32
+ @@map("books")
33
+ }
34
+ ```
35
+
36
+ Terapkan perubahan ke database:
37
+
38
+ ```bash
39
+ npm run prisma:migrate
40
+ ```
41
+
42
+ ## Langkah 2: Generate Module (Controller & Route)
43
+
44
+ Kita buat controller dan route sekaligus.
45
+
46
+ ```bash
47
+ npm run make:module Book
48
+ ```
49
+
50
+ Framework akan membuat:
51
+ - `src/controllers/bookController.ts`
52
+ - `src/routes/book.ts`
53
+
54
+ ## Langkah 3: Implementasi Controller
55
+
56
+ Buka `src/controllers/bookController.ts` dan kita implementasikan fitur **Create** dan **List** dengan standar framework.
57
+
58
+ ### Setup Import & Serializer
59
+
60
+ ```typescript
61
+ import { Request, Response } from "express";
62
+ import { prisma } from "@/core/database";
63
+ import { sendFastSuccess, sendError } from "@/utils/response";
64
+ import { Validator } from "@/utils/validator";
65
+ import { getSerializer, createResponseSchema } from "@/core/serializer";
66
+
67
+ // 1. Definisikan Schema Output (untuk Fastify Serialization)
68
+ const bookSchema = {
69
+ type: "object",
70
+ properties: {
71
+ id: { type: "string" }, // BigInt -> String
72
+ title: { type: "string" },
73
+ author: { type: "string" },
74
+ isbn: { type: "string" },
75
+ stock: { type: "number" }
76
+ }
77
+ };
78
+
79
+ // 2. Buat Serializer
80
+ const bookDetailSerializer = getSerializer("book-detail", createResponseSchema(bookSchema));
81
+ const bookListSerializer = getSerializer("book-list", createResponseSchema({
82
+ type: "array",
83
+ items: bookSchema
84
+ }));
85
+ ```
86
+
87
+ ### Implementasi Create (dengan Validasi)
88
+
89
+ ```typescript
90
+ export async function createBook(req: Request, res: Response) {
91
+ // 1. Validasi Input
92
+ const validator = await Validator.make(req.body, {
93
+ title: "required|string|min:3",
94
+ author: "required|string",
95
+ isbn: "required|string|unique:books,isbn", // Cek unik di tabel books
96
+ stock: "required|number|min:1",
97
+ publishedAt: "required|string" // Format tanggal ISO
98
+ });
99
+
100
+ if (validator.fails()) {
101
+ return sendError(res, 400, "Validation Error", validator.errors());
102
+ }
103
+
104
+ const data = validator.validated();
105
+
106
+ // 2. Simpan ke Database
107
+ const book = await prisma.book.create({
108
+ data: {
109
+ title: data.title,
110
+ author: data.author,
111
+ isbn: data.isbn,
112
+ stock: data.stock,
113
+ publishedAt: new Date(data.publishedAt)
114
+ }
115
+ });
116
+
117
+ // 3. Return Response Cepat
118
+ return sendFastSuccess(res, 201, bookDetailSerializer, {
119
+ status: "success",
120
+ message: "Buku berhasil ditambahkan",
121
+ data: { ...book, id: book.id.toString() } // Konversi BigInt manual jika perlu
122
+ });
123
+ }
124
+ ```
125
+
126
+ ### Implementasi List (High Performance)
127
+
128
+ ```typescript
129
+ export async function getBooks(req: Request, res: Response) {
130
+ const books = await prisma.book.findMany({
131
+ take: 50, // Limit 50
132
+ orderBy: { created_at: "desc" }
133
+ });
134
+
135
+ // Convert BigInt to string sebelum passing ke serializer (opsional, tapi aman)
136
+ const safeBooks = books.map(b => ({ ...b, id: b.id.toString() }));
137
+
138
+ return sendFastSuccess(res, 200, bookListSerializer, {
139
+ status: "success",
140
+ message: "Daftar buku",
141
+ data: safeBooks
142
+ });
143
+ }
144
+ ```
145
+
146
+ ## Langkah 4: Daftarkan Route & Proteksi
147
+
148
+ Buka `src/routes/book.ts` (atau file yang digenerate). Pastikan route terhubung dan tambahkan middleware auth.
149
+
150
+ ```typescript
151
+ import { Router } from "express";
152
+ import { createBook, getBooks } from "../controllers/bookController";
153
+ import { requireAuth, requireAdmin } from "../middleware/auth";
154
+
155
+ export const bookRouter = Router();
156
+
157
+ // Public route (bisa diakses siapa saja)
158
+ bookRouter.get("/", getBooks);
159
+
160
+ // Admin only (Butuh login + role admin)
161
+ bookRouter.post("/", requireAuth, requireAdmin, createBook);
162
+ ```
163
+
164
+ Terakhir, daftarkan router ini di `src/routes/index.ts` (jika belum otomatis):
165
+
166
+ ```typescript
167
+ import { bookRouter } from "./book";
168
+ // ...
169
+ router.use("/books", bookRouter);
170
+ ```
171
+
172
+ ## Langkah 5: Testing
173
+
174
+ Jalankan server:
175
+ ```bash
176
+ npm run dev
177
+ ```
178
+
179
+ Coba hit endpoint:
180
+ 1. **POST /api/books** (Tanpa token) -> 401 Unauthorized.
181
+ 2. **POST /api/books** (Token User Biasa) -> 403 Forbidden.
182
+ 3. **POST /api/books** (Token Admin + Data Invalid) -> 400 Validation Error.
183
+ 4. **POST /api/books** (Token Admin + Data Valid) -> 201 Created.
184
+ 5. **GET /api/books** -> 200 OK (Super Cepat).
185
+
186
+ ## Kesimpulan
187
+
188
+ Dengan Lapeh Framework, Anda telah membuat API yang:
189
+ - **Aman** (Validasi, Auth, RBAC).
190
+ - **Cepat** (Fast Serialization).
191
+ - **Rapi** (Struktur terstandarisasi).
192
+ - **Mudah** (CLI Generator).