lapeh 2.6.17 → 3.0.2
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/.env.example +1 -6
- package/README.md +19 -85
- package/bin/index.js +84 -180
- package/dist/lib/bootstrap.d.ts.map +1 -1
- package/dist/lib/bootstrap.js +17 -16
- package/dist/lib/core/store.d.ts +55 -0
- package/dist/lib/core/store.d.ts.map +1 -0
- package/dist/lib/core/store.js +66 -0
- package/dist/lib/middleware/error.d.ts.map +1 -1
- package/dist/lib/middleware/error.js +1 -20
- package/dist/lib/utils/validator.d.ts.map +1 -1
- package/dist/lib/utils/validator.js +3 -32
- package/dist/src/modules/Auth/auth.controller.d.ts.map +1 -1
- package/dist/src/modules/Auth/auth.controller.js +118 -105
- package/dist/src/modules/Rbac/rbac.controller.d.ts.map +1 -1
- package/dist/src/modules/Rbac/rbac.controller.js +141 -140
- package/dist/src/routes/index.d.ts.map +1 -1
- package/dist/src/routes/index.js +0 -5
- package/doc/en/CHEATSHEET.md +3 -7
- package/doc/en/CLI.md +16 -41
- package/doc/en/DEPLOYMENT.md +171 -245
- package/doc/en/GETTING_STARTED.md +1 -25
- package/doc/en/PACKAGES.md +2 -3
- package/doc/en/STRUCTURE.md +1 -11
- package/doc/en/TUTORIAL.md +61 -119
- package/doc/id/CHANGELOG.md +16 -0
- package/doc/id/CHEATSHEET.md +0 -4
- package/doc/id/CLI.md +19 -54
- package/doc/id/DEPLOYMENT.md +171 -245
- package/doc/id/GETTING_STARTED.md +91 -115
- package/doc/id/PACKAGES.md +0 -1
- package/doc/id/STRUCTURE.md +1 -11
- package/doc/id/TUTORIAL.md +51 -109
- package/gitignore.template +0 -10
- package/lib/bootstrap.ts +39 -38
- package/lib/core/store.ts +116 -0
- package/lib/middleware/error.ts +1 -21
- package/lib/utils/validator.ts +3 -39
- package/package.json +4 -18
- package/scripts/init-project.js +2 -108
- package/scripts/make-module.js +1 -12
- package/scripts/seed-json.js +158 -0
- package/src/modules/Auth/auth.controller.ts +156 -106
- package/src/modules/Rbac/rbac.controller.ts +193 -138
- package/src/routes/index.ts +0 -3
- package/src/routes/rbac.ts +42 -42
- package/storage/logs/.0337f5062fe676994d1dc340156e089444e3d6e0-audit.json +5 -10
- package/storage/logs/lapeh-2025-12-30.log +1093 -0
- package/tsconfig.build.json +1 -3
- package/tsconfig.json +0 -1
- package/lib/core/database.ts +0 -5
- package/prisma/base.prisma.template +0 -8
- package/prisma/migrations/20251225163737_init/migration.sql +0 -236
- package/prisma/migrations/20251226000329_create_pets_table/migration.sql +0 -11
- package/prisma/migrations/20251226001249_create_pets_table/migration.sql +0 -82
- package/prisma/migrations/20251226001717_restore_core_models/migration.sql +0 -236
- package/prisma/migrations/migration_lock.toml +0 -3
- package/prisma/schema.prisma +0 -197
- package/prisma/seed.ts +0 -411
- package/scripts/compile-schema.js +0 -64
- package/src/modules/Auth/auth.prisma +0 -106
- package/src/modules/Pets/pets.controller.ts +0 -238
- package/src/modules/Pets/pets.prisma +0 -9
- package/src/modules/Rbac/rbac.prisma +0 -68
- package/src/routes/pets.ts +0 -13
- package/storage/logs/lapeh-2025-12-26.log +0 -88
- package/storage/logs/lapeh-2025-12-27.log +0 -217
|
@@ -14,7 +14,7 @@ exports.assignPermissionToRole = assignPermissionToRole;
|
|
|
14
14
|
exports.removePermissionFromRole = removePermissionFromRole;
|
|
15
15
|
exports.assignPermissionToUser = assignPermissionToUser;
|
|
16
16
|
exports.removePermissionFromUser = removePermissionFromUser;
|
|
17
|
-
const
|
|
17
|
+
const store_1 = require("../../../lib/core/store");
|
|
18
18
|
const response_1 = require("../../../lib/utils/response");
|
|
19
19
|
const validator_1 = require("../../../lib/utils/validator");
|
|
20
20
|
const zod_1 = require("zod");
|
|
@@ -59,16 +59,21 @@ async function createRole(req, res) {
|
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
61
|
const { name, slug, description } = await validator.validated();
|
|
62
|
-
// Manual unique check
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
62
|
+
// Manual unique check
|
|
63
|
+
if (store_1.roles.find((r) => r.slug === slug)) {
|
|
64
|
+
(0, response_1.sendError)(res, 422, "Validation error", { slug: "Slug already exists" });
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const role = {
|
|
68
|
+
id: (0, store_1.generateId)(),
|
|
69
|
+
name,
|
|
70
|
+
slug,
|
|
71
|
+
description: description || null,
|
|
72
|
+
created_at: new Date(),
|
|
73
|
+
updated_at: new Date(),
|
|
74
|
+
};
|
|
75
|
+
store_1.roles.push(role);
|
|
76
|
+
(0, store_1.saveStore)();
|
|
72
77
|
(0, response_1.sendFastSuccess)(res, 201, roleSerializer, {
|
|
73
78
|
status: "success",
|
|
74
79
|
message: "Role created",
|
|
@@ -76,10 +81,7 @@ async function createRole(req, res) {
|
|
|
76
81
|
});
|
|
77
82
|
}
|
|
78
83
|
async function listRoles(_req, res) {
|
|
79
|
-
const
|
|
80
|
-
orderBy: { id: "asc" },
|
|
81
|
-
});
|
|
82
|
-
const serialized = roles.map((r) => ({ ...r, id: r.id.toString() }));
|
|
84
|
+
const serialized = store_1.roles.map((r) => ({ ...r, id: r.id.toString() }));
|
|
83
85
|
(0, response_1.sendFastSuccess)(res, 200, roleListSerializer, {
|
|
84
86
|
status: "success",
|
|
85
87
|
message: "Roles list",
|
|
@@ -99,21 +101,27 @@ async function updateRole(req, res) {
|
|
|
99
101
|
return;
|
|
100
102
|
}
|
|
101
103
|
const { name, slug, description } = await validator.validated();
|
|
102
|
-
const
|
|
103
|
-
if (
|
|
104
|
+
const roleIndex = store_1.roles.findIndex((r) => r.id === roleId);
|
|
105
|
+
if (roleIndex === -1) {
|
|
104
106
|
(0, response_1.sendError)(res, 404, "Role not found");
|
|
105
107
|
return;
|
|
106
108
|
}
|
|
107
|
-
// Manual unique check
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
109
|
+
// Manual unique check for update
|
|
110
|
+
if (slug &&
|
|
111
|
+
slug !== store_1.roles[roleIndex].slug &&
|
|
112
|
+
store_1.roles.find((r) => r.slug === slug)) {
|
|
113
|
+
(0, response_1.sendError)(res, 422, "Validation error", { slug: "Slug already exists" });
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
store_1.roles[roleIndex] = {
|
|
117
|
+
...store_1.roles[roleIndex],
|
|
118
|
+
name: name ?? store_1.roles[roleIndex].name,
|
|
119
|
+
slug: slug ?? store_1.roles[roleIndex].slug,
|
|
120
|
+
description: description ?? store_1.roles[roleIndex].description,
|
|
121
|
+
updated_at: new Date(),
|
|
122
|
+
};
|
|
123
|
+
(0, store_1.saveStore)();
|
|
124
|
+
const updated = store_1.roles[roleIndex];
|
|
117
125
|
(0, response_1.sendFastSuccess)(res, 200, roleSerializer, {
|
|
118
126
|
status: "success",
|
|
119
127
|
message: "Role updated",
|
|
@@ -123,14 +131,25 @@ async function updateRole(req, res) {
|
|
|
123
131
|
async function deleteRole(req, res) {
|
|
124
132
|
const { id } = req.params;
|
|
125
133
|
const roleId = id;
|
|
126
|
-
const
|
|
127
|
-
if (
|
|
134
|
+
const roleIndex = store_1.roles.findIndex((r) => r.id === roleId);
|
|
135
|
+
if (roleIndex === -1) {
|
|
128
136
|
(0, response_1.sendError)(res, 404, "Role not found");
|
|
129
137
|
return;
|
|
130
138
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
139
|
+
// Clean up relationships
|
|
140
|
+
// Remove from role_permissions
|
|
141
|
+
for (let i = store_1.role_permissions.length - 1; i >= 0; i--) {
|
|
142
|
+
if (store_1.role_permissions[i].role_id === roleId) {
|
|
143
|
+
store_1.role_permissions.splice(i, 1);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Remove from user_roles
|
|
147
|
+
for (let i = store_1.user_roles.length - 1; i >= 0; i--) {
|
|
148
|
+
if (store_1.user_roles[i].role_id === roleId) {
|
|
149
|
+
store_1.user_roles.splice(i, 1);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
store_1.roles.splice(roleIndex, 1);
|
|
134
153
|
(0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
|
|
135
154
|
status: "success",
|
|
136
155
|
message: "Role deleted",
|
|
@@ -148,16 +167,21 @@ async function createPermission(req, res) {
|
|
|
148
167
|
return;
|
|
149
168
|
}
|
|
150
169
|
const { name, slug, description } = await validator.validated();
|
|
151
|
-
// Manual unique check
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
170
|
+
// Manual unique check
|
|
171
|
+
if (store_1.permissions.find((p) => p.slug === slug)) {
|
|
172
|
+
(0, response_1.sendError)(res, 422, "Validation error", { slug: "Slug already exists" });
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const permission = {
|
|
176
|
+
id: (0, store_1.generateId)(),
|
|
177
|
+
name,
|
|
178
|
+
slug,
|
|
179
|
+
description: description || null,
|
|
180
|
+
created_at: new Date(),
|
|
181
|
+
updated_at: new Date(),
|
|
182
|
+
};
|
|
183
|
+
store_1.permissions.push(permission);
|
|
184
|
+
(0, store_1.saveStore)();
|
|
161
185
|
(0, response_1.sendFastSuccess)(res, 201, permissionSerializer, {
|
|
162
186
|
status: "success",
|
|
163
187
|
message: "Permission created",
|
|
@@ -165,10 +189,7 @@ async function createPermission(req, res) {
|
|
|
165
189
|
});
|
|
166
190
|
}
|
|
167
191
|
async function listPermissions(_req, res) {
|
|
168
|
-
const
|
|
169
|
-
orderBy: { id: "asc" },
|
|
170
|
-
});
|
|
171
|
-
const serialized = permissions.map((p) => ({
|
|
192
|
+
const serialized = store_1.permissions.map((p) => ({
|
|
172
193
|
...p,
|
|
173
194
|
id: p.id.toString(),
|
|
174
195
|
}));
|
|
@@ -191,23 +212,26 @@ async function updatePermission(req, res) {
|
|
|
191
212
|
return;
|
|
192
213
|
}
|
|
193
214
|
const { name, slug, description } = await validator.validated();
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
});
|
|
197
|
-
if (!permission) {
|
|
215
|
+
const permIndex = store_1.permissions.findIndex((p) => p.id === permissionId);
|
|
216
|
+
if (permIndex === -1) {
|
|
198
217
|
(0, response_1.sendError)(res, 404, "Permission not found");
|
|
199
218
|
return;
|
|
200
219
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
220
|
+
if (slug &&
|
|
221
|
+
slug !== store_1.permissions[permIndex].slug &&
|
|
222
|
+
store_1.permissions.find((p) => p.slug === slug)) {
|
|
223
|
+
(0, response_1.sendError)(res, 422, "Validation error", { slug: "Slug already exists" });
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
store_1.permissions[permIndex] = {
|
|
227
|
+
...store_1.permissions[permIndex],
|
|
228
|
+
name: name ?? store_1.permissions[permIndex].name,
|
|
229
|
+
slug: slug ?? store_1.permissions[permIndex].slug,
|
|
230
|
+
description: description ?? store_1.permissions[permIndex].description,
|
|
231
|
+
updated_at: new Date(),
|
|
232
|
+
};
|
|
233
|
+
(0, store_1.saveStore)();
|
|
234
|
+
const updated = store_1.permissions[permIndex];
|
|
211
235
|
(0, response_1.sendFastSuccess)(res, 200, permissionSerializer, {
|
|
212
236
|
status: "success",
|
|
213
237
|
message: "Permission updated",
|
|
@@ -217,20 +241,24 @@ async function updatePermission(req, res) {
|
|
|
217
241
|
async function deletePermission(req, res) {
|
|
218
242
|
const { id } = req.params;
|
|
219
243
|
const permissionId = id;
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
});
|
|
223
|
-
if (!permission) {
|
|
244
|
+
const permIndex = store_1.permissions.findIndex((p) => p.id === permissionId);
|
|
245
|
+
if (permIndex === -1) {
|
|
224
246
|
(0, response_1.sendError)(res, 404, "Permission not found");
|
|
225
247
|
return;
|
|
226
248
|
}
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
}
|
|
233
|
-
|
|
249
|
+
// Clean up relationships
|
|
250
|
+
for (let i = store_1.role_permissions.length - 1; i >= 0; i--) {
|
|
251
|
+
if (store_1.role_permissions[i].permission_id === permissionId) {
|
|
252
|
+
store_1.role_permissions.splice(i, 1);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
for (let i = store_1.user_permissions.length - 1; i >= 0; i--) {
|
|
256
|
+
if (store_1.user_permissions[i].permission_id === permissionId) {
|
|
257
|
+
store_1.user_permissions.splice(i, 1);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
store_1.permissions.splice(permIndex, 1);
|
|
261
|
+
(0, store_1.saveStore)();
|
|
234
262
|
(0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
|
|
235
263
|
status: "success",
|
|
236
264
|
message: "Permission deleted",
|
|
@@ -247,34 +275,26 @@ async function assignRoleToUser(req, res) {
|
|
|
247
275
|
return;
|
|
248
276
|
}
|
|
249
277
|
const { userId, roleId } = await validator.validated();
|
|
250
|
-
const user =
|
|
251
|
-
where: { id: userId },
|
|
252
|
-
});
|
|
278
|
+
const user = store_1.users.find((u) => u.id === userId);
|
|
253
279
|
if (!user) {
|
|
254
280
|
(0, response_1.sendError)(res, 404, "User not found");
|
|
255
281
|
return;
|
|
256
282
|
}
|
|
257
|
-
const role =
|
|
258
|
-
where: { id: roleId },
|
|
259
|
-
});
|
|
283
|
+
const role = store_1.roles.find((r) => r.id === roleId);
|
|
260
284
|
if (!role) {
|
|
261
285
|
(0, response_1.sendError)(res, 404, "Role not found");
|
|
262
286
|
return;
|
|
263
287
|
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
role_id: roleId,
|
|
269
|
-
},
|
|
270
|
-
},
|
|
271
|
-
create: {
|
|
288
|
+
const exists = store_1.user_roles.find((ur) => ur.user_id === userId && ur.role_id === roleId);
|
|
289
|
+
if (!exists) {
|
|
290
|
+
store_1.user_roles.push({
|
|
291
|
+
id: (0, store_1.generateId)(),
|
|
272
292
|
user_id: userId,
|
|
273
293
|
role_id: roleId,
|
|
274
294
|
created_at: new Date(),
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
}
|
|
295
|
+
});
|
|
296
|
+
(0, store_1.saveStore)();
|
|
297
|
+
}
|
|
278
298
|
(0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
|
|
279
299
|
status: "success",
|
|
280
300
|
message: "Role assigned to user",
|
|
@@ -291,12 +311,11 @@ async function removeRoleFromUser(req, res) {
|
|
|
291
311
|
return;
|
|
292
312
|
}
|
|
293
313
|
const { userId, roleId } = await validator.validated();
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
});
|
|
314
|
+
for (let i = store_1.user_roles.length - 1; i >= 0; i--) {
|
|
315
|
+
if (store_1.user_roles[i].user_id === userId && store_1.user_roles[i].role_id === roleId) {
|
|
316
|
+
store_1.user_roles.splice(i, 1);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
300
319
|
(0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
|
|
301
320
|
status: "success",
|
|
302
321
|
message: "Role removed from user",
|
|
@@ -313,34 +332,26 @@ async function assignPermissionToRole(req, res) {
|
|
|
313
332
|
return;
|
|
314
333
|
}
|
|
315
334
|
const { roleId, permissionId } = await validator.validated();
|
|
316
|
-
const role =
|
|
317
|
-
where: { id: roleId },
|
|
318
|
-
});
|
|
335
|
+
const role = store_1.roles.find((r) => r.id === roleId);
|
|
319
336
|
if (!role) {
|
|
320
337
|
(0, response_1.sendError)(res, 404, "Role not found");
|
|
321
338
|
return;
|
|
322
339
|
}
|
|
323
|
-
const permission =
|
|
324
|
-
where: { id: permissionId },
|
|
325
|
-
});
|
|
340
|
+
const permission = store_1.permissions.find((p) => p.id === permissionId);
|
|
326
341
|
if (!permission) {
|
|
327
342
|
(0, response_1.sendError)(res, 404, "Permission not found");
|
|
328
343
|
return;
|
|
329
344
|
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
permission_id: permissionId,
|
|
335
|
-
},
|
|
336
|
-
},
|
|
337
|
-
create: {
|
|
345
|
+
const exists = store_1.role_permissions.find((rp) => rp.role_id === roleId && rp.permission_id === permissionId);
|
|
346
|
+
if (!exists) {
|
|
347
|
+
store_1.role_permissions.push({
|
|
348
|
+
id: (0, store_1.generateId)(),
|
|
338
349
|
role_id: roleId,
|
|
339
350
|
permission_id: permissionId,
|
|
340
351
|
created_at: new Date(),
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
}
|
|
352
|
+
});
|
|
353
|
+
(0, store_1.saveStore)();
|
|
354
|
+
}
|
|
344
355
|
(0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
|
|
345
356
|
status: "success",
|
|
346
357
|
message: "Permission assigned to role",
|
|
@@ -357,12 +368,12 @@ async function removePermissionFromRole(req, res) {
|
|
|
357
368
|
return;
|
|
358
369
|
}
|
|
359
370
|
const { roleId, permissionId } = await validator.validated();
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
}
|
|
365
|
-
}
|
|
371
|
+
for (let i = store_1.role_permissions.length - 1; i >= 0; i--) {
|
|
372
|
+
if (store_1.role_permissions[i].role_id === roleId &&
|
|
373
|
+
store_1.role_permissions[i].permission_id === permissionId) {
|
|
374
|
+
store_1.role_permissions.splice(i, 1);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
366
377
|
(0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
|
|
367
378
|
status: "success",
|
|
368
379
|
message: "Permission removed from role",
|
|
@@ -379,34 +390,25 @@ async function assignPermissionToUser(req, res) {
|
|
|
379
390
|
return;
|
|
380
391
|
}
|
|
381
392
|
const { userId, permissionId } = await validator.validated();
|
|
382
|
-
const user =
|
|
383
|
-
where: { id: userId },
|
|
384
|
-
});
|
|
393
|
+
const user = store_1.users.find((u) => u.id === userId);
|
|
385
394
|
if (!user) {
|
|
386
395
|
(0, response_1.sendError)(res, 404, "User not found");
|
|
387
396
|
return;
|
|
388
397
|
}
|
|
389
|
-
const permission =
|
|
390
|
-
where: { id: permissionId },
|
|
391
|
-
});
|
|
398
|
+
const permission = store_1.permissions.find((p) => p.id === permissionId);
|
|
392
399
|
if (!permission) {
|
|
393
400
|
(0, response_1.sendError)(res, 404, "Permission not found");
|
|
394
401
|
return;
|
|
395
402
|
}
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
permission_id: permissionId,
|
|
401
|
-
},
|
|
402
|
-
},
|
|
403
|
-
create: {
|
|
403
|
+
const exists = store_1.user_permissions.find((up) => up.user_id === userId && up.permission_id === permissionId);
|
|
404
|
+
if (!exists) {
|
|
405
|
+
store_1.user_permissions.push({
|
|
406
|
+
id: (0, store_1.generateId)(),
|
|
404
407
|
user_id: userId,
|
|
405
408
|
permission_id: permissionId,
|
|
406
409
|
created_at: new Date(),
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
});
|
|
410
|
+
});
|
|
411
|
+
}
|
|
410
412
|
(0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
|
|
411
413
|
status: "success",
|
|
412
414
|
message: "Permission assigned to user",
|
|
@@ -423,12 +425,11 @@ async function removePermissionFromUser(req, res) {
|
|
|
423
425
|
return;
|
|
424
426
|
}
|
|
425
427
|
const { userId, permissionId } = await validator.validated();
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
});
|
|
428
|
+
const index = store_1.user_permissions.findIndex((up) => up.user_id === userId && up.permission_id === permissionId);
|
|
429
|
+
if (index !== -1) {
|
|
430
|
+
store_1.user_permissions.splice(index, 1);
|
|
431
|
+
(0, store_1.saveStore)();
|
|
432
|
+
}
|
|
432
433
|
(0, response_1.sendFastSuccess)(res, 200, voidSerializer, {
|
|
433
434
|
status: "success",
|
|
434
435
|
message: "Permission removed from user",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS,4CAAW,CAAC"}
|
package/dist/src/routes/index.js
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.apiRouter = void 0;
|
|
7
4
|
const express_1 = require("express");
|
|
8
5
|
const auth_1 = require("../routes/auth");
|
|
9
6
|
const rbac_1 = require("../routes/rbac");
|
|
10
|
-
const pets_1 = __importDefault(require("../routes/pets"));
|
|
11
7
|
exports.apiRouter = (0, express_1.Router)();
|
|
12
8
|
exports.apiRouter.use("/auth", auth_1.authRouter);
|
|
13
9
|
exports.apiRouter.use("/rbac", rbac_1.rbacRouter);
|
|
14
|
-
exports.apiRouter.use("/pets", pets_1.default);
|
package/doc/en/CHEATSHEET.md
CHANGED
|
@@ -10,13 +10,9 @@ Referensi cepat untuk perintah dan kode yang sering digunakan.
|
|
|
10
10
|
| **`npm run typecheck`** | Cek error TypeScript (tanpa compile). |
|
|
11
11
|
| **`npm run lint`** | Cek kode kotor/variabel tidak terpakai. |
|
|
12
12
|
| **`npm run lint:fix`** | Perbaiki kode kotor otomatis. |
|
|
13
|
-
| **`npm run make:module <Name>`** |
|
|
14
|
-
| **`npm run make:controller <Name>`** |
|
|
15
|
-
| **`npm run
|
|
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. |
|
|
13
|
+
| **`npm run make:module <Name>`** | Create Controller, Route, & Model. |
|
|
14
|
+
| **`npm run make:controller <Name>`** | Create Controller only. |
|
|
15
|
+
| **`npm run db:seed`** | Seed dummy data. |
|
|
20
16
|
|
|
21
17
|
## 🛡️ Validator Rules (Simple Syntax)
|
|
22
18
|
|
package/doc/en/CLI.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# CLI Tools & Scripts
|
|
2
2
|
|
|
3
|
-
Lapeh Framework comes with various CLI scripts to speed up the development process
|
|
3
|
+
Lapeh Framework comes with various CLI scripts to speed up the development process.
|
|
4
4
|
|
|
5
5
|
All commands are executed using `npm run <command>`.
|
|
6
6
|
|
|
@@ -11,6 +11,7 @@ All commands are executed using `npm run <command>`.
|
|
|
11
11
|
Main commands to run the application:
|
|
12
12
|
|
|
13
13
|
### 1. Initialize Project (`init`)
|
|
14
|
+
|
|
14
15
|
Creates a new project from scratch.
|
|
15
16
|
|
|
16
17
|
```bash
|
|
@@ -18,11 +19,13 @@ npx lapeh@latest init <project-name> [flags]
|
|
|
18
19
|
```
|
|
19
20
|
|
|
20
21
|
**Available Flags:**
|
|
22
|
+
|
|
21
23
|
- `--full`: Initialize with full setup (includes dummy users, roles, permissions).
|
|
22
24
|
- `--default`: Initialize with default configuration (PostgreSQL) skipping interactive prompts.
|
|
23
25
|
- `--y`: Alias for `--default`.
|
|
24
26
|
|
|
25
27
|
**Examples:**
|
|
28
|
+
|
|
26
29
|
```bash
|
|
27
30
|
# Interactive Mode
|
|
28
31
|
npx lapeh init my-app
|
|
@@ -35,17 +38,21 @@ npx lapeh init my-app --y
|
|
|
35
38
|
```
|
|
36
39
|
|
|
37
40
|
### 2. Upgrade Framework (`upgrade`)
|
|
41
|
+
|
|
38
42
|
Upgrades the Lapeh framework to the latest version in your existing project.
|
|
39
43
|
|
|
40
44
|
```bash
|
|
41
45
|
npx lapeh upgrade
|
|
42
46
|
```
|
|
47
|
+
|
|
43
48
|
**Features:**
|
|
49
|
+
|
|
44
50
|
- Automatically updates `package.json` dependencies.
|
|
45
51
|
- Syncs core framework files while preserving your custom code.
|
|
46
52
|
- **Smart Dependency Handling**: Preserves local `file:` dependencies if you are developing the framework locally, otherwise updates to the latest npm version.
|
|
47
53
|
|
|
48
54
|
### 3. Development Server (`dev`)
|
|
55
|
+
|
|
49
56
|
Runs the server in development mode with hot-reload feature.
|
|
50
57
|
|
|
51
58
|
```bash
|
|
@@ -55,6 +62,7 @@ npx lapeh dev
|
|
|
55
62
|
```
|
|
56
63
|
|
|
57
64
|
### 2. Production Server (`start`)
|
|
65
|
+
|
|
58
66
|
Runs the server in production mode (ensure it has been built).
|
|
59
67
|
|
|
60
68
|
```bash
|
|
@@ -64,6 +72,7 @@ npx lapeh start
|
|
|
64
72
|
```
|
|
65
73
|
|
|
66
74
|
### 3. Build Project (`build`)
|
|
75
|
+
|
|
67
76
|
Compiles TypeScript code to JavaScript in the `dist` folder.
|
|
68
77
|
|
|
69
78
|
```bash
|
|
@@ -77,60 +86,26 @@ npx lapeh build
|
|
|
77
86
|
Use these commands to create boilerplate files automatically.
|
|
78
87
|
|
|
79
88
|
### 1. Create Complete Module (`make:module`)
|
|
80
|
-
|
|
89
|
+
|
|
90
|
+
Creates Controller and Route at once.
|
|
81
91
|
|
|
82
92
|
```bash
|
|
83
93
|
npm run make:module <module-name>
|
|
84
94
|
```
|
|
95
|
+
|
|
85
96
|
**Example:** `npm run make:module Product`
|
|
86
97
|
|
|
87
98
|
Output:
|
|
99
|
+
|
|
88
100
|
- `src/controllers/productController.ts`
|
|
89
101
|
- `src/routes/product.ts`
|
|
90
|
-
- `src/models/product.prisma`
|
|
91
102
|
|
|
92
103
|
### 2. Create Controller (`make:controller`)
|
|
104
|
+
|
|
93
105
|
Only creates a controller file with basic CRUD methods.
|
|
94
106
|
|
|
95
107
|
```bash
|
|
96
108
|
npm run make:controller <controller-name>
|
|
97
109
|
```
|
|
98
|
-
**Example:** `npm run make:controller Order` (Will create `src/controllers/orderController.ts`)
|
|
99
|
-
|
|
100
|
-
### 3. Create Database Model (`make:model`)
|
|
101
|
-
Only creates a new Prisma schema file.
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
npm run make:model <model-name>
|
|
105
|
-
```
|
|
106
|
-
**Example:** `npm run make:model Transaction` (Will create `src/models/transaction.prisma`)
|
|
107
|
-
|
|
108
|
-
## Database Management (Prisma)
|
|
109
|
-
|
|
110
|
-
This framework uses a **Multi-File Schema** system. You don't edit `schema.prisma` directly, but instead edit small files in `src/models/*.prisma`.
|
|
111
|
-
|
|
112
|
-
### 1. Database Migration (`prisma:migrate`)
|
|
113
|
-
Run this every time you change a model definition in `src/models/*.prisma`.
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
npm run prisma:migrate
|
|
117
|
-
```
|
|
118
|
-
This command will:
|
|
119
|
-
1. Merge all `.prisma` files in `src/models/` into one `prisma/schema.prisma`.
|
|
120
|
-
2. Create SQL migration files.
|
|
121
|
-
3. Apply changes to the local database.
|
|
122
|
-
4. Regenerate Prisma Client (Type Definitions).
|
|
123
110
|
|
|
124
|
-
|
|
125
|
-
Use in production server. Only applies existing migrations without resetting data.
|
|
126
|
-
|
|
127
|
-
```bash
|
|
128
|
-
npm run prisma:deploy
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### 3. Database Studio (`db:studio`)
|
|
132
|
-
Opens a GUI in the browser to view and edit database data.
|
|
133
|
-
|
|
134
|
-
```bash
|
|
135
|
-
npm run db:studio
|
|
136
|
-
```
|
|
111
|
+
**Example:** `npm run make:controller Order` (Will create `src/controllers/orderController.ts`)
|