lapeh 2.2.8 → 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-enambelas/.env.example +19 -0
- package/api-testing-enambelas/doc/ARCHITECTURE_GUIDE.md +73 -0
- package/api-testing-enambelas/doc/CHANGELOG.md +77 -0
- package/api-testing-enambelas/doc/CHEATSHEET.md +94 -0
- package/api-testing-enambelas/doc/CLI.md +106 -0
- package/api-testing-enambelas/doc/CONTRIBUTING.md +105 -0
- package/api-testing-enambelas/doc/DEPLOYMENT.md +122 -0
- package/api-testing-enambelas/doc/FAQ.md +81 -0
- package/api-testing-enambelas/doc/FEATURES.md +165 -0
- package/api-testing-enambelas/doc/GETTING_STARTED.md +108 -0
- package/api-testing-enambelas/doc/INTRODUCTION.md +60 -0
- package/api-testing-enambelas/doc/PACKAGES.md +66 -0
- package/api-testing-enambelas/doc/PERFORMANCE.md +91 -0
- package/api-testing-enambelas/doc/ROADMAP.md +93 -0
- package/api-testing-enambelas/doc/SECURITY.md +93 -0
- package/api-testing-enambelas/doc/STRUCTURE.md +90 -0
- package/api-testing-enambelas/doc/TUTORIAL.md +192 -0
- package/api-testing-enambelas/docker-compose.yml +24 -0
- package/api-testing-enambelas/eslint.config.mjs +26 -0
- package/api-testing-enambelas/framework.md +168 -0
- package/api-testing-enambelas/nodemon.json +6 -0
- package/api-testing-enambelas/package-lock.json +5527 -0
- package/api-testing-enambelas/package.json +106 -0
- package/api-testing-enambelas/prisma/base.prisma.template +7 -0
- package/api-testing-enambelas/prisma/migrations/20251227042956_init_setup/migration.sql +248 -0
- package/api-testing-enambelas/prisma/migrations/migration_lock.toml +3 -0
- package/api-testing-enambelas/prisma/schema.prisma +183 -0
- package/api-testing-enambelas/prisma/seed.ts +411 -0
- package/api-testing-enambelas/prisma.config.ts +15 -0
- package/api-testing-enambelas/readme.md +414 -0
- package/api-testing-enambelas/scripts/check-update.js +92 -0
- package/api-testing-enambelas/scripts/compile-schema.js +29 -0
- package/api-testing-enambelas/scripts/config-clear.js +45 -0
- package/api-testing-enambelas/scripts/generate-jwt-secret.js +38 -0
- package/api-testing-enambelas/scripts/init-project.js +178 -0
- package/api-testing-enambelas/scripts/make-controller.js +205 -0
- package/api-testing-enambelas/scripts/make-model.js +42 -0
- package/api-testing-enambelas/scripts/make-module.js +158 -0
- package/api-testing-enambelas/scripts/verify-rbac-functional.js +187 -0
- package/api-testing-enambelas/src/controllers/authController.ts +469 -0
- package/api-testing-enambelas/src/controllers/petController.ts +194 -0
- package/api-testing-enambelas/src/controllers/rbacController.ts +478 -0
- package/api-testing-enambelas/src/models/core.prisma +163 -0
- package/api-testing-enambelas/src/models/pets.prisma +9 -0
- package/api-testing-enambelas/src/routes/auth.ts +74 -0
- package/api-testing-enambelas/src/routes/index.ts +10 -0
- package/api-testing-enambelas/src/routes/pets.ts +13 -0
- package/api-testing-enambelas/src/routes/rbac.ts +42 -0
- package/api-testing-enambelas/storage/logs/.gitkeep +0 -0
- package/api-testing-enambelas/tsconfig.json +43 -0
- 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 +20 -2
- package/package.json +1 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
PORT=8000
|
|
2
|
+
DATABASE_PROVIDER="postgresql"
|
|
3
|
+
DATABASE_URL="postgresql://sianu:12341234@localhost:5432/db_example_test?schema=public"
|
|
4
|
+
|
|
5
|
+
# Used for all encryption-related tasks in the framework (JWT, etc.)
|
|
6
|
+
JWT_SECRET="replace_this_with_a_secure_random_string"
|
|
7
|
+
|
|
8
|
+
# Framework Timezone
|
|
9
|
+
TZ="Asia/Jakarta"
|
|
10
|
+
|
|
11
|
+
# Redis Configuration (Optional)
|
|
12
|
+
# If REDIS_URL is not set or connection fails, the framework will automatically
|
|
13
|
+
# switch to an in-memory Redis mock (bundled). No installation required for development.
|
|
14
|
+
# REDIS_URL="redis://lapeh:12341234@localhost:6379"
|
|
15
|
+
# NO_REDIS="true"
|
|
16
|
+
|
|
17
|
+
# To force disable Redis and use in-memory mock even if Redis is available:
|
|
18
|
+
# NO_REDIS="true"
|
|
19
|
+
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Panduan Arsitektur: Menuju "Framework as a Dependency" (Next.js Style)
|
|
2
|
+
|
|
3
|
+
Saat ini, Lapeh menggunakan pendekatan **Boilerplate** (seperti Laravel), di mana pengguna mendapatkan seluruh kode sumber (`src/`) dan bertanggung jawab atas `express`, `prisma`, dll.
|
|
4
|
+
|
|
5
|
+
Untuk mengubahnya menjadi seperti **Next.js** (di mana pengguna hanya menginstall `lapeh` dan `package.json` mereka bersih), kita perlu mengubah arsitektur menjadi **Library**.
|
|
6
|
+
|
|
7
|
+
## 1. Perbedaan Utama
|
|
8
|
+
|
|
9
|
+
| Fitur | Boilerplate (Lapeh Saat Ini) | Library (Next.js Style) |
|
|
10
|
+
| :--- | :--- | :--- |
|
|
11
|
+
| **Instalasi** | `git clone` / `npx create-lapeh` | `npm install lapeh` |
|
|
12
|
+
| **package.json** | Banyak dependency (`express`, `cors`, dll) | Sedikit (`lapeh`, `react`) |
|
|
13
|
+
| **Scripts** | Panjang (`nodemon src/index.ts`) | Pendek (`lapeh dev`) |
|
|
14
|
+
| **Core Code** | Terbuka di `src/core/` | Tersembunyi di `node_modules/lapeh` |
|
|
15
|
+
| **Update** | Susah (harus merge manual) | Mudah (`npm update lapeh`) |
|
|
16
|
+
|
|
17
|
+
## 2. Langkah Implementasi
|
|
18
|
+
|
|
19
|
+
Saya telah memulai langkah pertama dengan menambahkan **CLI Runner** di `bin/index.js`.
|
|
20
|
+
|
|
21
|
+
### A. Update CLI (`bin/index.js`) ✅ (Sudah Dilakukan)
|
|
22
|
+
Saya sudah menambahkan command `dev`, `start`, dan `build` ke dalam CLI Lapeh. Ini memungkinkan pengguna menjalankan server tanpa tahu perintah aslinya.
|
|
23
|
+
|
|
24
|
+
```javascript
|
|
25
|
+
// Contoh penggunaan nanti:
|
|
26
|
+
"scripts": {
|
|
27
|
+
"dev": "lapeh dev",
|
|
28
|
+
"build": "lapeh build",
|
|
29
|
+
"start": "lapeh start"
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### B. Struktur Project Pengguna (Target)
|
|
34
|
+
Nantinya, project pengguna Lapeh hanya akan berisi file bisnis mereka:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
my-app/
|
|
38
|
+
├── src/
|
|
39
|
+
│ ├── controllers/
|
|
40
|
+
│ ├── routes/
|
|
41
|
+
│ └── models/
|
|
42
|
+
├── lapeh.config.ts <-- Konfigurasi framework (pengganti edit core)
|
|
43
|
+
└── package.json
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Dan `package.json` mereka akan terlihat seperti ini:
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"name": "my-app",
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"lapeh": "^2.0.0"
|
|
53
|
+
},
|
|
54
|
+
"scripts": {
|
|
55
|
+
"dev": "lapeh dev",
|
|
56
|
+
"build": "lapeh build",
|
|
57
|
+
"start": "lapeh start"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### C. Apa yang Harus Dilakukan Selanjutnya?
|
|
63
|
+
|
|
64
|
+
1. **Publish Package**: Anda perlu mempublish folder framework ini ke NPM (atau private registry).
|
|
65
|
+
* Pastikan `express`, `cors`, `helmet`, dll ada di `dependencies` (bukan `devDependencies`).
|
|
66
|
+
2. **Abstraksi `src/index.ts`**:
|
|
67
|
+
* Saat ini `src/index.ts` adalah entry point yang diedit user.
|
|
68
|
+
* Ubah agar `lapeh dev` menjalankan server internal yang **mengimpor** routes/controller user secara dinamis (seperti Next.js pages router).
|
|
69
|
+
3. **Config Loader**:
|
|
70
|
+
* Buat sistem pembacaan `lapeh.config.ts` untuk mengatur Port, Database URL, dll tanpa mengedit kode core.
|
|
71
|
+
|
|
72
|
+
## 3. Kesimpulan
|
|
73
|
+
Perubahan yang saya lakukan di `bin/index.js` adalah fondasi untuk CLI style. Untuk mencapai "Clean package.json" sepenuhnya, Anda harus memisahkan **Framework Core** (repo ini) dengan **User Project** (repo baru yang menginstall framework ini).
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Dokumentasi Perubahan Lapeh Framework
|
|
2
|
+
|
|
3
|
+
File ini mencatat semua perubahan, pembaruan, dan perbaikan yang dilakukan pada framework Lapeh, diurutkan berdasarkan tanggal.
|
|
4
|
+
|
|
5
|
+
## [2025-12-27] - Code Quality & Standardization Update
|
|
6
|
+
|
|
7
|
+
### 🚀 Fitur & Standarisasi
|
|
8
|
+
|
|
9
|
+
- **Standardized Import Paths**:
|
|
10
|
+
- Implementasi path alias `@/` untuk import yang lebih bersih (e.g., `import { prisma } from "@/core/database"`).
|
|
11
|
+
- Penghapusan penggunaan relative paths yang dalam (`../../../`).
|
|
12
|
+
- Konfigurasi `tsconfig.json` tanpa `baseUrl` (mengikuti standar TypeScript 6.0+).
|
|
13
|
+
- **Strict Linting & Code Quality**:
|
|
14
|
+
- Implementasi aturan **ESLint** ketat untuk mencegah "Dead Code".
|
|
15
|
+
- Error otomatis untuk variabel, parameter, dan import yang tidak digunakan (`no-unused-vars`).
|
|
16
|
+
- Script `npm run lint` dan `npm run lint:fix` untuk pembersihan kode otomatis.
|
|
17
|
+
- **Fastify-Style Standardization**:
|
|
18
|
+
- Penerapan standar respon cepat (`sendFastSuccess`) di seluruh controller (`AuthController`, `RbacController`, `PetController`).
|
|
19
|
+
- Penggunaan **Schema-based Serialization** untuk performa JSON maksimal.
|
|
20
|
+
- Konversi otomatis `BigInt` ke `string` dalam respon JSON.
|
|
21
|
+
|
|
22
|
+
## [2025-12-27] - High Performance & Scalability Update
|
|
23
|
+
|
|
24
|
+
### 🚀 Fitur Baru
|
|
25
|
+
|
|
26
|
+
- **High Performance Serialization (Fastify-Style)**:
|
|
27
|
+
- Implementasi `fast-json-stringify` untuk serialisasi JSON super cepat (2x-3x lebih cepat dari `JSON.stringify`).
|
|
28
|
+
- Helper `sendFastSuccess` di `src/utils/response.ts` untuk mem-bypass overhead Express.
|
|
29
|
+
- Caching schema serializer otomatis di `src/core/serializer.ts`.
|
|
30
|
+
- **Scalability & Clustering**:
|
|
31
|
+
- Dukungan **Load Balancing** dengan Nginx.
|
|
32
|
+
- Dukungan **Redis Clustering** untuk Rate Limiter (`rate-limit-redis`).
|
|
33
|
+
- File konfigurasi `docker-compose.cluster.yml` untuk simulasi cluster lokal (1 Nginx + 2 App Instances + 1 Redis).
|
|
34
|
+
- **Smart Error Handling**:
|
|
35
|
+
- Deteksi otomatis port bentrok (`EADDRINUSE`) saat startup.
|
|
36
|
+
- Memberikan saran command _copy-paste_ untuk mematikan process yang memblokir port (support Windows, Mac, Linux).
|
|
37
|
+
- **SEO Optimization**:
|
|
38
|
+
- Update metadata `package.json` dan `README.md` agar framework lebih mudah ditemukan di Google/NPM.
|
|
39
|
+
|
|
40
|
+
## [2025-12-27] - Pembaruan Struktur & Validasi
|
|
41
|
+
|
|
42
|
+
### 🚀 Fitur Baru
|
|
43
|
+
|
|
44
|
+
- **Laravel-style Validator**:
|
|
45
|
+
- Implementasi utility `Validator` baru di `src/utils/validator.ts` yang meniru gaya validasi Laravel.
|
|
46
|
+
- Mendukung rule string seperti `required|string|min:3|email`.
|
|
47
|
+
- Penambahan rule `unique` untuk pengecekan database otomatis (Prisma).
|
|
48
|
+
- Penambahan rule `mimes`, `image`, `max` (file size) untuk validasi upload file.
|
|
49
|
+
- Penambahan rule `sometimes` untuk field opsional.
|
|
50
|
+
- **Framework Hardening (Keamanan & Stabilitas)**:
|
|
51
|
+
- **Rate Limiting**: Middleware anti-spam/brute-force di `src/middleware/rateLimit.ts`.
|
|
52
|
+
- **Request Logger**: Pencatatan log request masuk di `src/middleware/requestLogger.ts`.
|
|
53
|
+
- **Health Check**: Endpoint `/` kini mengembalikan status kesehatan server.
|
|
54
|
+
- **Graceful Shutdown**: Penanganan penutupan koneksi Database dan Redis yang aman saat server berhenti (`SIGTERM`/`SIGINT`).
|
|
55
|
+
- **Environment Validation**: Validasi variabel `.env` wajib (seperti `DATABASE_URL`, `JWT_SECRET`) saat startup.
|
|
56
|
+
- **Struktur Folder Baru**:
|
|
57
|
+
- Pemisahan konfigurasi inti ke `src/core/` (`server.ts`, `database.ts`, `redis.ts`, `realtime.ts`) agar folder `src` lebih bersih.
|
|
58
|
+
- Sentralisasi route di `src/routes/index.ts` (WIP).
|
|
59
|
+
- **CLI Improvements**:
|
|
60
|
+
- `npx lapeh <project-name> --full` kini otomatis menjalankan server dev setelah instalasi selesai, sehingga user bisa langsung melihat hasil tanpa mengetik perintah tambahan.
|
|
61
|
+
|
|
62
|
+
### 🛠️ Perbaikan & Refactoring
|
|
63
|
+
|
|
64
|
+
- **Controller Refactoring**:
|
|
65
|
+
- `AuthController`: Migrasi ke `Validator` baru, termasuk validasi upload avatar.
|
|
66
|
+
- `PetController`: Migrasi ke `Validator` baru.
|
|
67
|
+
- `RbacController`: Migrasi sebagian ke `Validator` baru.
|
|
68
|
+
- **Pembersihan**:
|
|
69
|
+
- Penghapusan folder `src/schema/` (Zod schema lama) karena sudah digantikan oleh `Validator` utility.
|
|
70
|
+
- Penghapusan file duplikat/lama di root `src/` setelah migrasi ke `src/core/`.
|
|
71
|
+
|
|
72
|
+
### 📝 Catatan Teknis
|
|
73
|
+
|
|
74
|
+
- **Validator Async**: Method `fails()`, `passes()`, dan `validated()` kini bersifat `async` untuk mendukung pengecekan database (`unique`).
|
|
75
|
+
- **Type Safety**: Semua perubahan telah diverifikasi dengan `npm run typecheck`.
|
|
76
|
+
|
|
77
|
+
---
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Lapeh Framework Cheatsheet
|
|
2
|
+
|
|
3
|
+
Referensi cepat untuk perintah dan kode yang sering digunakan.
|
|
4
|
+
|
|
5
|
+
## 💻 CLI Commands
|
|
6
|
+
|
|
7
|
+
| Perintah | Fungsi |
|
|
8
|
+
| :----------------------------------- | :------------------------------------------- |
|
|
9
|
+
| **`npm run dev`** | Menjalankan server development (hot-reload). |
|
|
10
|
+
| **`npm run typecheck`** | Cek error TypeScript (tanpa compile). |
|
|
11
|
+
| **`npm run lint`** | Cek kode kotor/variabel tidak terpakai. |
|
|
12
|
+
| **`npm run lint:fix`** | Perbaiki kode kotor otomatis. |
|
|
13
|
+
| **`npm run make:module <Name>`** | Buat Controller, Route, & Model sekaligus. |
|
|
14
|
+
| **`npm run make:controller <Name>`** | Buat Controller saja. |
|
|
15
|
+
| **`npm run make:model <Name>`** | Buat Model Prisma saja. |
|
|
16
|
+
| **`npm run prisma:migrate`** | Apply perubahan schema ke DB lokal. |
|
|
17
|
+
| **`npm run db:studio`** | Buka GUI Database. |
|
|
18
|
+
| **`npm run db:seed`** | Isi data dummy. |
|
|
19
|
+
| **`npm run db:reset`** | Hapus DB & mulai dari nol. |
|
|
20
|
+
|
|
21
|
+
## 🛡️ Validator Rules (Laravel-Style)
|
|
22
|
+
|
|
23
|
+
Gunakan di `Validator.make(data, rules)`.
|
|
24
|
+
|
|
25
|
+
| Rule | Deskripsi | Contoh |
|
|
26
|
+
| :----------------- | :---------------------- | :---------------------------------- | -------- |
|
|
27
|
+
| `required` | Wajib ada & tidak null. | `"required"` |
|
|
28
|
+
| `string` | Harus text. | `"required | string"` |
|
|
29
|
+
| `number` | Harus angka. | `"required | number"` |
|
|
30
|
+
| `email` | Format email valid. | `"required | email"` |
|
|
31
|
+
| `min:X` | Min panjang/nilai. | `"min:8"` (pass), `"min:18"` (umur) |
|
|
32
|
+
| `max:X` | Max panjang/nilai. | `"max:255"` |
|
|
33
|
+
| `unique:table,col` | Cek unik di DB. | `"unique:users,email"` |
|
|
34
|
+
| `exists:table,col` | Cek exist di DB. | `"exists:roles,id"` |
|
|
35
|
+
| `image` | File harus gambar. | `"required | image"` |
|
|
36
|
+
| `mimes:types` | File extension. | `"mimes:pdf,docx"` |
|
|
37
|
+
|
|
38
|
+
## 🔑 Authentication
|
|
39
|
+
|
|
40
|
+
**Middleware di Route:**
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import { requireAuth, requireAdmin } from "@/middleware/auth";
|
|
44
|
+
|
|
45
|
+
router.get("/profile", requireAuth, getProfile); // Login User
|
|
46
|
+
router.delete("/user", requireAuth, requireAdmin, del); // Admin Only
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Akses User di Controller:**
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
// (req as any).user tersedia setelah requireAuth
|
|
53
|
+
const userId = (req as any).user.userId;
|
|
54
|
+
const role = (req as any).user.role;
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## ⚡ Fast Response (Serializer)
|
|
58
|
+
|
|
59
|
+
**1. Schema:**
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
const schema = {
|
|
63
|
+
type: "object",
|
|
64
|
+
properties: {
|
|
65
|
+
id: { type: "string" },
|
|
66
|
+
name: { type: "string" },
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**2. Serializer:**
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
const serializer = getSerializer("key-name", createResponseSchema(schema));
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**3. Send:**
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
sendFastSuccess(res, 200, serializer, { ...data });
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 📦 Redis (Cache)
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
import { redis } from "@lapeh/core/redis";
|
|
87
|
+
|
|
88
|
+
// Set Cache (Key, Value, Mode, Detik)
|
|
89
|
+
await redis.set("profile:1", JSON.stringify(data), "EX", 3600);
|
|
90
|
+
|
|
91
|
+
// Get Cache
|
|
92
|
+
const cached = await redis.get("profile:1");
|
|
93
|
+
if (cached) return JSON.parse(cached);
|
|
94
|
+
```
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# CLI Tools & Scripts
|
|
2
|
+
|
|
3
|
+
Lapeh Framework dilengkapi dengan berbagai script CLI untuk mempercepat proses development, mulai dari generate code hingga manajemen database.
|
|
4
|
+
|
|
5
|
+
Semua perintah dijalankan menggunakan `npm run <command>`.
|
|
6
|
+
|
|
7
|
+
## Code Generators
|
|
8
|
+
|
|
9
|
+
Gunakan perintah ini untuk membuat file boilerplate secara otomatis.
|
|
10
|
+
|
|
11
|
+
### 1. Membuat Module Lengkap (`make:module`)
|
|
12
|
+
Membuat Controller, Route, dan Model (Schema) sekaligus.
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm run make:module <nama-module>
|
|
16
|
+
```
|
|
17
|
+
**Contoh:** `npm run make:module Product`
|
|
18
|
+
|
|
19
|
+
Output:
|
|
20
|
+
- `src/controllers/productController.ts`
|
|
21
|
+
- `src/routes/product.ts`
|
|
22
|
+
- `src/models/product.prisma`
|
|
23
|
+
|
|
24
|
+
### 2. Membuat Controller (`make:controller`)
|
|
25
|
+
Hanya membuat file controller dengan method CRUD dasar.
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm run make:controller <nama-controller>
|
|
29
|
+
```
|
|
30
|
+
**Contoh:** `npm run make:controller Order` (Akan membuat `src/controllers/orderController.ts`)
|
|
31
|
+
|
|
32
|
+
### 3. Membuat Model Database (`make:model`)
|
|
33
|
+
Hanya membuat file schema Prisma baru.
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm run make:model <nama-model>
|
|
37
|
+
```
|
|
38
|
+
**Contoh:** `npm run make:model Transaction` (Akan membuat `src/models/transaction.prisma`)
|
|
39
|
+
|
|
40
|
+
## Database Management (Prisma)
|
|
41
|
+
|
|
42
|
+
Framework ini menggunakan sistem **Multi-File Schema**. Anda tidak mengedit `schema.prisma` secara langsung, melainkan mengedit file kecil di `src/models/*.prisma`.
|
|
43
|
+
|
|
44
|
+
### 1. Migrasi Database (`prisma:migrate`)
|
|
45
|
+
Jalankan setiap kali Anda mengubah definisi model di `src/models/*.prisma`.
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npm run prisma:migrate
|
|
49
|
+
```
|
|
50
|
+
Perintah ini akan:
|
|
51
|
+
1. Menggabungkan semua file `.prisma` di `src/models/` menjadi satu `prisma/schema.prisma`.
|
|
52
|
+
2. Membuat file migrasi SQL.
|
|
53
|
+
3. Menerapkan perubahan ke database lokal.
|
|
54
|
+
4. Men-generate ulang Prisma Client (Type Definitions).
|
|
55
|
+
|
|
56
|
+
### 2. Deploy ke Production (`prisma:deploy`)
|
|
57
|
+
Gunakan di server production. Hanya menerapkan migrasi yang sudah ada tanpa reset data.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npm run prisma:deploy
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 3. Database Studio (`db:studio`)
|
|
64
|
+
Membuka GUI di browser untuk melihat dan mengedit data database.
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npm run db:studio
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 4. Seeding Data (`db:seed`)
|
|
71
|
+
Mengisi database dengan data awal yang didefinisikan di `prisma/seed.ts`.
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
npm run db:seed
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 5. Reset Database (`db:reset`)
|
|
78
|
+
**PERINGATAN:** Menghapus semua data dan tabel, lalu menjalankan migrasi dari awal.
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
npm run db:reset
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Code Quality & Utilities
|
|
85
|
+
|
|
86
|
+
### 1. Linting (`lint`)
|
|
87
|
+
Memeriksa kode dari error, variabel tidak terpakai, dan gaya penulisan.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
npm run lint
|
|
91
|
+
```
|
|
92
|
+
Gunakan `npm run lint:fix` untuk memperbaiki error otomatis.
|
|
93
|
+
|
|
94
|
+
### 2. Type Check (`typecheck`)
|
|
95
|
+
Memeriksa error tipe data TypeScript tanpa melakukan compile.
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
npm run typecheck
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 3. Generate JWT Secret (`generate:jwt`)
|
|
102
|
+
Membuat random string aman untuk `JWT_SECRET` di file `.env`.
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
npm run generate:jwt
|
|
106
|
+
```
|
|
@@ -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.
|