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.
Files changed (67) hide show
  1. package/.env.example +1 -6
  2. package/README.md +19 -85
  3. package/bin/index.js +84 -180
  4. package/dist/lib/bootstrap.d.ts.map +1 -1
  5. package/dist/lib/bootstrap.js +17 -16
  6. package/dist/lib/core/store.d.ts +55 -0
  7. package/dist/lib/core/store.d.ts.map +1 -0
  8. package/dist/lib/core/store.js +66 -0
  9. package/dist/lib/middleware/error.d.ts.map +1 -1
  10. package/dist/lib/middleware/error.js +1 -20
  11. package/dist/lib/utils/validator.d.ts.map +1 -1
  12. package/dist/lib/utils/validator.js +3 -32
  13. package/dist/src/modules/Auth/auth.controller.d.ts.map +1 -1
  14. package/dist/src/modules/Auth/auth.controller.js +118 -105
  15. package/dist/src/modules/Rbac/rbac.controller.d.ts.map +1 -1
  16. package/dist/src/modules/Rbac/rbac.controller.js +141 -140
  17. package/dist/src/routes/index.d.ts.map +1 -1
  18. package/dist/src/routes/index.js +0 -5
  19. package/doc/en/CHEATSHEET.md +3 -7
  20. package/doc/en/CLI.md +16 -41
  21. package/doc/en/DEPLOYMENT.md +171 -245
  22. package/doc/en/GETTING_STARTED.md +1 -25
  23. package/doc/en/PACKAGES.md +2 -3
  24. package/doc/en/STRUCTURE.md +1 -11
  25. package/doc/en/TUTORIAL.md +61 -119
  26. package/doc/id/CHANGELOG.md +16 -0
  27. package/doc/id/CHEATSHEET.md +0 -4
  28. package/doc/id/CLI.md +19 -54
  29. package/doc/id/DEPLOYMENT.md +171 -245
  30. package/doc/id/GETTING_STARTED.md +91 -115
  31. package/doc/id/PACKAGES.md +0 -1
  32. package/doc/id/STRUCTURE.md +1 -11
  33. package/doc/id/TUTORIAL.md +51 -109
  34. package/gitignore.template +0 -10
  35. package/lib/bootstrap.ts +39 -38
  36. package/lib/core/store.ts +116 -0
  37. package/lib/middleware/error.ts +1 -21
  38. package/lib/utils/validator.ts +3 -39
  39. package/package.json +4 -18
  40. package/scripts/init-project.js +2 -108
  41. package/scripts/make-module.js +1 -12
  42. package/scripts/seed-json.js +158 -0
  43. package/src/modules/Auth/auth.controller.ts +156 -106
  44. package/src/modules/Rbac/rbac.controller.ts +193 -138
  45. package/src/routes/index.ts +0 -3
  46. package/src/routes/rbac.ts +42 -42
  47. package/storage/logs/.0337f5062fe676994d1dc340156e089444e3d6e0-audit.json +5 -10
  48. package/storage/logs/lapeh-2025-12-30.log +1093 -0
  49. package/tsconfig.build.json +1 -3
  50. package/tsconfig.json +0 -1
  51. package/lib/core/database.ts +0 -5
  52. package/prisma/base.prisma.template +0 -8
  53. package/prisma/migrations/20251225163737_init/migration.sql +0 -236
  54. package/prisma/migrations/20251226000329_create_pets_table/migration.sql +0 -11
  55. package/prisma/migrations/20251226001249_create_pets_table/migration.sql +0 -82
  56. package/prisma/migrations/20251226001717_restore_core_models/migration.sql +0 -236
  57. package/prisma/migrations/migration_lock.toml +0 -3
  58. package/prisma/schema.prisma +0 -197
  59. package/prisma/seed.ts +0 -411
  60. package/scripts/compile-schema.js +0 -64
  61. package/src/modules/Auth/auth.prisma +0 -106
  62. package/src/modules/Pets/pets.controller.ts +0 -238
  63. package/src/modules/Pets/pets.prisma +0 -9
  64. package/src/modules/Rbac/rbac.prisma +0 -68
  65. package/src/routes/pets.ts +0 -13
  66. package/storage/logs/lapeh-2025-12-26.log +0 -88
  67. package/storage/logs/lapeh-2025-12-27.log +0 -217
@@ -1,5 +1,16 @@
1
1
  import { Request, Response } from "express";
2
- import { prisma } from "@lapeh/core/database";
2
+ import {
3
+ users,
4
+ roles,
5
+ permissions,
6
+ role_permissions,
7
+ user_roles,
8
+ user_permissions,
9
+ generateId,
10
+ Role,
11
+ Permission,
12
+ saveStore,
13
+ } from "@lapeh/core/store";
3
14
  import { sendError, sendFastSuccess } from "@lapeh/utils/response";
4
15
  import { Validator } from "@lapeh/utils/validator";
5
16
  import { z } from "zod";
@@ -66,17 +77,24 @@ export async function createRole(req: Request, res: Response) {
66
77
  }
67
78
 
68
79
  const { name, slug, description } = await validator.validated();
69
- // Manual unique check removed as it is handled by validator
70
80
 
71
- const role = await prisma.roles.create({
72
- data: {
73
- name,
74
- slug,
75
- description: description || null,
76
- created_at: new Date(),
77
- updated_at: new Date(),
78
- },
79
- });
81
+ // Manual unique check
82
+ if (roles.find((r) => r.slug === slug)) {
83
+ sendError(res, 422, "Validation error", { slug: "Slug already exists" });
84
+ return;
85
+ }
86
+
87
+ const role: Role = {
88
+ id: generateId(),
89
+ name,
90
+ slug,
91
+ description: description || null,
92
+ created_at: new Date(),
93
+ updated_at: new Date(),
94
+ };
95
+ roles.push(role);
96
+ saveStore();
97
+
80
98
  sendFastSuccess(res, 201, roleSerializer, {
81
99
  status: "success",
82
100
  message: "Role created",
@@ -85,9 +103,6 @@ export async function createRole(req: Request, res: Response) {
85
103
  }
86
104
 
87
105
  export async function listRoles(_req: Request, res: Response) {
88
- const roles = await prisma.roles.findMany({
89
- orderBy: { id: "asc" },
90
- });
91
106
  const serialized = roles.map((r: any) => ({ ...r, id: r.id.toString() }));
92
107
  sendFastSuccess(res, 200, roleListSerializer, {
93
108
  status: "success",
@@ -112,21 +127,32 @@ export async function updateRole(req: Request, res: Response) {
112
127
  }
113
128
  const { name, slug, description } = await validator.validated();
114
129
 
115
- const role = await prisma.roles.findUnique({ where: { id: roleId } });
116
- if (!role) {
130
+ const roleIndex = roles.findIndex((r) => r.id === roleId);
131
+ if (roleIndex === -1) {
117
132
  sendError(res, 404, "Role not found");
118
133
  return;
119
134
  }
120
- // Manual unique check removed as it is handled by validator
121
- const updated = await prisma.roles.update({
122
- where: { id: roleId },
123
- data: {
124
- name: name ?? role.name,
125
- slug: slug ?? role.slug,
126
- description: description ?? role.description,
127
- updated_at: new Date(),
128
- },
129
- });
135
+
136
+ // Manual unique check for update
137
+ if (
138
+ slug &&
139
+ slug !== roles[roleIndex].slug &&
140
+ roles.find((r) => r.slug === slug)
141
+ ) {
142
+ sendError(res, 422, "Validation error", { slug: "Slug already exists" });
143
+ return;
144
+ }
145
+
146
+ roles[roleIndex] = {
147
+ ...roles[roleIndex],
148
+ name: name ?? roles[roleIndex].name,
149
+ slug: slug ?? roles[roleIndex].slug,
150
+ description: description ?? roles[roleIndex].description,
151
+ updated_at: new Date(),
152
+ };
153
+ saveStore();
154
+
155
+ const updated = roles[roleIndex];
130
156
  sendFastSuccess(res, 200, roleSerializer, {
131
157
  status: "success",
132
158
  message: "Role updated",
@@ -137,14 +163,29 @@ export async function updateRole(req: Request, res: Response) {
137
163
  export async function deleteRole(req: Request, res: Response) {
138
164
  const { id } = req.params;
139
165
  const roleId = id;
140
- const role = await prisma.roles.findUnique({ where: { id: roleId } });
141
- if (!role) {
166
+ const roleIndex = roles.findIndex((r) => r.id === roleId);
167
+ if (roleIndex === -1) {
142
168
  sendError(res, 404, "Role not found");
143
169
  return;
144
170
  }
145
- await prisma.role_permissions.deleteMany({ where: { role_id: roleId } });
146
- await prisma.user_roles.deleteMany({ where: { role_id: roleId } });
147
- await prisma.roles.delete({ where: { id: roleId } });
171
+
172
+ // Clean up relationships
173
+ // Remove from role_permissions
174
+ for (let i = role_permissions.length - 1; i >= 0; i--) {
175
+ if (role_permissions[i].role_id === roleId) {
176
+ role_permissions.splice(i, 1);
177
+ }
178
+ }
179
+
180
+ // Remove from user_roles
181
+ for (let i = user_roles.length - 1; i >= 0; i--) {
182
+ if (user_roles[i].role_id === roleId) {
183
+ user_roles.splice(i, 1);
184
+ }
185
+ }
186
+
187
+ roles.splice(roleIndex, 1);
188
+
148
189
  sendFastSuccess(res, 200, voidSerializer, {
149
190
  status: "success",
150
191
  message: "Role deleted",
@@ -164,17 +205,24 @@ export async function createPermission(req: Request, res: Response) {
164
205
  return;
165
206
  }
166
207
  const { name, slug, description } = await validator.validated();
167
- // Manual unique check removed as it is handled by validator
168
208
 
169
- const permission = await prisma.permissions.create({
170
- data: {
171
- name,
172
- slug,
173
- description: description || null,
174
- created_at: new Date(),
175
- updated_at: new Date(),
176
- },
177
- });
209
+ // Manual unique check
210
+ if (permissions.find((p) => p.slug === slug)) {
211
+ sendError(res, 422, "Validation error", { slug: "Slug already exists" });
212
+ return;
213
+ }
214
+
215
+ const permission: Permission = {
216
+ id: generateId(),
217
+ name,
218
+ slug,
219
+ description: description || null,
220
+ created_at: new Date(),
221
+ updated_at: new Date(),
222
+ };
223
+ permissions.push(permission);
224
+ saveStore();
225
+
178
226
  sendFastSuccess(res, 201, permissionSerializer, {
179
227
  status: "success",
180
228
  message: "Permission created",
@@ -183,9 +231,6 @@ export async function createPermission(req: Request, res: Response) {
183
231
  }
184
232
 
185
233
  export async function listPermissions(_req: Request, res: Response) {
186
- const permissions = await prisma.permissions.findMany({
187
- orderBy: { id: "asc" },
188
- });
189
234
  const serialized = permissions.map((p: any) => ({
190
235
  ...p,
191
236
  id: p.id.toString(),
@@ -213,23 +258,32 @@ export async function updatePermission(req: Request, res: Response) {
213
258
  }
214
259
  const { name, slug, description } = await validator.validated();
215
260
 
216
- const permission = await prisma.permissions.findUnique({
217
- where: { id: permissionId },
218
- });
219
- if (!permission) {
261
+ const permIndex = permissions.findIndex((p) => p.id === permissionId);
262
+ if (permIndex === -1) {
220
263
  sendError(res, 404, "Permission not found");
221
264
  return;
222
265
  }
223
- // Manual unique check removed as it is handled by validator
224
- const updated = await prisma.permissions.update({
225
- where: { id: permissionId },
226
- data: {
227
- name: name ?? permission.name,
228
- slug: slug ?? permission.slug,
229
- description: description ?? permission.description,
230
- updated_at: new Date(),
231
- },
232
- });
266
+
267
+ if (
268
+ slug &&
269
+ slug !== permissions[permIndex].slug &&
270
+ permissions.find((p) => p.slug === slug)
271
+ ) {
272
+ sendError(res, 422, "Validation error", { slug: "Slug already exists" });
273
+ return;
274
+ }
275
+
276
+ permissions[permIndex] = {
277
+ ...permissions[permIndex],
278
+ name: name ?? permissions[permIndex].name,
279
+ slug: slug ?? permissions[permIndex].slug,
280
+ description: description ?? permissions[permIndex].description,
281
+ updated_at: new Date(),
282
+ };
283
+ saveStore();
284
+
285
+ const updated = permissions[permIndex];
286
+
233
287
  sendFastSuccess(res, 200, permissionSerializer, {
234
288
  status: "success",
235
289
  message: "Permission updated",
@@ -240,20 +294,29 @@ export async function updatePermission(req: Request, res: Response) {
240
294
  export async function deletePermission(req: Request, res: Response) {
241
295
  const { id } = req.params;
242
296
  const permissionId = id;
243
- const permission = await prisma.permissions.findUnique({
244
- where: { id: permissionId },
245
- });
246
- if (!permission) {
297
+
298
+ const permIndex = permissions.findIndex((p) => p.id === permissionId);
299
+ if (permIndex === -1) {
247
300
  sendError(res, 404, "Permission not found");
248
301
  return;
249
302
  }
250
- await prisma.role_permissions.deleteMany({
251
- where: { permission_id: permissionId },
252
- });
253
- await prisma.user_permissions.deleteMany({
254
- where: { permission_id: permissionId },
255
- });
256
- await prisma.permissions.delete({ where: { id: permissionId } });
303
+
304
+ // Clean up relationships
305
+ for (let i = role_permissions.length - 1; i >= 0; i--) {
306
+ if (role_permissions[i].permission_id === permissionId) {
307
+ role_permissions.splice(i, 1);
308
+ }
309
+ }
310
+
311
+ for (let i = user_permissions.length - 1; i >= 0; i--) {
312
+ if (user_permissions[i].permission_id === permissionId) {
313
+ user_permissions.splice(i, 1);
314
+ }
315
+ }
316
+
317
+ permissions.splice(permIndex, 1);
318
+ saveStore();
319
+
257
320
  sendFastSuccess(res, 200, voidSerializer, {
258
321
  status: "success",
259
322
  message: "Permission deleted",
@@ -273,34 +336,30 @@ export async function assignRoleToUser(req: Request, res: Response) {
273
336
  }
274
337
  const { userId, roleId } = await validator.validated();
275
338
 
276
- const user = await prisma.users.findUnique({
277
- where: { id: userId },
278
- });
339
+ const user = users.find((u) => u.id === userId);
279
340
  if (!user) {
280
341
  sendError(res, 404, "User not found");
281
342
  return;
282
343
  }
283
- const role = await prisma.roles.findUnique({
284
- where: { id: roleId },
285
- });
344
+ const role = roles.find((r) => r.id === roleId);
286
345
  if (!role) {
287
346
  sendError(res, 404, "Role not found");
288
347
  return;
289
348
  }
290
- await prisma.user_roles.upsert({
291
- where: {
292
- user_id_role_id: {
293
- user_id: userId,
294
- role_id: roleId,
295
- },
296
- },
297
- create: {
349
+
350
+ const exists = user_roles.find(
351
+ (ur) => ur.user_id === userId && ur.role_id === roleId
352
+ );
353
+ if (!exists) {
354
+ user_roles.push({
355
+ id: generateId(),
298
356
  user_id: userId,
299
357
  role_id: roleId,
300
358
  created_at: new Date(),
301
- },
302
- update: {},
303
- });
359
+ });
360
+ saveStore();
361
+ }
362
+
304
363
  sendFastSuccess(res, 200, voidSerializer, {
305
364
  status: "success",
306
365
  message: "Role assigned to user",
@@ -320,12 +379,12 @@ export async function removeRoleFromUser(req: Request, res: Response) {
320
379
  }
321
380
  const { userId, roleId } = await validator.validated();
322
381
 
323
- await prisma.user_roles.deleteMany({
324
- where: {
325
- user_id: userId,
326
- role_id: roleId,
327
- },
328
- });
382
+ for (let i = user_roles.length - 1; i >= 0; i--) {
383
+ if (user_roles[i].user_id === userId && user_roles[i].role_id === roleId) {
384
+ user_roles.splice(i, 1);
385
+ }
386
+ }
387
+
329
388
  sendFastSuccess(res, 200, voidSerializer, {
330
389
  status: "success",
331
390
  message: "Role removed from user",
@@ -345,34 +404,30 @@ export async function assignPermissionToRole(req: Request, res: Response) {
345
404
  }
346
405
  const { roleId, permissionId } = await validator.validated();
347
406
 
348
- const role = await prisma.roles.findUnique({
349
- where: { id: roleId },
350
- });
407
+ const role = roles.find((r) => r.id === roleId);
351
408
  if (!role) {
352
409
  sendError(res, 404, "Role not found");
353
410
  return;
354
411
  }
355
- const permission = await prisma.permissions.findUnique({
356
- where: { id: permissionId },
357
- });
412
+ const permission = permissions.find((p) => p.id === permissionId);
358
413
  if (!permission) {
359
414
  sendError(res, 404, "Permission not found");
360
415
  return;
361
416
  }
362
- await prisma.role_permissions.upsert({
363
- where: {
364
- role_id_permission_id: {
365
- role_id: roleId,
366
- permission_id: permissionId,
367
- },
368
- },
369
- create: {
417
+
418
+ const exists = role_permissions.find(
419
+ (rp) => rp.role_id === roleId && rp.permission_id === permissionId
420
+ );
421
+ if (!exists) {
422
+ role_permissions.push({
423
+ id: generateId(),
370
424
  role_id: roleId,
371
425
  permission_id: permissionId,
372
426
  created_at: new Date(),
373
- },
374
- update: {},
375
- });
427
+ });
428
+ saveStore();
429
+ }
430
+
376
431
  sendFastSuccess(res, 200, voidSerializer, {
377
432
  status: "success",
378
433
  message: "Permission assigned to role",
@@ -392,12 +447,15 @@ export async function removePermissionFromRole(req: Request, res: Response) {
392
447
  }
393
448
  const { roleId, permissionId } = await validator.validated();
394
449
 
395
- await prisma.role_permissions.deleteMany({
396
- where: {
397
- role_id: roleId,
398
- permission_id: permissionId,
399
- },
400
- });
450
+ for (let i = role_permissions.length - 1; i >= 0; i--) {
451
+ if (
452
+ role_permissions[i].role_id === roleId &&
453
+ role_permissions[i].permission_id === permissionId
454
+ ) {
455
+ role_permissions.splice(i, 1);
456
+ }
457
+ }
458
+
401
459
  sendFastSuccess(res, 200, voidSerializer, {
402
460
  status: "success",
403
461
  message: "Permission removed from role",
@@ -417,34 +475,29 @@ export async function assignPermissionToUser(req: Request, res: Response) {
417
475
  }
418
476
  const { userId, permissionId } = await validator.validated();
419
477
 
420
- const user = await prisma.users.findUnique({
421
- where: { id: userId },
422
- });
478
+ const user = users.find((u) => u.id === userId);
423
479
  if (!user) {
424
480
  sendError(res, 404, "User not found");
425
481
  return;
426
482
  }
427
- const permission = await prisma.permissions.findUnique({
428
- where: { id: permissionId },
429
- });
483
+ const permission = permissions.find((p) => p.id === permissionId);
430
484
  if (!permission) {
431
485
  sendError(res, 404, "Permission not found");
432
486
  return;
433
487
  }
434
- await prisma.user_permissions.upsert({
435
- where: {
436
- user_id_permission_id: {
437
- user_id: userId,
438
- permission_id: permissionId,
439
- },
440
- },
441
- create: {
488
+
489
+ const exists = user_permissions.find(
490
+ (up) => up.user_id === userId && up.permission_id === permissionId
491
+ );
492
+ if (!exists) {
493
+ user_permissions.push({
494
+ id: generateId(),
442
495
  user_id: userId,
443
496
  permission_id: permissionId,
444
497
  created_at: new Date(),
445
- },
446
- update: {},
447
- });
498
+ });
499
+ }
500
+
448
501
  sendFastSuccess(res, 200, voidSerializer, {
449
502
  status: "success",
450
503
  message: "Permission assigned to user",
@@ -464,12 +517,14 @@ export async function removePermissionFromUser(req: Request, res: Response) {
464
517
  }
465
518
  const { userId, permissionId } = await validator.validated();
466
519
 
467
- await prisma.user_permissions.deleteMany({
468
- where: {
469
- user_id: userId,
470
- permission_id: permissionId,
471
- },
472
- });
520
+ const index = user_permissions.findIndex(
521
+ (up) => up.user_id === userId && up.permission_id === permissionId
522
+ );
523
+ if (index !== -1) {
524
+ user_permissions.splice(index, 1);
525
+ saveStore();
526
+ }
527
+
473
528
  sendFastSuccess(res, 200, voidSerializer, {
474
529
  status: "success",
475
530
  message: "Permission removed from user",
@@ -1,10 +1,7 @@
1
1
  import { Router } from "express";
2
2
  import { authRouter } from "@/routes/auth";
3
3
  import { rbacRouter } from "@/routes/rbac";
4
- import petRouter from "@/routes/pets";
5
-
6
4
  export const apiRouter = Router();
7
5
 
8
6
  apiRouter.use("/auth", authRouter);
9
7
  apiRouter.use("/rbac", rbacRouter);
10
- apiRouter.use("/pets", petRouter);
@@ -1,42 +1,42 @@
1
- import { Router } from "express";
2
- import { requireAdmin, requireAuth } from "@lapeh/middleware/auth";
3
- import {
4
- createRole,
5
- listRoles,
6
- updateRole,
7
- deleteRole,
8
- createPermission,
9
- listPermissions,
10
- updatePermission,
11
- deletePermission,
12
- assignRoleToUser,
13
- removeRoleFromUser,
14
- assignPermissionToRole,
15
- removePermissionFromRole,
16
- assignPermissionToUser,
17
- removePermissionFromUser,
18
- } from "@/modules/Rbac/rbac.controller";
19
-
20
- export const rbacRouter = Router();
21
-
22
- rbacRouter.use(requireAuth);
23
- rbacRouter.use(requireAdmin);
24
-
25
- rbacRouter.post("/roles", createRole);
26
- rbacRouter.get("/roles", listRoles);
27
- rbacRouter.put("/roles/:id", updateRole);
28
- rbacRouter.delete("/roles/:id", deleteRole);
29
-
30
- rbacRouter.post("/permissions", createPermission);
31
- rbacRouter.get("/permissions", listPermissions);
32
- rbacRouter.put("/permissions/:id", updatePermission);
33
- rbacRouter.delete("/permissions/:id", deletePermission);
34
-
35
- rbacRouter.post("/users/assign-role", assignRoleToUser);
36
- rbacRouter.post("/users/remove-role", removeRoleFromUser);
37
-
38
- rbacRouter.post("/roles/assign-permission", assignPermissionToRole);
39
- rbacRouter.post("/roles/remove-permission", removePermissionFromRole);
40
-
41
- rbacRouter.post("/users/assign-permission", assignPermissionToUser);
42
- rbacRouter.post("/users/remove-permission", removePermissionFromUser);
1
+ import { Router } from "express";
2
+ import { requireAdmin, requireAuth } from "@lapeh/middleware/auth";
3
+ import {
4
+ createRole,
5
+ listRoles,
6
+ updateRole,
7
+ deleteRole,
8
+ createPermission,
9
+ listPermissions,
10
+ updatePermission,
11
+ deletePermission,
12
+ assignRoleToUser,
13
+ removeRoleFromUser,
14
+ assignPermissionToRole,
15
+ removePermissionFromRole,
16
+ assignPermissionToUser,
17
+ removePermissionFromUser,
18
+ } from "@/modules/Rbac/rbac.controller";
19
+
20
+ export const rbacRouter = Router();
21
+
22
+ rbacRouter.use(requireAuth);
23
+ rbacRouter.use(requireAdmin);
24
+
25
+ rbacRouter.post("/roles", createRole);
26
+ rbacRouter.get("/roles", listRoles);
27
+ rbacRouter.put("/roles/:id", updateRole);
28
+ rbacRouter.delete("/roles/:id", deleteRole);
29
+
30
+ rbacRouter.post("/permissions", createPermission);
31
+ rbacRouter.get("/permissions", listPermissions);
32
+ rbacRouter.put("/permissions/:id", updatePermission);
33
+ rbacRouter.delete("/permissions/:id", deletePermission);
34
+
35
+ rbacRouter.post("/users/assign-role", assignRoleToUser);
36
+ rbacRouter.post("/users/remove-role", removeRoleFromUser);
37
+
38
+ rbacRouter.post("/roles/assign-permission", assignPermissionToRole);
39
+ rbacRouter.post("/roles/remove-permission", removePermissionFromRole);
40
+
41
+ rbacRouter.post("/users/assign-permission", assignPermissionToUser);
42
+ rbacRouter.post("/users/remove-permission", removePermissionFromUser);
@@ -5,16 +5,6 @@
5
5
  },
6
6
  "auditLog": "E:\\PROJECT\\ANY\\2026\\lapeh\\storage\\logs\\.0337f5062fe676994d1dc340156e089444e3d6e0-audit.json",
7
7
  "files": [
8
- {
9
- "date": 1766767461282,
10
- "name": "E:\\PROJECT\\ANY\\2026\\lapeh\\storage\\logs\\lapeh-2025-12-26.log",
11
- "hash": "52e47e3c087de40a7c2c8ca0b57a470d5fe65938a1bc76fe1c27d9a79255fa24"
12
- },
13
- {
14
- "date": 1766768402694,
15
- "name": "E:\\PROJECT\\ANY\\2026\\lapeh\\storage\\logs\\lapeh-2025-12-27.log",
16
- "hash": "7b83a98dcb0ded21998f90e8c58a724cbb2534104205f97e15b409cfa080e982"
17
- },
18
8
  {
19
9
  "date": 1766895868212,
20
10
  "name": "E:\\PROJECT\\ANY\\2026\\lapeh\\storage\\logs\\lapeh-2025-12-28.log",
@@ -24,6 +14,11 @@
24
14
  "date": 1766942707900,
25
15
  "name": "E:\\PROJECT\\ANY\\2026\\lapeh\\storage\\logs\\lapeh-2025-12-29.log",
26
16
  "hash": "319d94eefcace8d4eefdee311691c27d9b3ba62fa6ed32782055dc864369d5c5"
17
+ },
18
+ {
19
+ "date": 1767106155460,
20
+ "name": "E:\\PROJECT\\ANY\\2026\\lapeh\\storage\\logs\\lapeh-2025-12-30.log",
21
+ "hash": "f090b6426f3343ed97dadce1dfe5cf1b15b0e4f173b3a0b4fbfe19d9f86dec03"
27
22
  }
28
23
  ],
29
24
  "hashType": "sha256"