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
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { Request, Response } from "express";
|
|
2
|
-
import {
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
|
116
|
-
if (
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
|
141
|
-
if (
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
|
217
|
-
|
|
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
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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
|
-
|
|
244
|
-
|
|
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
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
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
|
-
|
|
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
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
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
|
-
|
|
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
|
-
|
|
396
|
-
|
|
397
|
-
role_id
|
|
398
|
-
permission_id
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
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
|
-
|
|
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
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
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",
|
package/src/routes/index.ts
CHANGED
|
@@ -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);
|
package/src/routes/rbac.ts
CHANGED
|
@@ -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"
|