lapeh 2.2.7 → 2.2.9
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.
- package/{api-testing-sepuluh → api-testing-enambelas}/package-lock.json +22 -34
- package/{api-testing-sepuluh → api-testing-enambelas}/package.json +12 -9
- package/{api-testing-sepuluh → api-testing-enambelas}/tsconfig.json +5 -1
- package/api-testing-tujuhbelas/.env.example +19 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/.env.example +19 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/ARCHITECTURE_GUIDE.md +73 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/CHANGELOG.md +77 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/CHEATSHEET.md +94 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/CLI.md +106 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/CONTRIBUTING.md +105 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/DEPLOYMENT.md +122 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/FAQ.md +81 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/FEATURES.md +165 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/GETTING_STARTED.md +108 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/INTRODUCTION.md +60 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/PACKAGES.md +66 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/PERFORMANCE.md +91 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/ROADMAP.md +93 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/SECURITY.md +93 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/STRUCTURE.md +90 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/doc/TUTORIAL.md +192 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/docker-compose.yml +24 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/eslint.config.mjs +26 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/framework.md +168 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/nodemon.json +6 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/package.json +106 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/prisma/base.prisma.template +7 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/prisma/schema.prisma +183 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/prisma/seed.ts +411 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/prisma.config.ts +15 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/readme.md +414 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/check-update.js +92 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/compile-schema.js +29 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/config-clear.js +45 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/generate-jwt-secret.js +38 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/init-project.js +178 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/make-controller.js +205 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/make-model.js +42 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/make-module.js +158 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/scripts/verify-rbac-functional.js +187 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/src/controllers/authController.ts +469 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/src/controllers/petController.ts +194 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/src/controllers/rbacController.ts +478 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/src/models/core.prisma +163 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/src/models/pets.prisma +9 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/auth.ts +74 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/index.ts +10 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/pets.ts +13 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/rbac.ts +42 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/storage/logs/.gitkeep +0 -0
- package/api-testing-tujuhbelas/api-testing-enambelas/tsconfig.json +43 -0
- package/api-testing-tujuhbelas/doc/ARCHITECTURE_GUIDE.md +73 -0
- package/api-testing-tujuhbelas/doc/CHANGELOG.md +77 -0
- package/api-testing-tujuhbelas/doc/CHEATSHEET.md +94 -0
- package/api-testing-tujuhbelas/doc/CLI.md +106 -0
- package/api-testing-tujuhbelas/doc/CONTRIBUTING.md +105 -0
- package/api-testing-tujuhbelas/doc/DEPLOYMENT.md +122 -0
- package/api-testing-tujuhbelas/doc/FAQ.md +81 -0
- package/api-testing-tujuhbelas/doc/FEATURES.md +165 -0
- package/api-testing-tujuhbelas/doc/GETTING_STARTED.md +108 -0
- package/api-testing-tujuhbelas/doc/INTRODUCTION.md +60 -0
- package/api-testing-tujuhbelas/doc/PACKAGES.md +66 -0
- package/api-testing-tujuhbelas/doc/PERFORMANCE.md +91 -0
- package/api-testing-tujuhbelas/doc/ROADMAP.md +93 -0
- package/api-testing-tujuhbelas/doc/SECURITY.md +93 -0
- package/api-testing-tujuhbelas/doc/STRUCTURE.md +90 -0
- package/api-testing-tujuhbelas/doc/TUTORIAL.md +192 -0
- package/api-testing-tujuhbelas/docker-compose.yml +24 -0
- package/api-testing-tujuhbelas/eslint.config.mjs +26 -0
- package/api-testing-tujuhbelas/framework.md +168 -0
- package/api-testing-tujuhbelas/nodemon.json +6 -0
- package/api-testing-tujuhbelas/package-lock.json +5527 -0
- package/api-testing-tujuhbelas/package.json +106 -0
- package/api-testing-tujuhbelas/prisma/base.prisma.template +7 -0
- package/api-testing-tujuhbelas/prisma/migrations/20251227043210_init_setup/migration.sql +248 -0
- package/api-testing-tujuhbelas/prisma/migrations/migration_lock.toml +3 -0
- package/api-testing-tujuhbelas/prisma/schema.prisma +183 -0
- package/api-testing-tujuhbelas/prisma/seed.ts +411 -0
- package/api-testing-tujuhbelas/prisma.config.ts +15 -0
- package/api-testing-tujuhbelas/readme.md +414 -0
- package/api-testing-tujuhbelas/scripts/check-update.js +92 -0
- package/api-testing-tujuhbelas/scripts/compile-schema.js +29 -0
- package/api-testing-tujuhbelas/scripts/config-clear.js +45 -0
- package/api-testing-tujuhbelas/scripts/generate-jwt-secret.js +38 -0
- package/api-testing-tujuhbelas/scripts/init-project.js +178 -0
- package/api-testing-tujuhbelas/scripts/make-controller.js +205 -0
- package/api-testing-tujuhbelas/scripts/make-model.js +42 -0
- package/api-testing-tujuhbelas/scripts/make-module.js +158 -0
- package/api-testing-tujuhbelas/scripts/verify-rbac-functional.js +187 -0
- package/api-testing-tujuhbelas/src/controllers/authController.ts +469 -0
- package/api-testing-tujuhbelas/src/controllers/petController.ts +194 -0
- package/api-testing-tujuhbelas/src/controllers/rbacController.ts +478 -0
- package/api-testing-tujuhbelas/src/models/core.prisma +163 -0
- package/api-testing-tujuhbelas/src/models/pets.prisma +9 -0
- package/api-testing-tujuhbelas/src/routes/auth.ts +74 -0
- package/api-testing-tujuhbelas/src/routes/index.ts +10 -0
- package/api-testing-tujuhbelas/src/routes/pets.ts +13 -0
- package/api-testing-tujuhbelas/src/routes/rbac.ts +42 -0
- package/api-testing-tujuhbelas/storage/logs/.gitkeep +0 -0
- package/api-testing-tujuhbelas/tsconfig.json +43 -0
- package/bin/index.js +182 -13
- package/package.json +6 -6
- /package/{api-testing-sepuluh → api-testing-enambelas}/.env.example +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/ARCHITECTURE_GUIDE.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/CHANGELOG.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/CHEATSHEET.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/CLI.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/CONTRIBUTING.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/DEPLOYMENT.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/FAQ.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/FEATURES.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/GETTING_STARTED.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/INTRODUCTION.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/PACKAGES.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/PERFORMANCE.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/ROADMAP.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/SECURITY.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/STRUCTURE.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/doc/TUTORIAL.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/docker-compose.yml +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/eslint.config.mjs +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/framework.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/nodemon.json +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/prisma/base.prisma.template +0 -0
- /package/{api-testing-sepuluh/prisma/migrations/20251227034737_init_setup → api-testing-enambelas/prisma/migrations/20251227042956_init_setup}/migration.sql +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/prisma/migrations/migration_lock.toml +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/prisma/schema.prisma +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/prisma/seed.ts +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/prisma.config.ts +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/readme.md +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/scripts/check-update.js +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/scripts/compile-schema.js +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/scripts/config-clear.js +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/scripts/generate-jwt-secret.js +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/scripts/init-project.js +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/scripts/make-controller.js +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/scripts/make-model.js +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/scripts/make-module.js +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/scripts/verify-rbac-functional.js +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/src/controllers/authController.ts +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/src/controllers/petController.ts +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/src/controllers/rbacController.ts +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/src/models/core.prisma +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/src/models/pets.prisma +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/src/routes/auth.ts +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/src/routes/index.ts +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/src/routes/pets.ts +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/src/routes/rbac.ts +0 -0
- /package/{api-testing-sepuluh → api-testing-enambelas}/storage/logs/.gitkeep +0 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Panduan Kontribusi (Contributing Guide)
|
|
2
|
+
|
|
3
|
+
Terima kasih atas ketertarikan Anda untuk berkontribusi pada pengembangan **Lapeh Framework**! 🎉
|
|
4
|
+
|
|
5
|
+
Proyek ini bersifat **Open Source** dan kami sangat menghargai setiap bentuk kontribusi, baik itu perbaikan bug, penambahan fitur, dokumentasi, maupun sekadar laporan error (issue).
|
|
6
|
+
|
|
7
|
+
Dokumen ini akan memandu Anda tentang cara berkontribusi dengan benar dan efisien.
|
|
8
|
+
|
|
9
|
+
## 🚀 Memulai Kontribusi
|
|
10
|
+
|
|
11
|
+
### 1. Persiapan Lingkungan (Prerequisites)
|
|
12
|
+
Pastikan Anda sudah menginstal:
|
|
13
|
+
- **Node.js** (v18 ke atas)
|
|
14
|
+
- **Git**
|
|
15
|
+
- **Code Editor** (VS Code disarankan, dengan ekstensi ESLint & Prettier)
|
|
16
|
+
|
|
17
|
+
### 2. Fork & Clone Repository
|
|
18
|
+
1. **Fork** repository ini ke akun GitHub Anda (tombol "Fork" di pojok kanan atas).
|
|
19
|
+
2. **Clone** hasil fork ke komputer lokal Anda:
|
|
20
|
+
```bash
|
|
21
|
+
git clone https://github.com/USERNAME_ANDA/lapeh.git
|
|
22
|
+
cd lapeh
|
|
23
|
+
```
|
|
24
|
+
3. **Tambahkan Remote Upstream** (agar bisa sinkron dengan repo asli):
|
|
25
|
+
```bash
|
|
26
|
+
git remote add upstream https://github.com/robyajo/lapeh.git
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 3. Instalasi Dependencies
|
|
30
|
+
```bash
|
|
31
|
+
npm install
|
|
32
|
+
```
|
|
33
|
+
Jangan lupa jalankan setup awal untuk database lokal (pastikan PostgreSQL/MySQL jalan):
|
|
34
|
+
```bash
|
|
35
|
+
cp .env.example .env
|
|
36
|
+
npm run prisma:migrate
|
|
37
|
+
npm run db:seed
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 🛠️ Workflow Pengembangan
|
|
41
|
+
|
|
42
|
+
### 1. Buat Branch Baru
|
|
43
|
+
Jangan bekerja langsung di branch `main`. Buat branch baru yang deskriptif:
|
|
44
|
+
```bash
|
|
45
|
+
git checkout -b feature/tambah-validasi-email
|
|
46
|
+
# atau
|
|
47
|
+
git checkout -b fix/typo-dokumentasi
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 2. Standar Koding (Coding Standards)
|
|
51
|
+
Kami menerapkan aturan yang ketat demi menjaga kualitas kode.
|
|
52
|
+
- **TypeScript**: Gunakan tipe data eksplisit. Hindari `any` sebisa mungkin.
|
|
53
|
+
- **Linter**: Pastikan tidak ada error ESLint. Variabel tidak terpakai harus dihapus atau diberi prefix `_`.
|
|
54
|
+
- **Formatter**: Kode harus rapi.
|
|
55
|
+
|
|
56
|
+
Sebelum commit, **WAJIB** jalankan perintah ini untuk memastikan kode Anda bersih:
|
|
57
|
+
```bash
|
|
58
|
+
npm run typecheck # Cek error TypeScript
|
|
59
|
+
npm run lint # Cek error Linter
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 3. Commit Message Convention
|
|
63
|
+
Gunakan format **Conventional Commits** agar history mudah dibaca:
|
|
64
|
+
- `feat: ...` untuk fitur baru.
|
|
65
|
+
- `fix: ...` untuk perbaikan bug.
|
|
66
|
+
- `docs: ...` untuk perubahan dokumentasi.
|
|
67
|
+
- `chore: ...` untuk perubahan kecil (config, script).
|
|
68
|
+
- `refactor: ...` untuk perbaikan struktur kode tanpa mengubah fitur.
|
|
69
|
+
|
|
70
|
+
**Contoh:**
|
|
71
|
+
```text
|
|
72
|
+
feat: add email validation rule to validator
|
|
73
|
+
fix: resolve EADDRINUSE error on windows
|
|
74
|
+
docs: update installation guide
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 📮 Mengirim Pull Request (PR)
|
|
78
|
+
|
|
79
|
+
1. **Push** branch Anda ke GitHub:
|
|
80
|
+
```bash
|
|
81
|
+
git push origin feature/nama-fitur
|
|
82
|
+
```
|
|
83
|
+
2. Buka repository fork Anda di GitHub, lalu klik **Compare & pull request**.
|
|
84
|
+
3. Isi judul dan deskripsi PR dengan jelas:
|
|
85
|
+
- Jelaskan apa yang Anda ubah.
|
|
86
|
+
- Sertakan screenshot (jika ada perubahan visual/output).
|
|
87
|
+
- Referensikan Issue jika ada (contoh: `Closes #123`).
|
|
88
|
+
4. Tunggu review dari maintainer. Kami mungkin akan meminta revisi kecil.
|
|
89
|
+
5. Setelah disetujui, kode Anda akan di-merge! 🚀
|
|
90
|
+
|
|
91
|
+
## 🐛 Melaporkan Bug (Issues)
|
|
92
|
+
|
|
93
|
+
Jika Anda menemukan bug tapi belum bisa memperbaikinya, silakan buat **Issue** baru.
|
|
94
|
+
- Gunakan judul yang jelas.
|
|
95
|
+
- Jelaskan langkah-langkah untuk mereproduksi bug (Steps to Reproduce).
|
|
96
|
+
- Sertakan log error atau screenshot.
|
|
97
|
+
- Sebutkan versi Node.js dan OS yang digunakan.
|
|
98
|
+
|
|
99
|
+
## 💡 Ide & Diskusi
|
|
100
|
+
|
|
101
|
+
Punya ide fitur baru? Jangan ragu untuk membukanya di **GitHub Discussions** atau buat Issue dengan label `enhancement` sebelum mulai koding, agar kita bisa mendiskusikan desainnya terlebih dahulu.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
Selamat berkontribusi! Kode Anda akan membantu developer lain membangun aplikasi dengan lebih cepat dan menyenangkan. ❤️
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Deployment Guide
|
|
2
|
+
|
|
3
|
+
Panduan ini akan membantu Anda membawa aplikasi Lapeh dari `localhost` ke Server Production (VPS/Cloud).
|
|
4
|
+
|
|
5
|
+
## Persiapan Pra-Deploy
|
|
6
|
+
|
|
7
|
+
Sebelum deploy, pastikan:
|
|
8
|
+
|
|
9
|
+
1. **Environment Variables**: Siapkan nilai `.env` untuk production (DB URL asli, JWT Secret yang kuat).
|
|
10
|
+
2. **Build**: TypeScript harus dikompilasi ke JavaScript.
|
|
11
|
+
|
|
12
|
+
## Strategi 1: VPS (Ubuntu/Debian) dengan PM2
|
|
13
|
+
|
|
14
|
+
Ini adalah cara paling umum dan hemat biaya.
|
|
15
|
+
|
|
16
|
+
### 1. Setup Server
|
|
17
|
+
|
|
18
|
+
Pastikan Node.js, NPM, dan Database (PostgreSQL/MySQL) sudah terinstall di server.
|
|
19
|
+
|
|
20
|
+
### 2. Clone & Install
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
git clone https://github.com/username/repo-anda.git
|
|
24
|
+
cd repo-anda
|
|
25
|
+
npm install --production=false # Install devDependencies juga untuk build
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 3. Build Aplikasi
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm run build
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Ini akan menghasilkan folder `dist/`.
|
|
35
|
+
|
|
36
|
+
### 4. Setup Database Production
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# Setup .env dulu
|
|
40
|
+
cp .env.example .env
|
|
41
|
+
nano .env # Isi dengan config production
|
|
42
|
+
|
|
43
|
+
# Jalankan migrasi (Hanya deploy schema, jangan reset!)
|
|
44
|
+
npm run prisma:deploy
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 5. Jalankan dengan PM2
|
|
48
|
+
|
|
49
|
+
Gunakan PM2 agar aplikasi jalan di background dan auto-restart jika crash.
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm install -g pm2
|
|
53
|
+
npm run start:prod # Atau: pm2 start dist/src/index.js --name "api-lapeh"
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 6. Reverse Proxy (Nginx)
|
|
57
|
+
|
|
58
|
+
Jangan expose port 4000 langsung. Gunakan Nginx di depannya.
|
|
59
|
+
Config Nginx block:
|
|
60
|
+
|
|
61
|
+
```nginx
|
|
62
|
+
server {
|
|
63
|
+
server_name api.domain-anda.com;
|
|
64
|
+
location / {
|
|
65
|
+
proxy_pass http://localhost:4000;
|
|
66
|
+
proxy_http_version 1.1;
|
|
67
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
68
|
+
proxy_set_header Connection 'upgrade';
|
|
69
|
+
proxy_set_header Host $host;
|
|
70
|
+
proxy_cache_bypass $http_upgrade;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Strategi 2: Docker (Container)
|
|
76
|
+
|
|
77
|
+
Lapeh sudah menyertakan `Dockerfile` (jika belum, buat sederhana saja).
|
|
78
|
+
|
|
79
|
+
**Dockerfile Minimal:**
|
|
80
|
+
|
|
81
|
+
```dockerfile
|
|
82
|
+
FROM node:18-alpine
|
|
83
|
+
|
|
84
|
+
WORKDIR /app
|
|
85
|
+
|
|
86
|
+
COPY package*.json ./
|
|
87
|
+
RUN npm install
|
|
88
|
+
|
|
89
|
+
COPY . .
|
|
90
|
+
RUN npm run build
|
|
91
|
+
|
|
92
|
+
EXPOSE 4000
|
|
93
|
+
CMD ["npm", "run", "start:prod"]
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Deploy:**
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
docker build -t my-lapeh-app .
|
|
100
|
+
docker run -p 4000:4000 --env-file .env my-lapeh-app
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Strategi 3: PaaS (Railway / Render / Vercel)
|
|
104
|
+
|
|
105
|
+
Platform seperti Railway.app sangat mudah karena mendeteksi `package.json`.
|
|
106
|
+
|
|
107
|
+
1. Push kode ke GitHub.
|
|
108
|
+
2. Connect repo di Railway/Render.
|
|
109
|
+
3. Set Environment Variables di dashboard mereka.
|
|
110
|
+
4. Set **Build Command**: `npm run build`.
|
|
111
|
+
5. Set **Start Command**: `npm run start:prod`.
|
|
112
|
+
|
|
113
|
+
**Catatan Khusus Vercel (Serverless):**
|
|
114
|
+
Lapeh didesain sebagai _Long-Running Server_ (Express). Deploy ke Vercel dimungkinkan tapi butuh wrapper serverless (seperti `vercel-express`). Untuk performa terbaik, disarankan menggunakan VPS atau Container (Railway/Fly.io).
|
|
115
|
+
|
|
116
|
+
## Checklist Keamanan Production
|
|
117
|
+
|
|
118
|
+
- [ ] `NODE_ENV=production` harus diset.
|
|
119
|
+
- [ ] `JWT_SECRET` harus panjang dan acak.
|
|
120
|
+
- [ ] Database tidak boleh terekspos ke publik (gunakan private network atau firewall).
|
|
121
|
+
- [ ] Rate Limiting aktif (default Lapeh sudah aktif).
|
|
122
|
+
- [ ] Gunakan HTTPS (SSL) via Nginx atau Cloudflare.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Frequently Asked Questions (FAQ)
|
|
2
|
+
|
|
3
|
+
Kumpulan pertanyaan umum dan solusi untuk masalah yang sering dihadapi.
|
|
4
|
+
|
|
5
|
+
## Database
|
|
6
|
+
|
|
7
|
+
### Q: Bagaimana cara mengganti database dari PostgreSQL ke MySQL?
|
|
8
|
+
**A:**
|
|
9
|
+
1. Buka `prisma/base.prisma.template`.
|
|
10
|
+
2. Ubah `provider = "postgresql"` menjadi `provider = "mysql"`.
|
|
11
|
+
3. Di `.env`, ubah `DATABASE_URL` formatnya menjadi format MySQL (`mysql://user:pass@host:3306/db`).
|
|
12
|
+
4. Hapus folder `prisma/migrations` (jika baru mulai) atau siapkan strategi migrasi.
|
|
13
|
+
5. Jalankan `npm run prisma:migrate`.
|
|
14
|
+
|
|
15
|
+
### Q: Bagaimana cara membuat relasi antar tabel?
|
|
16
|
+
**A:**
|
|
17
|
+
Definisikan relasi di file `.prisma` masing-masing. Karena file akan digabung, Anda bisa mereferensikan model yang ada di file lain.
|
|
18
|
+
**File `user.prisma`:**
|
|
19
|
+
```prisma
|
|
20
|
+
model User {
|
|
21
|
+
id Int @id
|
|
22
|
+
posts Post[] // Relasi ke Post
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
**File `post.prisma`:**
|
|
26
|
+
```prisma
|
|
27
|
+
model Post {
|
|
28
|
+
id Int @id
|
|
29
|
+
authorId Int
|
|
30
|
+
author User @relation(fields: [authorId], references: [id]) // Relasi ke User
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Redis & Caching
|
|
35
|
+
|
|
36
|
+
### Q: Saya tidak ingin pakai Redis di local, ribet installnya.
|
|
37
|
+
**A:**
|
|
38
|
+
Tenang, Lapeh otomatis mendeteksi jika Redis tidak berjalan dan akan menggunakan **In-Memory Mock** (simulasi Redis di RAM). Aplikasi tetap jalan normal tanpa error. Anda tidak perlu config apa-apa.
|
|
39
|
+
|
|
40
|
+
### Q: Bagaimana cara clear cache Redis?
|
|
41
|
+
**A:**
|
|
42
|
+
Jika punya akses CLI Redis: `redis-cli FLUSHALL`.
|
|
43
|
+
Atau via kode:
|
|
44
|
+
```typescript
|
|
45
|
+
import { redis } from "@/core/redis";
|
|
46
|
+
await redis.flushall();
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Fitur & Kustomisasi
|
|
50
|
+
|
|
51
|
+
### Q: Bagaimana cara handle File Upload?
|
|
52
|
+
**A:**
|
|
53
|
+
Gunakan `multer`. Framework sudah menyiapkannya di `src/routes/auth.ts` sebagai contoh (upload avatar).
|
|
54
|
+
Anda bisa copy logic konfigurasi `multer` tersebut ke route lain.
|
|
55
|
+
|
|
56
|
+
### Q: Bagaimana cara menambah middleware global baru?
|
|
57
|
+
**A:**
|
|
58
|
+
Buka `src/core/server.ts`. Di sana ada bagian `// Global Middlewares`. Tambahkan middleware Express Anda di situ:
|
|
59
|
+
```typescript
|
|
60
|
+
app.use(myCustomMiddleware);
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Q: Saya ingin mengubah port server.
|
|
64
|
+
**A:**
|
|
65
|
+
Cukup ubah variabel `PORT` di file `.env`. Defaultnya adalah `4000`.
|
|
66
|
+
|
|
67
|
+
## Troubleshooting
|
|
68
|
+
|
|
69
|
+
### Q: Error `EADDRINUSE: address already in use :::4000`
|
|
70
|
+
**A:**
|
|
71
|
+
Artinya port 4000 sedang dipakai program lain (atau instance Lapeh sebelumnya yang nyangkut).
|
|
72
|
+
**Solusi:**
|
|
73
|
+
1. Matikan terminal.
|
|
74
|
+
2. Jalankan perintah kill (framework biasanya memberi saran commandnya saat error muncul).
|
|
75
|
+
- Windows: `taskkill /F /IM node.exe` (Hati-hati ini mematikan semua node process).
|
|
76
|
+
- Atau cari PID nya: `netstat -ano | findstr :4000`.
|
|
77
|
+
|
|
78
|
+
### Q: Error `Unique constraint failed` saat seeding
|
|
79
|
+
**A:**
|
|
80
|
+
Data yang mau dimasukkan sudah ada (misal email `sa@sa.com`).
|
|
81
|
+
Jalankan `npm run db:reset` untuk menghapus semua data dan mulai dari nol.
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Fitur & Konsep Inti
|
|
2
|
+
|
|
3
|
+
Dokumen ini menjelaskan fitur-fitur utama Lapeh Framework dan cara penggunaannya secara mendalam.
|
|
4
|
+
|
|
5
|
+
## 1. Validasi Data (Laravel-Style)
|
|
6
|
+
|
|
7
|
+
Framework ini menyediakan utility `Validator` yang terinspirasi dari Laravel, menggunakan `zod` di belakang layar namun dengan API yang lebih string-based dan mudah dibaca.
|
|
8
|
+
|
|
9
|
+
**Lokasi:** `@lapeh/utils/validator`
|
|
10
|
+
|
|
11
|
+
### Penggunaan Dasar
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { Validator } from "@lapeh/utils/validator";
|
|
15
|
+
|
|
16
|
+
export async function createProduct(req: Request, res: Response) {
|
|
17
|
+
const validator = await Validator.make(req.body, {
|
|
18
|
+
name: "required|string|min:3",
|
|
19
|
+
price: "required|number|min:1000",
|
|
20
|
+
email: "required|email|unique:user,email", // Cek unik di tabel user kolom email
|
|
21
|
+
category_id: "required|exists:category,id", // Cek exist di tabel category kolom id
|
|
22
|
+
photo: "required|image|max:2048", // Validasi file upload (Max 2MB)
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
if (validator.fails()) {
|
|
26
|
+
return sendError(res, 400, "Validation failed", validator.errors());
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const data = validator.validated();
|
|
30
|
+
// Lanjut proses simpan...
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Aturan Tersedia (Rules)
|
|
35
|
+
|
|
36
|
+
- `required`: Wajib diisi.
|
|
37
|
+
- `string`, `number`, `boolean`: Tipe data.
|
|
38
|
+
- `email`: Format email valid.
|
|
39
|
+
- `min:X`, `max:X`: Panjang string atau nilai number.
|
|
40
|
+
- `unique:table,column`: Pastikan nilai belum ada di database (Async).
|
|
41
|
+
- `exists:table,column`: Pastikan nilai ada di database (Async).
|
|
42
|
+
- `image`: File harus berupa gambar (jpg, png, webp, dll).
|
|
43
|
+
- `mimes:types`: File harus tipe tertentu (misal: `mimes:pdf,docx`).
|
|
44
|
+
|
|
45
|
+
## 2. High Performance Response (Fastify-Style)
|
|
46
|
+
|
|
47
|
+
Untuk endpoint yang membutuhkan performa tinggi (misalnya list data besar), gunakan serialisasi berbasis schema. Ini jauh lebih cepat daripada `res.json` standar Express.
|
|
48
|
+
|
|
49
|
+
**Lokasi:** `@/utils/response`, `@/core/serializer`
|
|
50
|
+
|
|
51
|
+
### Langkah Implementasi
|
|
52
|
+
|
|
53
|
+
1. **Definisikan Schema Output**
|
|
54
|
+
Sesuaikan dengan field yang ingin ditampilkan ke user.
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
const productSchema = {
|
|
58
|
+
type: "object",
|
|
59
|
+
properties: {
|
|
60
|
+
id: { type: "string" }, // BigInt otomatis jadi string
|
|
61
|
+
name: { type: "string" },
|
|
62
|
+
price: { type: "number" },
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
2. **Buat Serializer (Cached)**
|
|
68
|
+
Simpan di luar handler function agar dicompile sekali saja.
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
import { getSerializer, createResponseSchema } from "@/core/serializer";
|
|
72
|
+
|
|
73
|
+
const productSerializer = getSerializer(
|
|
74
|
+
"product-single",
|
|
75
|
+
createResponseSchema(productSchema)
|
|
76
|
+
);
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
3. **Kirim Response**
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
import { sendFastSuccess } from "@lapeh/utils/response";
|
|
83
|
+
|
|
84
|
+
// Di dalam controller
|
|
85
|
+
sendFastSuccess(res, 200, productSerializer, {
|
|
86
|
+
status: "success",
|
|
87
|
+
message: "Data retrieved",
|
|
88
|
+
data: productData,
|
|
89
|
+
});
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## 3. Authentication & Authorization (RBAC)
|
|
93
|
+
|
|
94
|
+
Sistem autentikasi menggunakan JWT (JSON Web Token) dan mendukung Role-Based Access Control.
|
|
95
|
+
|
|
96
|
+
### Middleware Auth
|
|
97
|
+
|
|
98
|
+
- `requireAuth`: Memastikan user login (mengirim header `Authorization: Bearer <token>`).
|
|
99
|
+
- `requireAdmin`: Memastikan user login DAN memiliki role `admin` atau `super_admin`.
|
|
100
|
+
|
|
101
|
+
**Contoh di Route:**
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
import { requireAuth, requireAdmin } from "@/middleware/auth";
|
|
105
|
+
|
|
106
|
+
router.get("/profile", requireAuth, getProfile); // Login only
|
|
107
|
+
router.delete("/users/:id", requireAuth, requireAdmin, deleteUser); // Admin only
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Helper RBAC (Role Based Access Control)
|
|
111
|
+
|
|
112
|
+
Anda bisa mengecek permission secara granular di dalam controller:
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// (Contoh implementasi, logic ada di AuthController/RbacController)
|
|
116
|
+
if (req.user.role !== "manager") {
|
|
117
|
+
return sendError(res, 403, "Forbidden");
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 4. Caching & Redis
|
|
122
|
+
|
|
123
|
+
Framework ini memiliki integrasi Redis "Zero-Config".
|
|
124
|
+
|
|
125
|
+
- Jika `REDIS_URL` ada di `.env` dan server Redis berjalan, framework akan connect.
|
|
126
|
+
- Jika tidak ada atau gagal connect, framework otomatis fallback ke **In-Memory Mock**. Ini membuat development di local tidak wajib install Redis.
|
|
127
|
+
|
|
128
|
+
**Mengakses Redis:**
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
import { redis } from "@/core/redis";
|
|
132
|
+
|
|
133
|
+
// Set cache (1 jam)
|
|
134
|
+
await redis.set("my-key", "value", "EX", 3600);
|
|
135
|
+
|
|
136
|
+
// Get cache
|
|
137
|
+
const val = await redis.get("my-key");
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## 5. Keamanan (Security)
|
|
141
|
+
|
|
142
|
+
Secara default, framework sudah menerapkan:
|
|
143
|
+
|
|
144
|
+
- **Helmet**: Mengamankan HTTP headers.
|
|
145
|
+
- **CORS**: Mengizinkan akses lintas domain (configurable).
|
|
146
|
+
- **Rate Limiting**: Membatasi jumlah request per IP untuk mencegah DDoS/Brute Force.
|
|
147
|
+
- Konfigurasi ada di `src/middleware/rateLimit.ts`.
|
|
148
|
+
- Default: 100 request / 15 menit.
|
|
149
|
+
|
|
150
|
+
## 6. Import Path Aliases
|
|
151
|
+
|
|
152
|
+
Gunakan `@/` untuk import module agar kode lebih bersih.
|
|
153
|
+
|
|
154
|
+
- `@/core` -> `src/core`
|
|
155
|
+
- `@/controllers` -> `src/controllers`
|
|
156
|
+
- `@/utils` -> `src/utils`
|
|
157
|
+
- `@/middleware` -> `src/middleware`
|
|
158
|
+
|
|
159
|
+
**Contoh:**
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
import { prisma } from "@/core/database"; // ✅ Rapi
|
|
163
|
+
// vs
|
|
164
|
+
import { prisma } from "../../../core/database"; // ❌ Berantakan
|
|
165
|
+
```
|
|
@@ -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).
|