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.
Files changed (149) hide show
  1. package/api-testing-enambelas/.env.example +19 -0
  2. package/api-testing-enambelas/doc/ARCHITECTURE_GUIDE.md +73 -0
  3. package/api-testing-enambelas/doc/CHANGELOG.md +77 -0
  4. package/api-testing-enambelas/doc/CHEATSHEET.md +94 -0
  5. package/api-testing-enambelas/doc/CLI.md +106 -0
  6. package/api-testing-enambelas/doc/CONTRIBUTING.md +105 -0
  7. package/api-testing-enambelas/doc/DEPLOYMENT.md +122 -0
  8. package/api-testing-enambelas/doc/FAQ.md +81 -0
  9. package/api-testing-enambelas/doc/FEATURES.md +165 -0
  10. package/api-testing-enambelas/doc/GETTING_STARTED.md +108 -0
  11. package/api-testing-enambelas/doc/INTRODUCTION.md +60 -0
  12. package/api-testing-enambelas/doc/PACKAGES.md +66 -0
  13. package/api-testing-enambelas/doc/PERFORMANCE.md +91 -0
  14. package/api-testing-enambelas/doc/ROADMAP.md +93 -0
  15. package/api-testing-enambelas/doc/SECURITY.md +93 -0
  16. package/api-testing-enambelas/doc/STRUCTURE.md +90 -0
  17. package/api-testing-enambelas/doc/TUTORIAL.md +192 -0
  18. package/api-testing-enambelas/docker-compose.yml +24 -0
  19. package/api-testing-enambelas/eslint.config.mjs +26 -0
  20. package/api-testing-enambelas/framework.md +168 -0
  21. package/api-testing-enambelas/nodemon.json +6 -0
  22. package/api-testing-enambelas/package-lock.json +5527 -0
  23. package/api-testing-enambelas/package.json +106 -0
  24. package/api-testing-enambelas/prisma/base.prisma.template +7 -0
  25. package/api-testing-enambelas/prisma/migrations/20251227042956_init_setup/migration.sql +248 -0
  26. package/api-testing-enambelas/prisma/migrations/migration_lock.toml +3 -0
  27. package/api-testing-enambelas/prisma/schema.prisma +183 -0
  28. package/api-testing-enambelas/prisma/seed.ts +411 -0
  29. package/api-testing-enambelas/prisma.config.ts +15 -0
  30. package/api-testing-enambelas/readme.md +414 -0
  31. package/api-testing-enambelas/scripts/check-update.js +92 -0
  32. package/api-testing-enambelas/scripts/compile-schema.js +29 -0
  33. package/api-testing-enambelas/scripts/config-clear.js +45 -0
  34. package/api-testing-enambelas/scripts/generate-jwt-secret.js +38 -0
  35. package/api-testing-enambelas/scripts/init-project.js +178 -0
  36. package/api-testing-enambelas/scripts/make-controller.js +205 -0
  37. package/api-testing-enambelas/scripts/make-model.js +42 -0
  38. package/api-testing-enambelas/scripts/make-module.js +158 -0
  39. package/api-testing-enambelas/scripts/verify-rbac-functional.js +187 -0
  40. package/api-testing-enambelas/src/controllers/authController.ts +469 -0
  41. package/api-testing-enambelas/src/controllers/petController.ts +194 -0
  42. package/api-testing-enambelas/src/controllers/rbacController.ts +478 -0
  43. package/api-testing-enambelas/src/models/core.prisma +163 -0
  44. package/api-testing-enambelas/src/models/pets.prisma +9 -0
  45. package/api-testing-enambelas/src/routes/auth.ts +74 -0
  46. package/api-testing-enambelas/src/routes/index.ts +10 -0
  47. package/api-testing-enambelas/src/routes/pets.ts +13 -0
  48. package/api-testing-enambelas/src/routes/rbac.ts +42 -0
  49. package/api-testing-enambelas/storage/logs/.gitkeep +0 -0
  50. package/api-testing-enambelas/tsconfig.json +43 -0
  51. package/api-testing-tujuhbelas/.env.example +19 -0
  52. package/api-testing-tujuhbelas/api-testing-enambelas/.env.example +19 -0
  53. package/api-testing-tujuhbelas/api-testing-enambelas/doc/ARCHITECTURE_GUIDE.md +73 -0
  54. package/api-testing-tujuhbelas/api-testing-enambelas/doc/CHANGELOG.md +77 -0
  55. package/api-testing-tujuhbelas/api-testing-enambelas/doc/CHEATSHEET.md +94 -0
  56. package/api-testing-tujuhbelas/api-testing-enambelas/doc/CLI.md +106 -0
  57. package/api-testing-tujuhbelas/api-testing-enambelas/doc/CONTRIBUTING.md +105 -0
  58. package/api-testing-tujuhbelas/api-testing-enambelas/doc/DEPLOYMENT.md +122 -0
  59. package/api-testing-tujuhbelas/api-testing-enambelas/doc/FAQ.md +81 -0
  60. package/api-testing-tujuhbelas/api-testing-enambelas/doc/FEATURES.md +165 -0
  61. package/api-testing-tujuhbelas/api-testing-enambelas/doc/GETTING_STARTED.md +108 -0
  62. package/api-testing-tujuhbelas/api-testing-enambelas/doc/INTRODUCTION.md +60 -0
  63. package/api-testing-tujuhbelas/api-testing-enambelas/doc/PACKAGES.md +66 -0
  64. package/api-testing-tujuhbelas/api-testing-enambelas/doc/PERFORMANCE.md +91 -0
  65. package/api-testing-tujuhbelas/api-testing-enambelas/doc/ROADMAP.md +93 -0
  66. package/api-testing-tujuhbelas/api-testing-enambelas/doc/SECURITY.md +93 -0
  67. package/api-testing-tujuhbelas/api-testing-enambelas/doc/STRUCTURE.md +90 -0
  68. package/api-testing-tujuhbelas/api-testing-enambelas/doc/TUTORIAL.md +192 -0
  69. package/api-testing-tujuhbelas/api-testing-enambelas/docker-compose.yml +24 -0
  70. package/api-testing-tujuhbelas/api-testing-enambelas/eslint.config.mjs +26 -0
  71. package/api-testing-tujuhbelas/api-testing-enambelas/framework.md +168 -0
  72. package/api-testing-tujuhbelas/api-testing-enambelas/nodemon.json +6 -0
  73. package/api-testing-tujuhbelas/api-testing-enambelas/package.json +106 -0
  74. package/api-testing-tujuhbelas/api-testing-enambelas/prisma/base.prisma.template +7 -0
  75. package/api-testing-tujuhbelas/api-testing-enambelas/prisma/schema.prisma +183 -0
  76. package/api-testing-tujuhbelas/api-testing-enambelas/prisma/seed.ts +411 -0
  77. package/api-testing-tujuhbelas/api-testing-enambelas/prisma.config.ts +15 -0
  78. package/api-testing-tujuhbelas/api-testing-enambelas/readme.md +414 -0
  79. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/check-update.js +92 -0
  80. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/compile-schema.js +29 -0
  81. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/config-clear.js +45 -0
  82. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/generate-jwt-secret.js +38 -0
  83. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/init-project.js +178 -0
  84. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/make-controller.js +205 -0
  85. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/make-model.js +42 -0
  86. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/make-module.js +158 -0
  87. package/api-testing-tujuhbelas/api-testing-enambelas/scripts/verify-rbac-functional.js +187 -0
  88. package/api-testing-tujuhbelas/api-testing-enambelas/src/controllers/authController.ts +469 -0
  89. package/api-testing-tujuhbelas/api-testing-enambelas/src/controllers/petController.ts +194 -0
  90. package/api-testing-tujuhbelas/api-testing-enambelas/src/controllers/rbacController.ts +478 -0
  91. package/api-testing-tujuhbelas/api-testing-enambelas/src/models/core.prisma +163 -0
  92. package/api-testing-tujuhbelas/api-testing-enambelas/src/models/pets.prisma +9 -0
  93. package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/auth.ts +74 -0
  94. package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/index.ts +10 -0
  95. package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/pets.ts +13 -0
  96. package/api-testing-tujuhbelas/api-testing-enambelas/src/routes/rbac.ts +42 -0
  97. package/api-testing-tujuhbelas/api-testing-enambelas/storage/logs/.gitkeep +0 -0
  98. package/api-testing-tujuhbelas/api-testing-enambelas/tsconfig.json +43 -0
  99. package/api-testing-tujuhbelas/doc/ARCHITECTURE_GUIDE.md +73 -0
  100. package/api-testing-tujuhbelas/doc/CHANGELOG.md +77 -0
  101. package/api-testing-tujuhbelas/doc/CHEATSHEET.md +94 -0
  102. package/api-testing-tujuhbelas/doc/CLI.md +106 -0
  103. package/api-testing-tujuhbelas/doc/CONTRIBUTING.md +105 -0
  104. package/api-testing-tujuhbelas/doc/DEPLOYMENT.md +122 -0
  105. package/api-testing-tujuhbelas/doc/FAQ.md +81 -0
  106. package/api-testing-tujuhbelas/doc/FEATURES.md +165 -0
  107. package/api-testing-tujuhbelas/doc/GETTING_STARTED.md +108 -0
  108. package/api-testing-tujuhbelas/doc/INTRODUCTION.md +60 -0
  109. package/api-testing-tujuhbelas/doc/PACKAGES.md +66 -0
  110. package/api-testing-tujuhbelas/doc/PERFORMANCE.md +91 -0
  111. package/api-testing-tujuhbelas/doc/ROADMAP.md +93 -0
  112. package/api-testing-tujuhbelas/doc/SECURITY.md +93 -0
  113. package/api-testing-tujuhbelas/doc/STRUCTURE.md +90 -0
  114. package/api-testing-tujuhbelas/doc/TUTORIAL.md +192 -0
  115. package/api-testing-tujuhbelas/docker-compose.yml +24 -0
  116. package/api-testing-tujuhbelas/eslint.config.mjs +26 -0
  117. package/api-testing-tujuhbelas/framework.md +168 -0
  118. package/api-testing-tujuhbelas/nodemon.json +6 -0
  119. package/api-testing-tujuhbelas/package-lock.json +5527 -0
  120. package/api-testing-tujuhbelas/package.json +106 -0
  121. package/api-testing-tujuhbelas/prisma/base.prisma.template +7 -0
  122. package/api-testing-tujuhbelas/prisma/migrations/20251227043210_init_setup/migration.sql +248 -0
  123. package/api-testing-tujuhbelas/prisma/migrations/migration_lock.toml +3 -0
  124. package/api-testing-tujuhbelas/prisma/schema.prisma +183 -0
  125. package/api-testing-tujuhbelas/prisma/seed.ts +411 -0
  126. package/api-testing-tujuhbelas/prisma.config.ts +15 -0
  127. package/api-testing-tujuhbelas/readme.md +414 -0
  128. package/api-testing-tujuhbelas/scripts/check-update.js +92 -0
  129. package/api-testing-tujuhbelas/scripts/compile-schema.js +29 -0
  130. package/api-testing-tujuhbelas/scripts/config-clear.js +45 -0
  131. package/api-testing-tujuhbelas/scripts/generate-jwt-secret.js +38 -0
  132. package/api-testing-tujuhbelas/scripts/init-project.js +178 -0
  133. package/api-testing-tujuhbelas/scripts/make-controller.js +205 -0
  134. package/api-testing-tujuhbelas/scripts/make-model.js +42 -0
  135. package/api-testing-tujuhbelas/scripts/make-module.js +158 -0
  136. package/api-testing-tujuhbelas/scripts/verify-rbac-functional.js +187 -0
  137. package/api-testing-tujuhbelas/src/controllers/authController.ts +469 -0
  138. package/api-testing-tujuhbelas/src/controllers/petController.ts +194 -0
  139. package/api-testing-tujuhbelas/src/controllers/rbacController.ts +478 -0
  140. package/api-testing-tujuhbelas/src/models/core.prisma +163 -0
  141. package/api-testing-tujuhbelas/src/models/pets.prisma +9 -0
  142. package/api-testing-tujuhbelas/src/routes/auth.ts +74 -0
  143. package/api-testing-tujuhbelas/src/routes/index.ts +10 -0
  144. package/api-testing-tujuhbelas/src/routes/pets.ts +13 -0
  145. package/api-testing-tujuhbelas/src/routes/rbac.ts +42 -0
  146. package/api-testing-tujuhbelas/storage/logs/.gitkeep +0 -0
  147. package/api-testing-tujuhbelas/tsconfig.json +43 -0
  148. package/bin/index.js +20 -2
  149. package/package.json +1 -1
@@ -0,0 +1,90 @@
1
+ # Bedah Struktur Proyek
2
+
3
+ Untuk memahami Lapeh Framework sepenuhnya, Anda perlu tahu apa fungsi setiap file dan folder. Berikut adalah "Tour" lengkap ke dalam direktori proyek.
4
+
5
+ ## Root Directory
6
+
7
+ | File/Folder | Deskripsi |
8
+ | :------------------- | :---------------------------------------------------------------------------- |
9
+ | `bin/` | Berisi script eksekusi untuk CLI (`npx lapeh`). Anda jarang menyentuh ini. |
10
+ | `doc/` | Dokumentasi proyek ini berada. |
11
+ | `lib/` | **Framework Core**. Bagian internal framework yang jarang Anda sentuh. |
12
+ | `prisma/` | Jantung konfigurasi Database. |
13
+ | `scripts/` | Kumpulan script Node.js untuk utility (generator, compiler schema, dll). |
14
+ | `src/` | **Source Code Utama**. 99% kodingan Anda ada di sini. |
15
+ | `.env` | Variabel rahasia (Database URL, API Keys). **Jangan commit file ini ke Git!** |
16
+ | `docker-compose.yml` | Konfigurasi Docker untuk menjalankan Database & Redis lokal. |
17
+ | `nodemon.json` | Konfigurasi auto-restart saat development. |
18
+ | `package.json` | Daftar library (dependencies) dan perintah (`npm run ...`). |
19
+ | `tsconfig.json` | Konfigurasi TypeScript. |
20
+
21
+ ## Folder `src/` (Source Code - User Space)
22
+
23
+ Ini adalah tempat Anda bekerja setiap hari.
24
+
25
+ ### `src/controllers/`
26
+
27
+ Berisi logika aplikasi. Controller menerima Request, memprosesnya, dan mengembalikan Response.
28
+
29
+ - **Contoh**: `authController.ts` menangani login/register.
30
+ - **Tips**: Jangan taruh _business logic_ yang terlalu kompleks di sini. Gunakan Service (opsional) jika controller sudah terlalu gemuk.
31
+
32
+ ### `src/models/`
33
+
34
+ Berisi definisi tabel database (Schema Prisma).
35
+
36
+ - **Unik di Lapeh**: Kami memecah `schema.prisma` yang besar menjadi file-file kecil per fitur (misal `user.prisma`, `product.prisma`) agar mudah di-manage. Script `prisma:migrate` akan menggabungkannya nanti.
37
+
38
+ ### `src/routes/`
39
+
40
+ Mendefinisikan URL endpoint.
41
+
42
+ - Menghubungkan URL (misal `/api/login`) ke fungsi di Controller.
43
+ - Menempelkan Middleware (misal `requireAuth`).
44
+
45
+ ## Folder `lib/` (Framework Internals)
46
+
47
+ Bagian ini mirip dengan `node_modules` atau folder `.next` di Next.js. Ini adalah mesin framework.
48
+
49
+ ### `lib/core/`
50
+
51
+ Bagian "Mesin" framework.
52
+
53
+ - `server.ts`: Setup Express App.
54
+ - `database.ts`: Instance Prisma Client.
55
+ - `redis.ts`: Koneksi Redis.
56
+ - `serializer.ts`: Logic caching JSON Schema.
57
+
58
+ ### `lib/middleware/`
59
+
60
+ Middleware bawaan framework.
61
+
62
+ - `auth.ts`: Cek JWT Token.
63
+ - `rateLimit.ts`: Batasi jumlah request.
64
+ - `requestLogger.ts`: Log setiap request yang masuk.
65
+
66
+ ### `lib/utils/`
67
+
68
+ Fungsi bantuan (Helper) bawaan.
69
+
70
+ - `validator.ts`: Validasi input ala Laravel.
71
+ - `response.ts`: Standar format JSON response (`sendFastSuccess`, `sendError`).
72
+ - `logger.ts`: Sistem logging (Winston).
73
+
74
+ ## Folder `prisma/`
75
+
76
+ - `migrations/`: History perubahan database (SQL file). Jangan diedit manual.
77
+ - `base.prisma.template`: Header dari schema database (berisi konfigurasi datasource db).
78
+ - `seed.ts`: Script untuk mengisi data awal (Data Seeding).
79
+
80
+ ## Folder `scripts/`
81
+
82
+ Script-script "Magic" yang dijalankan `npm run`.
83
+
84
+ - `make-controller.js`: Generator controller.
85
+ - `compile-schema.js`: Penggabung file `.prisma`.
86
+ - `init-project.js`: Wizard setup awal.
87
+
88
+ ---
89
+
90
+ Dengan memahami struktur ini, Anda tidak akan tersesat saat ingin menambah fitur baru atau mencari bug.
@@ -0,0 +1,192 @@
1
+ # Tutorial: Membangun API Perpustakaan
2
+
3
+ Dalam tutorial ini, kita akan membangun fitur "Manajemen Buku" sederhana menggunakan semua fitur unggulan Lapeh Framework:
4
+ 1. **CLI** untuk generate kode.
5
+ 2. **Validator** untuk validasi input.
6
+ 3. **Fast Serialization** untuk respon cepat.
7
+ 4. **RBAC** untuk proteksi delete (Admin only).
8
+
9
+ ## Langkah 1: Generate Model Database
10
+
11
+ Kita butuh tabel `books`. Gunakan CLI `make:model`.
12
+
13
+ ```bash
14
+ npm run make:model Book
15
+ ```
16
+
17
+ File baru akan muncul di `src/models/book.prisma`. Edit file tersebut:
18
+
19
+ ```prisma
20
+ // src/models/book.prisma
21
+
22
+ model Book {
23
+ id BigInt @id @default(autoincrement())
24
+ title String
25
+ author String
26
+ isbn String @unique
27
+ publishedAt DateTime
28
+ stock Int @default(0)
29
+ created_at DateTime @default(now())
30
+ updated_at DateTime @updatedAt
31
+
32
+ @@map("books")
33
+ }
34
+ ```
35
+
36
+ Terapkan perubahan ke database:
37
+
38
+ ```bash
39
+ npm run prisma:migrate
40
+ ```
41
+
42
+ ## Langkah 2: Generate Module (Controller & Route)
43
+
44
+ Kita buat controller dan route sekaligus.
45
+
46
+ ```bash
47
+ npm run make:module Book
48
+ ```
49
+
50
+ Framework akan membuat:
51
+ - `src/controllers/bookController.ts`
52
+ - `src/routes/book.ts`
53
+
54
+ ## Langkah 3: Implementasi Controller
55
+
56
+ Buka `src/controllers/bookController.ts` dan kita implementasikan fitur **Create** dan **List** dengan standar framework.
57
+
58
+ ### Setup Import & Serializer
59
+
60
+ ```typescript
61
+ import { Request, Response } from "express";
62
+ import { prisma } from "@/core/database";
63
+ import { sendFastSuccess, sendError } from "@/utils/response";
64
+ import { Validator } from "@/utils/validator";
65
+ import { getSerializer, createResponseSchema } from "@/core/serializer";
66
+
67
+ // 1. Definisikan Schema Output (untuk Fastify Serialization)
68
+ const bookSchema = {
69
+ type: "object",
70
+ properties: {
71
+ id: { type: "string" }, // BigInt -> String
72
+ title: { type: "string" },
73
+ author: { type: "string" },
74
+ isbn: { type: "string" },
75
+ stock: { type: "number" }
76
+ }
77
+ };
78
+
79
+ // 2. Buat Serializer
80
+ const bookDetailSerializer = getSerializer("book-detail", createResponseSchema(bookSchema));
81
+ const bookListSerializer = getSerializer("book-list", createResponseSchema({
82
+ type: "array",
83
+ items: bookSchema
84
+ }));
85
+ ```
86
+
87
+ ### Implementasi Create (dengan Validasi)
88
+
89
+ ```typescript
90
+ export async function createBook(req: Request, res: Response) {
91
+ // 1. Validasi Input
92
+ const validator = await Validator.make(req.body, {
93
+ title: "required|string|min:3",
94
+ author: "required|string",
95
+ isbn: "required|string|unique:books,isbn", // Cek unik di tabel books
96
+ stock: "required|number|min:1",
97
+ publishedAt: "required|string" // Format tanggal ISO
98
+ });
99
+
100
+ if (validator.fails()) {
101
+ return sendError(res, 400, "Validation Error", validator.errors());
102
+ }
103
+
104
+ const data = validator.validated();
105
+
106
+ // 2. Simpan ke Database
107
+ const book = await prisma.book.create({
108
+ data: {
109
+ title: data.title,
110
+ author: data.author,
111
+ isbn: data.isbn,
112
+ stock: data.stock,
113
+ publishedAt: new Date(data.publishedAt)
114
+ }
115
+ });
116
+
117
+ // 3. Return Response Cepat
118
+ return sendFastSuccess(res, 201, bookDetailSerializer, {
119
+ status: "success",
120
+ message: "Buku berhasil ditambahkan",
121
+ data: { ...book, id: book.id.toString() } // Konversi BigInt manual jika perlu
122
+ });
123
+ }
124
+ ```
125
+
126
+ ### Implementasi List (High Performance)
127
+
128
+ ```typescript
129
+ export async function getBooks(req: Request, res: Response) {
130
+ const books = await prisma.book.findMany({
131
+ take: 50, // Limit 50
132
+ orderBy: { created_at: "desc" }
133
+ });
134
+
135
+ // Convert BigInt to string sebelum passing ke serializer (opsional, tapi aman)
136
+ const safeBooks = books.map(b => ({ ...b, id: b.id.toString() }));
137
+
138
+ return sendFastSuccess(res, 200, bookListSerializer, {
139
+ status: "success",
140
+ message: "Daftar buku",
141
+ data: safeBooks
142
+ });
143
+ }
144
+ ```
145
+
146
+ ## Langkah 4: Daftarkan Route & Proteksi
147
+
148
+ Buka `src/routes/book.ts` (atau file yang digenerate). Pastikan route terhubung dan tambahkan middleware auth.
149
+
150
+ ```typescript
151
+ import { Router } from "express";
152
+ import { createBook, getBooks } from "../controllers/bookController";
153
+ import { requireAuth, requireAdmin } from "../middleware/auth";
154
+
155
+ export const bookRouter = Router();
156
+
157
+ // Public route (bisa diakses siapa saja)
158
+ bookRouter.get("/", getBooks);
159
+
160
+ // Admin only (Butuh login + role admin)
161
+ bookRouter.post("/", requireAuth, requireAdmin, createBook);
162
+ ```
163
+
164
+ Terakhir, daftarkan router ini di `src/routes/index.ts` (jika belum otomatis):
165
+
166
+ ```typescript
167
+ import { bookRouter } from "./book";
168
+ // ...
169
+ router.use("/books", bookRouter);
170
+ ```
171
+
172
+ ## Langkah 5: Testing
173
+
174
+ Jalankan server:
175
+ ```bash
176
+ npm run dev
177
+ ```
178
+
179
+ Coba hit endpoint:
180
+ 1. **POST /api/books** (Tanpa token) -> 401 Unauthorized.
181
+ 2. **POST /api/books** (Token User Biasa) -> 403 Forbidden.
182
+ 3. **POST /api/books** (Token Admin + Data Invalid) -> 400 Validation Error.
183
+ 4. **POST /api/books** (Token Admin + Data Valid) -> 201 Created.
184
+ 5. **GET /api/books** -> 200 OK (Super Cepat).
185
+
186
+ ## Kesimpulan
187
+
188
+ Dengan Lapeh Framework, Anda telah membuat API yang:
189
+ - **Aman** (Validasi, Auth, RBAC).
190
+ - **Cepat** (Fast Serialization).
191
+ - **Rapi** (Struktur terstandarisasi).
192
+ - **Mudah** (CLI Generator).
@@ -0,0 +1,24 @@
1
+ version: "3.9"
2
+ services:
3
+ redis:
4
+ image: redis:7-alpine
5
+ command:
6
+ - "redis-server"
7
+ - "--appendonly"
8
+ - "yes"
9
+ - "--user"
10
+ - "default on >12341234 ~* +@all"
11
+ - "--user"
12
+ - "lapeh on >12341234 ~* +@all"
13
+ ports:
14
+ - "6379:6379"
15
+ volumes:
16
+ - redis_data:/data
17
+ healthcheck:
18
+ test: ["CMD", "redis-cli", "ping"]
19
+ interval: 10s
20
+ timeout: 5s
21
+ retries: 5
22
+
23
+ volumes:
24
+ redis_data:
@@ -0,0 +1,26 @@
1
+ import globals from "globals";
2
+ import pluginJs from "@eslint/js";
3
+ import tseslint from "typescript-eslint";
4
+
5
+ export default [
6
+ { files: ["**/*.{js,mjs,cjs,ts}"] },
7
+ { languageOptions: { globals: globals.node } },
8
+ pluginJs.configs.recommended,
9
+ ...tseslint.configs.recommended,
10
+ {
11
+ rules: {
12
+ "@typescript-eslint/no-unused-vars": [
13
+ "error",
14
+ {
15
+ "argsIgnorePattern": "^_",
16
+ "varsIgnorePattern": "^_",
17
+ "caughtErrorsIgnorePattern": "^_"
18
+ }
19
+ ],
20
+ "@typescript-eslint/no-explicit-any": "warn"
21
+ }
22
+ },
23
+ {
24
+ ignores: ["dist/", "node_modules/", "generated/", "scripts/"]
25
+ }
26
+ ];
@@ -0,0 +1,168 @@
1
+ # Lapeh Framework
2
+
3
+ ## Quick Start
4
+
5
+ Untuk memulai project ini (Setup awal):
6
+
7
+ ```bash
8
+ npm i
9
+ ```
10
+
11
+ ```bash
12
+ npm run first
13
+ ```
14
+
15
+ Perintah di atas akan secara otomatis melakukan:
16
+
17
+ 1. Copy `.env.example` ke `.env`
18
+ 2. Install dependencies (`npm install`)
19
+ 3. Generate JWT Secret baru di `.env`
20
+ 4. Setup database (Migrate)
21
+ 5. Menjalankan Database Seeder
22
+
23
+ Setelah selesai, Anda bisa langsung menjalankan project:
24
+
25
+ ```bash
26
+ npm run dev
27
+ ```
28
+
29
+ ### Akun Default
30
+
31
+ Jika seeder dijalankan (via `npm run first` atau `npm run db:seed`), gunakan akun berikut:
32
+
33
+ - **Super Admin**: `sa@sa.com` / `string`
34
+ - **Admin**: `a@a.com` / `string`
35
+ - **User**: `u@u.com` / `string`
36
+
37
+ ## Code Standards & Best Practices (Baru)
38
+
39
+ ### 1. Import Path Aliases
40
+ Gunakan alias `@/` untuk mengimpor module dari folder `src/`. Hindari relative path yang panjang seperti `../../utils/response`.
41
+
42
+ **Contoh:**
43
+ ```typescript
44
+ // ✅ Benar (Recommended)
45
+ import { prisma } from "@/core/database";
46
+ import { sendSuccess } from "@/utils/response";
47
+
48
+ // ❌ Salah (Legacy)
49
+ import { prisma } from "../core/database";
50
+ import { sendSuccess } from "../../utils/response";
51
+ ```
52
+
53
+ ### 2. Strict Linting (Dead Code Elimination)
54
+ Framework ini menerapkan aturan linter yang ketat untuk menjaga kebersihan kode. Variabel, parameter, atau import yang tidak digunakan akan menyebabkan error.
55
+
56
+ - **Variabel tidak terpakai**: Hapus atau beri prefix `_` (underscore).
57
+ ```typescript
58
+ // ✅ Benar
59
+ const _unusedVariable = 123;
60
+ function example(_req: Request, res: Response) { ... }
61
+
62
+ // ❌ Error
63
+ const unusedVariable = 123;
64
+ function example(req: Request, res: Response) { ... } // jika req tidak dipakai
65
+ ```
66
+
67
+ ### 3. High Performance Response (Fastify-Style)
68
+ Untuk endpoint dengan throughput tinggi (GET lists, data besar), gunakan `sendFastSuccess` dengan JSON Schema serializer. Ini 2-3x lebih cepat dari `res.json` standar Express.
69
+
70
+ **Langkah-langkah:**
71
+
72
+ 1. **Definisikan Schema** (sesuai field Prisma):
73
+ ```typescript
74
+ const userSchema = {
75
+ type: "object",
76
+ properties: {
77
+ id: { type: "string" }, // BigInt otomatis dicovert ke string
78
+ name: { type: "string" },
79
+ email: { type: "string" }
80
+ }
81
+ };
82
+ ```
83
+
84
+ 2. **Buat Serializer**:
85
+ ```typescript
86
+ import { getSerializer, createResponseSchema } from "@/core/serializer";
87
+
88
+ const userSerializer = getSerializer("user-detail", createResponseSchema(userSchema));
89
+ ```
90
+
91
+ 3. **Gunakan di Controller**:
92
+ ```typescript
93
+ import { sendFastSuccess } from "@/utils/response";
94
+
95
+ export async function getUser(req, res) {
96
+ const user = await prisma.user.findFirst();
97
+ sendFastSuccess(res, 200, userSerializer, {
98
+ status: "success",
99
+ message: "User found",
100
+ data: user
101
+ });
102
+ }
103
+ ```
104
+
105
+ ## Database Workflow (Prisma)
106
+
107
+ Framework ini menggunakan **Prisma ORM** dengan struktur schema yang modular (dipecah per file). Berikut adalah panduan lengkap dari Development hingga Deployment.
108
+
109
+ ### 1. Development (Lokal)
110
+
111
+ Saat mengembangkan aplikasi di local environment:
112
+
113
+ **a. Mengupdate Schema Database**
114
+ Jika Anda mengubah file schema di `src/models/*.prisma` atau konfigurasi di `prisma/base.prisma.template`:
115
+
116
+ ```bash
117
+ npm run prisma:migrate
118
+ ```
119
+
120
+ _Perintah ini akan menggabungkan semua file schema, membuat file migrasi baru, menerapkan ke database lokal, dan men-generate ulang Prisma Client._
121
+
122
+ **b. Melihat/Edit Data (GUI)**
123
+ Untuk membuka dashboard visual database:
124
+
125
+ ```bash
126
+ npm run db:studio
127
+ ```
128
+
129
+ **c. Mengisi Data Awal (Seeding)**
130
+ Jika Anda butuh data dummy atau data awal (seperti roles/permissions):
131
+
132
+ ```bash
133
+ npm run db:seed
134
+ ```
135
+
136
+ **d. Reset Database Total**
137
+ Jika database berantakan dan ingin mengulang dari awal (HATI-HATI: Menghapus semua data):
138
+
139
+ ```bash
140
+ npm run db:reset
141
+ ```
142
+
143
+ _Perintah ini akan menghapus database, membuat ulang schema dari awal, dan otomatis menjalankan seeder._
144
+
145
+ ---
146
+
147
+ ### 2. Deployment (Production)
148
+
149
+ Saat deploy ke server production:
150
+
151
+ **a. Setup Awal**
152
+ Pastikan `.env` di production sudah disetup dengan benar (DATABASE_URL, dll).
153
+
154
+ **b. Menerapkan Migrasi**
155
+ Jangan gunakan `migrate dev` di production. Gunakan perintah ini:
156
+
157
+ ```bash
158
+ npm run prisma:deploy
159
+ ```
160
+
161
+ _Perintah ini hanya akan menerapkan file migrasi yang sudah ada ke database production tanpa mereset data atau meminta konfirmasi interaktif._
162
+
163
+ **c. Generate Client (Opsional)**
164
+ Biasanya dilakukan otomatis saat `npm install` (karena `postinstall`), tapi jika perlu manual:
165
+
166
+ ```bash
167
+ npm run prisma:generate
168
+ ```
@@ -0,0 +1,6 @@
1
+ {
2
+ "watch": ["src", ".env"],
3
+ "ext": "ts,json",
4
+ "ignore": ["src/**/*.test.ts"],
5
+ "exec": "ts-node -r tsconfig-paths/register src/index.ts"
6
+ }