lapeh 2.3.6 → 2.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/bin/index.js +39 -56
  2. package/dist/generated/prisma/browser.d.ts +80 -0
  3. package/dist/generated/prisma/browser.d.ts.map +1 -0
  4. package/dist/generated/prisma/browser.js +56 -0
  5. package/dist/generated/prisma/client.d.ts +97 -0
  6. package/dist/generated/prisma/client.d.ts.map +1 -0
  7. package/dist/generated/prisma/client.js +68 -0
  8. package/dist/generated/prisma/commonInputTypes.d.ts +486 -0
  9. package/dist/generated/prisma/commonInputTypes.d.ts.map +1 -0
  10. package/dist/generated/prisma/commonInputTypes.js +11 -0
  11. package/dist/generated/prisma/enums.d.ts +2 -0
  12. package/dist/generated/prisma/enums.d.ts.map +1 -0
  13. package/dist/generated/prisma/enums.js +11 -0
  14. package/dist/generated/prisma/internal/class.d.ts +281 -0
  15. package/dist/generated/prisma/internal/class.d.ts.map +1 -0
  16. package/dist/generated/prisma/internal/class.js +76 -0
  17. package/dist/generated/prisma/internal/prismaNamespace.d.ts +1734 -0
  18. package/dist/generated/prisma/internal/prismaNamespace.d.ts.map +1 -0
  19. package/dist/generated/prisma/internal/prismaNamespace.js +260 -0
  20. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +200 -0
  21. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts.map +1 -0
  22. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +231 -0
  23. package/dist/generated/prisma/models/cache.d.ts +986 -0
  24. package/dist/generated/prisma/models/cache.d.ts.map +1 -0
  25. package/dist/generated/prisma/models/cache.js +2 -0
  26. package/dist/generated/prisma/models/cache_locks.d.ts +976 -0
  27. package/dist/generated/prisma/models/cache_locks.d.ts.map +1 -0
  28. package/dist/generated/prisma/models/cache_locks.js +2 -0
  29. package/dist/generated/prisma/models/failed_jobs.d.ts +1098 -0
  30. package/dist/generated/prisma/models/failed_jobs.d.ts.map +1 -0
  31. package/dist/generated/prisma/models/failed_jobs.js +2 -0
  32. package/dist/generated/prisma/models/job_batches.d.ts +1212 -0
  33. package/dist/generated/prisma/models/job_batches.d.ts.map +1 -0
  34. package/dist/generated/prisma/models/job_batches.js +2 -0
  35. package/dist/generated/prisma/models/jobs.d.ts +1112 -0
  36. package/dist/generated/prisma/models/jobs.d.ts.map +1 -0
  37. package/dist/generated/prisma/models/jobs.js +2 -0
  38. package/dist/generated/prisma/models/migrations.d.ts +979 -0
  39. package/dist/generated/prisma/models/migrations.d.ts.map +1 -0
  40. package/dist/generated/prisma/models/migrations.js +2 -0
  41. package/dist/generated/prisma/models/password_reset_tokens.d.ts +941 -0
  42. package/dist/generated/prisma/models/password_reset_tokens.d.ts.map +1 -0
  43. package/dist/generated/prisma/models/password_reset_tokens.js +2 -0
  44. package/dist/generated/prisma/models/permissions.d.ts +1333 -0
  45. package/dist/generated/prisma/models/permissions.d.ts.map +1 -0
  46. package/dist/generated/prisma/models/permissions.js +2 -0
  47. package/dist/generated/prisma/models/personal_access_tokens.d.ts +1178 -0
  48. package/dist/generated/prisma/models/personal_access_tokens.d.ts.map +1 -0
  49. package/dist/generated/prisma/models/personal_access_tokens.js +2 -0
  50. package/dist/generated/prisma/models/role_permissions.d.ts +1291 -0
  51. package/dist/generated/prisma/models/role_permissions.d.ts.map +1 -0
  52. package/dist/generated/prisma/models/role_permissions.js +2 -0
  53. package/dist/generated/prisma/models/roles.d.ts +1333 -0
  54. package/dist/generated/prisma/models/roles.d.ts.map +1 -0
  55. package/dist/generated/prisma/models/roles.js +2 -0
  56. package/dist/generated/prisma/models/sessions.d.ts +1073 -0
  57. package/dist/generated/prisma/models/sessions.d.ts.map +1 -0
  58. package/dist/generated/prisma/models/sessions.js +2 -0
  59. package/dist/generated/prisma/models/user_permissions.d.ts +1291 -0
  60. package/dist/generated/prisma/models/user_permissions.d.ts.map +1 -0
  61. package/dist/generated/prisma/models/user_permissions.js +2 -0
  62. package/dist/generated/prisma/models/user_roles.d.ts +1291 -0
  63. package/dist/generated/prisma/models/user_roles.d.ts.map +1 -0
  64. package/dist/generated/prisma/models/user_roles.js +2 -0
  65. package/dist/generated/prisma/models/users.d.ts +1513 -0
  66. package/dist/generated/prisma/models/users.d.ts.map +1 -0
  67. package/dist/generated/prisma/models/users.js +2 -0
  68. package/dist/generated/prisma/models.d.ts +17 -0
  69. package/dist/generated/prisma/models.d.ts.map +1 -0
  70. package/dist/generated/prisma/models.js +2 -0
  71. package/dist/lib/bootstrap.d.ts +2 -0
  72. package/dist/lib/bootstrap.d.ts.map +1 -0
  73. package/dist/lib/bootstrap.js +133 -0
  74. package/dist/lib/core/database.d.ts +3 -0
  75. package/dist/lib/core/database.d.ts.map +1 -0
  76. package/dist/lib/core/database.js +34 -0
  77. package/dist/lib/core/realtime.d.ts +3 -0
  78. package/dist/lib/core/realtime.d.ts.map +1 -0
  79. package/dist/lib/core/realtime.js +36 -0
  80. package/dist/lib/core/redis.d.ts +8 -0
  81. package/dist/lib/core/redis.d.ts.map +1 -0
  82. package/dist/lib/core/redis.js +123 -0
  83. package/dist/lib/core/serializer.d.ts +43 -0
  84. package/dist/lib/core/serializer.d.ts.map +1 -0
  85. package/dist/lib/core/serializer.js +66 -0
  86. package/dist/lib/core/server.d.ts +2 -0
  87. package/dist/lib/core/server.d.ts.map +1 -0
  88. package/dist/lib/core/server.js +60 -0
  89. package/dist/lib/middleware/auth.d.ts +4 -0
  90. package/dist/lib/middleware/auth.d.ts.map +1 -0
  91. package/dist/lib/middleware/auth.js +55 -0
  92. package/dist/lib/middleware/error.d.ts +3 -0
  93. package/dist/lib/middleware/error.d.ts.map +1 -0
  94. package/dist/lib/middleware/error.js +60 -0
  95. package/dist/lib/middleware/multipart.d.ts +4 -0
  96. package/dist/lib/middleware/multipart.d.ts.map +1 -0
  97. package/dist/lib/middleware/multipart.js +17 -0
  98. package/dist/lib/middleware/rateLimit.d.ts +2 -0
  99. package/dist/lib/middleware/rateLimit.d.ts.map +1 -0
  100. package/dist/lib/middleware/rateLimit.js +19 -0
  101. package/dist/lib/middleware/requestLogger.d.ts +3 -0
  102. package/dist/lib/middleware/requestLogger.d.ts.map +1 -0
  103. package/dist/lib/middleware/requestLogger.js +22 -0
  104. package/dist/lib/middleware/visitor.d.ts +3 -0
  105. package/dist/lib/middleware/visitor.d.ts.map +1 -0
  106. package/dist/lib/middleware/visitor.js +144 -0
  107. package/dist/lib/utils/logger.d.ts +11 -0
  108. package/dist/lib/utils/logger.d.ts.map +1 -0
  109. package/dist/lib/utils/logger.js +81 -0
  110. package/dist/lib/utils/pagination.d.ts +19 -0
  111. package/dist/lib/utils/pagination.d.ts.map +1 -0
  112. package/dist/lib/utils/pagination.js +34 -0
  113. package/dist/lib/utils/response.d.ts +11 -0
  114. package/dist/lib/utils/response.d.ts.map +1 -0
  115. package/dist/lib/utils/response.js +57 -0
  116. package/dist/lib/utils/validator.d.ts +38 -0
  117. package/dist/lib/utils/validator.d.ts.map +1 -0
  118. package/dist/lib/utils/validator.js +369 -0
  119. package/dist/prisma/seed.d.ts +2 -0
  120. package/dist/prisma/seed.d.ts.map +1 -0
  121. package/dist/prisma/seed.js +381 -0
  122. package/dist/src/controllers/authController.d.ts +11 -0
  123. package/dist/src/controllers/authController.d.ts.map +1 -0
  124. package/dist/src/controllers/authController.js +414 -0
  125. package/dist/src/controllers/petController.d.ts +7 -0
  126. package/dist/src/controllers/petController.d.ts.map +1 -0
  127. package/dist/src/controllers/petController.js +163 -0
  128. package/dist/src/controllers/rbacController.d.ts +16 -0
  129. package/dist/src/controllers/rbacController.d.ts.map +1 -0
  130. package/dist/src/controllers/rbacController.js +437 -0
  131. package/dist/src/core/database.d.ts +3 -0
  132. package/dist/src/core/database.d.ts.map +1 -0
  133. package/dist/src/core/database.js +34 -0
  134. package/dist/src/core/realtime.d.ts +3 -0
  135. package/dist/src/core/realtime.d.ts.map +1 -0
  136. package/dist/src/core/realtime.js +36 -0
  137. package/dist/src/core/redis.d.ts +8 -0
  138. package/dist/src/core/redis.d.ts.map +1 -0
  139. package/dist/src/core/redis.js +123 -0
  140. package/dist/src/core/serializer.d.ts +43 -0
  141. package/dist/src/core/serializer.d.ts.map +1 -0
  142. package/dist/src/core/serializer.js +66 -0
  143. package/dist/src/core/server.d.ts +2 -0
  144. package/dist/src/core/server.d.ts.map +1 -0
  145. package/dist/src/core/server.js +60 -0
  146. package/dist/src/index.d.ts +2 -0
  147. package/dist/src/index.d.ts.map +1 -0
  148. package/dist/src/index.js +98 -0
  149. package/dist/src/middleware/auth.d.ts +4 -0
  150. package/dist/src/middleware/auth.d.ts.map +1 -0
  151. package/dist/src/middleware/auth.js +48 -0
  152. package/dist/src/middleware/error.d.ts +3 -0
  153. package/dist/src/middleware/error.d.ts.map +1 -0
  154. package/dist/src/middleware/error.js +60 -0
  155. package/dist/src/middleware/multipart.d.ts +4 -0
  156. package/dist/src/middleware/multipart.d.ts.map +1 -0
  157. package/dist/src/middleware/multipart.js +17 -0
  158. package/dist/src/middleware/rateLimit.d.ts +2 -0
  159. package/dist/src/middleware/rateLimit.d.ts.map +1 -0
  160. package/dist/src/middleware/rateLimit.js +19 -0
  161. package/dist/src/middleware/requestLogger.d.ts +3 -0
  162. package/dist/src/middleware/requestLogger.d.ts.map +1 -0
  163. package/dist/src/middleware/requestLogger.js +22 -0
  164. package/dist/src/middleware/visitor.d.ts +3 -0
  165. package/dist/src/middleware/visitor.d.ts.map +1 -0
  166. package/dist/src/middleware/visitor.js +144 -0
  167. package/dist/src/prisma.d.ts +3 -0
  168. package/dist/src/prisma.d.ts.map +1 -0
  169. package/dist/src/prisma.js +34 -0
  170. package/dist/src/realtime.d.ts +3 -0
  171. package/dist/src/realtime.d.ts.map +1 -0
  172. package/dist/src/realtime.js +36 -0
  173. package/dist/src/redis.d.ts +8 -0
  174. package/dist/src/redis.d.ts.map +1 -0
  175. package/dist/src/redis.js +122 -0
  176. package/dist/src/routes/auth.d.ts +2 -0
  177. package/dist/src/routes/auth.d.ts.map +1 -0
  178. package/dist/src/routes/auth.js +45 -0
  179. package/dist/src/routes/index.d.ts +2 -0
  180. package/dist/src/routes/index.d.ts.map +1 -0
  181. package/dist/src/routes/index.js +14 -0
  182. package/dist/src/routes/pets.d.ts +3 -0
  183. package/dist/src/routes/pets.d.ts.map +1 -0
  184. package/dist/src/routes/pets.js +45 -0
  185. package/dist/src/routes/rbac.d.ts +2 -0
  186. package/dist/src/routes/rbac.d.ts.map +1 -0
  187. package/dist/src/routes/rbac.js +23 -0
  188. package/dist/src/schema/auth-schema.d.ts +76 -0
  189. package/dist/src/schema/auth-schema.d.ts.map +1 -0
  190. package/dist/src/schema/auth-schema.js +63 -0
  191. package/dist/src/schema/pet-schema.d.ts +28 -0
  192. package/dist/src/schema/pet-schema.d.ts.map +1 -0
  193. package/dist/src/schema/pet-schema.js +14 -0
  194. package/dist/src/server.d.ts +2 -0
  195. package/dist/src/server.d.ts.map +1 -0
  196. package/dist/src/server.js +31 -0
  197. package/dist/src/utils/logger.d.ts +11 -0
  198. package/dist/src/utils/logger.d.ts.map +1 -0
  199. package/dist/src/utils/logger.js +81 -0
  200. package/dist/src/utils/pagination.d.ts +19 -0
  201. package/dist/src/utils/pagination.d.ts.map +1 -0
  202. package/dist/src/utils/pagination.js +34 -0
  203. package/dist/src/utils/response.d.ts +11 -0
  204. package/dist/src/utils/response.d.ts.map +1 -0
  205. package/dist/src/utils/response.js +57 -0
  206. package/dist/src/utils/validator.d.ts +38 -0
  207. package/dist/src/utils/validator.d.ts.map +1 -0
  208. package/dist/src/utils/validator.js +369 -0
  209. package/lib/bootstrap.ts +6 -0
  210. package/package.json +26 -14
  211. package/.env.example +0 -19
  212. package/doc/ARCHITECTURE_GUIDE.md +0 -73
  213. package/doc/CHANGELOG.md +0 -77
  214. package/doc/CHEATSHEET.md +0 -94
  215. package/doc/CLI.md +0 -139
  216. package/doc/CONTRIBUTING.md +0 -105
  217. package/doc/DEPLOYMENT.md +0 -122
  218. package/doc/FAQ.md +0 -81
  219. package/doc/FEATURES.md +0 -165
  220. package/doc/GETTING_STARTED.md +0 -108
  221. package/doc/INTRODUCTION.md +0 -60
  222. package/doc/PACKAGES.md +0 -66
  223. package/doc/PERFORMANCE.md +0 -91
  224. package/doc/ROADMAP.md +0 -93
  225. package/doc/SECURITY.md +0 -93
  226. package/doc/STRUCTURE.md +0 -90
  227. package/doc/TUTORIAL.md +0 -192
  228. package/docker-compose.yml +0 -24
  229. package/eslint.config.mjs +0 -26
  230. package/framework.md +0 -168
  231. package/nodemon.json +0 -6
  232. package/prisma.config.ts +0 -15
  233. package/src/controllers/authController.ts +0 -469
  234. package/src/controllers/petController.ts +0 -194
  235. package/src/controllers/rbacController.ts +0 -478
  236. package/src/models/core.prisma +0 -163
  237. package/src/models/pets.prisma +0 -9
  238. package/src/routes/auth.ts +0 -74
  239. package/src/routes/index.ts +0 -10
  240. package/src/routes/pets.ts +0 -13
  241. package/src/routes/rbac.ts +0 -42
  242. package/storage/logs/.gitkeep +0 -0
  243. package/tsconfig.json +0 -30
package/doc/DEPLOYMENT.md DELETED
@@ -1,122 +0,0 @@
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.
package/doc/FAQ.md DELETED
@@ -1,81 +0,0 @@
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.
package/doc/FEATURES.md DELETED
@@ -1,165 +0,0 @@
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
- ```
@@ -1,108 +0,0 @@
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.
@@ -1,60 +0,0 @@
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).
package/doc/PACKAGES.md DELETED
@@ -1,66 +0,0 @@
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.
@@ -1,91 +0,0 @@
1
- # Panduan Performa & Skalabilitas Lapeh Framework
2
-
3
- Dokumen ini menjelaskan cara memaksimalkan performa aplikasi Lapeh Anda menggunakan fitur-fitur canggih seperti Fast-Serialization dan Clustering.
4
-
5
- ## 1. High Performance Serialization (Fastify-Style)
6
-
7
- Express secara default menggunakan `JSON.stringify()` yang lambat karena harus memeriksa tipe data setiap field secara runtime. Lapeh mengadopsi teknik **Schema Based Serialization** (seperti Fastify) yang bisa meningkatkan throughput JSON hingga **2x-3x lipat**.
8
-
9
- ### Cara Penggunaan
10
-
11
- Gunakan `sendFastSuccess` di controller Anda untuk endpoint yang membutuhkan performa tinggi (misalnya: list data yang besar).
12
-
13
- ```typescript
14
- import { Request, Response } from "express";
15
- import { getSerializer, createResponseSchema } from "../core/serializer";
16
- import { sendFastSuccess } from "../utils/response";
17
-
18
- // 1. Definisikan Schema Output (JSON Schema Standard)
19
- const userSchema = {
20
- type: "object",
21
- properties: {
22
- id: { type: "integer" },
23
- name: { type: "string" },
24
- email: { type: "string" },
25
- // Password tidak dimasukkan, jadi otomatis tidak akan terkirim (aman!)
26
- }
27
- };
28
-
29
- // 2. Compile Serializer (Otomatis dicache oleh framework)
30
- const userListSerializer = getSerializer("user-list", createResponseSchema({
31
- type: "array",
32
- items: userSchema
33
- }));
34
-
35
- export async function getUsers(req: Request, res: Response) {
36
- const users = await prisma.users.findMany();
37
-
38
- // 3. Kirim response super cepat
39
- return sendFastSuccess(res, 200, userListSerializer, {
40
- status: "success",
41
- message: "Data fetched",
42
- data: users
43
- });
44
- }
45
- ```
46
-
47
- ---
48
-
49
- ## 2. Horizontal Scaling (Load Balancer & Cluster)
50
-
51
- Lapeh dirancang untuk siap di-scale secara horizontal (menambah jumlah server, bukan memperbesar spesifikasi server).
52
-
53
- ### Arsitektur Cluster
54
- - **Nginx**: Bertindak sebagai Load Balancer yang membagi trafik ke server-server aplikasi.
55
- - **Redis**: Menyimpan Session, Rate Limit, dan Cache agar bisa diakses oleh semua server (Shared State).
56
- - **App Instances**: Beberapa instance aplikasi Lapeh yang berjalan paralel.
57
-
58
- ### Cara Menjalankan Cluster (Docker)
59
-
60
- Kami telah menyediakan konfigurasi siap pakai di `docker-compose.cluster.yml`.
61
-
62
- 1. **Build & Run Cluster**:
63
- ```bash
64
- docker-compose -f docker-compose.cluster.yml up --build
65
- ```
66
-
67
- 2. **Akses Aplikasi**:
68
- Buka `http://localhost:8080`.
69
- Nginx akan otomatis membagi request Anda ke `app-1` atau `app-2`.
70
-
71
- 3. **Cek Status**:
72
- ```bash
73
- docker-compose -f docker-compose.cluster.yml ps
74
- ```
75
-
76
- ### Konfigurasi Rate Limiter Terdistribusi
77
- Middleware `src/middleware/rateLimit.ts` telah diupdate untuk menggunakan Redis Store.
78
- Ini artinya jika User A terkena limit di Server 1, dia juga akan terblokir di Server 2.
79
-
80
- ```typescript
81
- // src/middleware/rateLimit.ts
82
- store: redis ? new RedisStore({ sendCommand: ... }) : undefined
83
- ```
84
-
85
- ---
86
-
87
- ## 3. Tips Optimasi Lainnya
88
-
89
- - **Gunakan `.lean()` / Select**: Saat query database, selalu pilih field yang dibutuhkan saja.
90
- - **Compression**: Aktifkan gzip/brotli di Nginx (sudah ada di config default Nginx umumnya).
91
- - **Keep-Alive**: Gunakan koneksi database yang persistent (sudah dihandle oleh Prisma).