@mostajs/rbac 1.0.0

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 (130) hide show
  1. package/README.md +694 -0
  2. package/dist/api/categories-id.d.ts +21 -0
  3. package/dist/api/categories-id.d.ts.map +1 -0
  4. package/dist/api/categories-id.js +66 -0
  5. package/dist/api/categories-id.js.map +1 -0
  6. package/dist/api/categories.d.ts +15 -0
  7. package/dist/api/categories.d.ts.map +1 -0
  8. package/dist/api/categories.js +65 -0
  9. package/dist/api/categories.js.map +1 -0
  10. package/dist/api/matrix.d.ts +15 -0
  11. package/dist/api/matrix.d.ts.map +1 -0
  12. package/dist/api/matrix.js +104 -0
  13. package/dist/api/matrix.js.map +1 -0
  14. package/dist/api/permissions-id.d.ts +21 -0
  15. package/dist/api/permissions-id.d.ts.map +1 -0
  16. package/dist/api/permissions-id.js +48 -0
  17. package/dist/api/permissions-id.js.map +1 -0
  18. package/dist/api/permissions.d.ts +16 -0
  19. package/dist/api/permissions.d.ts.map +1 -0
  20. package/dist/api/permissions.js +102 -0
  21. package/dist/api/permissions.js.map +1 -0
  22. package/dist/api/roles-id.d.ts +27 -0
  23. package/dist/api/roles-id.d.ts.map +1 -0
  24. package/dist/api/roles-id.js +89 -0
  25. package/dist/api/roles-id.js.map +1 -0
  26. package/dist/api/roles.d.ts +15 -0
  27. package/dist/api/roles.d.ts.map +1 -0
  28. package/dist/api/roles.js +65 -0
  29. package/dist/api/roles.js.map +1 -0
  30. package/dist/api/seed.d.ts +16 -0
  31. package/dist/api/seed.d.ts.map +1 -0
  32. package/dist/api/seed.js +49 -0
  33. package/dist/api/seed.js.map +1 -0
  34. package/dist/api/users-id.d.ts +28 -0
  35. package/dist/api/users-id.d.ts.map +1 -0
  36. package/dist/api/users-id.js +94 -0
  37. package/dist/api/users-id.js.map +1 -0
  38. package/dist/api/users.d.ts +17 -0
  39. package/dist/api/users.d.ts.map +1 -0
  40. package/dist/api/users.js +80 -0
  41. package/dist/api/users.js.map +1 -0
  42. package/dist/components/CategoriesManager.d.ts +5 -0
  43. package/dist/components/CategoriesManager.d.ts.map +1 -0
  44. package/dist/components/CategoriesManager.js +115 -0
  45. package/dist/components/CategoriesManager.js.map +1 -0
  46. package/dist/components/PermissionMatrix.d.ts +5 -0
  47. package/dist/components/PermissionMatrix.d.ts.map +1 -0
  48. package/dist/components/PermissionMatrix.js +82 -0
  49. package/dist/components/PermissionMatrix.js.map +1 -0
  50. package/dist/components/PermissionsManager.d.ts +5 -0
  51. package/dist/components/PermissionsManager.d.ts.map +1 -0
  52. package/dist/components/PermissionsManager.js +89 -0
  53. package/dist/components/PermissionsManager.js.map +1 -0
  54. package/dist/components/RBACManager.d.ts +5 -0
  55. package/dist/components/RBACManager.d.ts.map +1 -0
  56. package/dist/components/RBACManager.js +16 -0
  57. package/dist/components/RBACManager.js.map +1 -0
  58. package/dist/components/RolesManager.d.ts +5 -0
  59. package/dist/components/RolesManager.d.ts.map +1 -0
  60. package/dist/components/RolesManager.js +97 -0
  61. package/dist/components/RolesManager.js.map +1 -0
  62. package/dist/components/UsersManager.d.ts +10 -0
  63. package/dist/components/UsersManager.d.ts.map +1 -0
  64. package/dist/components/UsersManager.js +111 -0
  65. package/dist/components/UsersManager.js.map +1 -0
  66. package/dist/components/ui/alert-dialog.d.ts +19 -0
  67. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  68. package/dist/components/ui/alert-dialog.js +67 -0
  69. package/dist/components/ui/alert-dialog.js.map +1 -0
  70. package/dist/components/ui/badge.d.ts +10 -0
  71. package/dist/components/ui/badge.d.ts.map +1 -0
  72. package/dist/components/ui/badge.js +37 -0
  73. package/dist/components/ui/badge.js.map +1 -0
  74. package/dist/components/ui/button.d.ts +11 -0
  75. package/dist/components/ui/button.d.ts.map +1 -0
  76. package/dist/components/ui/button.js +48 -0
  77. package/dist/components/ui/button.js.map +1 -0
  78. package/dist/components/ui/card.d.ts +10 -0
  79. package/dist/components/ui/card.d.ts.map +1 -0
  80. package/dist/components/ui/card.js +43 -0
  81. package/dist/components/ui/card.js.map +1 -0
  82. package/dist/components/ui/checkbox.d.ts +5 -0
  83. package/dist/components/ui/checkbox.d.ts.map +1 -0
  84. package/dist/components/ui/checkbox.js +23 -0
  85. package/dist/components/ui/checkbox.js.map +1 -0
  86. package/dist/components/ui/dialog.d.ts +18 -0
  87. package/dist/components/ui/dialog.d.ts.map +1 -0
  88. package/dist/components/ui/dialog.js +60 -0
  89. package/dist/components/ui/dialog.js.map +1 -0
  90. package/dist/components/ui/input.d.ts +4 -0
  91. package/dist/components/ui/input.d.ts.map +1 -0
  92. package/dist/components/ui/input.js +19 -0
  93. package/dist/components/ui/input.js.map +1 -0
  94. package/dist/components/ui/label.d.ts +5 -0
  95. package/dist/components/ui/label.d.ts.map +1 -0
  96. package/dist/components/ui/label.js +22 -0
  97. package/dist/components/ui/label.js.map +1 -0
  98. package/dist/components/ui/select.d.ts +16 -0
  99. package/dist/components/ui/select.d.ts.map +1 -0
  100. package/dist/components/ui/select.js +61 -0
  101. package/dist/components/ui/select.js.map +1 -0
  102. package/dist/components/ui/table.d.ts +11 -0
  103. package/dist/components/ui/table.d.ts.map +1 -0
  104. package/dist/components/ui/table.js +49 -0
  105. package/dist/components/ui/table.js.map +1 -0
  106. package/dist/components/ui/tabs.d.ts +12 -0
  107. package/dist/components/ui/tabs.d.ts.map +1 -0
  108. package/dist/components/ui/tabs.js +46 -0
  109. package/dist/components/ui/tabs.js.map +1 -0
  110. package/dist/index.d.ts +19 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +15 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/lib/rbac-api.d.ts +66 -0
  115. package/dist/lib/rbac-api.d.ts.map +1 -0
  116. package/dist/lib/rbac-api.js +158 -0
  117. package/dist/lib/rbac-api.js.map +1 -0
  118. package/dist/lib/utils.d.ts +3 -0
  119. package/dist/lib/utils.d.ts.map +1 -0
  120. package/dist/lib/utils.js +7 -0
  121. package/dist/lib/utils.js.map +1 -0
  122. package/dist/server.d.ts +21 -0
  123. package/dist/server.d.ts.map +1 -0
  124. package/dist/server.js +14 -0
  125. package/dist/server.js.map +1 -0
  126. package/dist/types/index.d.ts +88 -0
  127. package/dist/types/index.d.ts.map +1 -0
  128. package/dist/types/index.js +4 -0
  129. package/dist/types/index.js.map +1 -0
  130. package/package.json +126 -0
@@ -0,0 +1,89 @@
1
+ // Author: Dr Hamid MADANI drmdh@msn.com
2
+ // RBAC API handler: GET/PUT/DELETE /admin/roles/[id]
3
+ import { NextResponse } from 'next/server';
4
+ import { RoleRepository, UserRepository } from '@mostajs/auth';
5
+ import { getDialect } from '@mostajs/orm';
6
+ import { z } from 'zod';
7
+ const updateRoleSchema = z.object({
8
+ name: z.string().min(1).regex(/^[a-z][a-z0-9_]*$/).optional(),
9
+ description: z.string().optional(),
10
+ permissionIds: z.array(z.string()).optional(),
11
+ });
12
+ export function createRolesIdHandler(config) {
13
+ const { checkPermission, adminPermission, systemRoles = [] } = config;
14
+ async function GET(req, { params }) {
15
+ const { error } = await checkPermission(adminPermission);
16
+ if (error)
17
+ return error;
18
+ const { id } = await params;
19
+ const rRepo = new RoleRepository(await getDialect());
20
+ const role = await rRepo.findByIdWithPermissions(id);
21
+ if (!role) {
22
+ return NextResponse.json({ error: { code: 'NOT_FOUND', message: 'Rôle non trouvé' } }, { status: 404 });
23
+ }
24
+ const uRepo = new UserRepository(await getDialect());
25
+ const userCount = await uRepo.count({ role: role.name });
26
+ return NextResponse.json({ data: Object.assign(Object.assign({}, role), { userCount }) });
27
+ }
28
+ async function PUT(req, { params }) {
29
+ const { error } = await checkPermission(adminPermission);
30
+ if (error)
31
+ return error;
32
+ const { id } = await params;
33
+ const body = await req.json();
34
+ const parsed = updateRoleSchema.safeParse(body);
35
+ if (!parsed.success) {
36
+ return NextResponse.json({ error: { code: 'VALIDATION_ERROR', message: 'Données invalides', details: parsed.error.flatten() } }, { status: 400 });
37
+ }
38
+ const rRepo = new RoleRepository(await getDialect());
39
+ const existingRole = await rRepo.findById(id);
40
+ if (!existingRole) {
41
+ return NextResponse.json({ error: { code: 'NOT_FOUND', message: 'Rôle non trouvé' } }, { status: 404 });
42
+ }
43
+ const { name, description, permissionIds } = parsed.data;
44
+ // Prevent renaming system roles
45
+ if (name && name !== existingRole.name && systemRoles.includes(existingRole.name)) {
46
+ return NextResponse.json({ error: { code: 'FORBIDDEN', message: 'Impossible de renommer un rôle système' } }, { status: 403 });
47
+ }
48
+ // Check name uniqueness if changing
49
+ if (name && name !== existingRole.name) {
50
+ const duplicate = await rRepo.findByName(name);
51
+ if (duplicate) {
52
+ return NextResponse.json({ error: { code: 'DUPLICATE', message: 'Un rôle avec ce nom existe déjà' } }, { status: 409 });
53
+ }
54
+ }
55
+ const updateData = {};
56
+ if (name)
57
+ updateData.name = name;
58
+ if (description !== undefined)
59
+ updateData.description = description;
60
+ if (permissionIds)
61
+ updateData.permissions = permissionIds;
62
+ await rRepo.update(id, updateData);
63
+ const updated = await rRepo.findByIdWithPermissions(id);
64
+ return NextResponse.json({ data: updated });
65
+ }
66
+ async function DELETE(req, { params }) {
67
+ const { error } = await checkPermission(adminPermission);
68
+ if (error)
69
+ return error;
70
+ const { id } = await params;
71
+ const rRepo = new RoleRepository(await getDialect());
72
+ const role = await rRepo.findById(id);
73
+ if (!role) {
74
+ return NextResponse.json({ error: { code: 'NOT_FOUND', message: 'Rôle non trouvé' } }, { status: 404 });
75
+ }
76
+ if (systemRoles.includes(role.name)) {
77
+ return NextResponse.json({ error: { code: 'FORBIDDEN', message: 'Impossible de supprimer un rôle système' } }, { status: 403 });
78
+ }
79
+ const uRepo = new UserRepository(await getDialect());
80
+ const userCount = await uRepo.count({ role: role.name });
81
+ if (userCount > 0) {
82
+ return NextResponse.json({ error: { code: 'CONFLICT', message: `Impossible de supprimer : ${userCount} utilisateur(s) utilisent ce rôle` } }, { status: 409 });
83
+ }
84
+ await rRepo.delete(id);
85
+ return NextResponse.json({ data: { message: 'Rôle supprimé' } });
86
+ }
87
+ return { GET, PUT, DELETE };
88
+ }
89
+ //# sourceMappingURL=roles-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles-id.js","sourceRoot":"","sources":["../../api/roles-id.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import type { RoleDefinition } from '../types';
3
+ export interface RolesHandlerConfig {
4
+ checkPermission: (perm: string) => Promise<{
5
+ error: NextResponse | null;
6
+ session: any;
7
+ }>;
8
+ adminPermission: string;
9
+ defaultRoles?: Record<string, RoleDefinition>;
10
+ }
11
+ export declare function createRolesHandler(config: RolesHandlerConfig): {
12
+ GET: () => Promise<NextResponse<unknown>>;
13
+ POST: (req: NextRequest) => Promise<NextResponse<unknown>>;
14
+ };
15
+ //# sourceMappingURL=roles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../api/roles.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAIvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAQ9C,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;IACxF,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;CAC9C;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB;;gBAoClC,WAAW;EAqCrC"}
@@ -0,0 +1,65 @@
1
+ // Author: Dr Hamid MADANI drmdh@msn.com
2
+ // RBAC API handler: GET/POST /admin/roles
3
+ import { NextResponse } from 'next/server';
4
+ import { RoleRepository, UserRepository } from '@mostajs/auth';
5
+ import { getDialect } from '@mostajs/orm';
6
+ import { z } from 'zod';
7
+ const createRoleSchema = z.object({
8
+ name: z.string().min(1).regex(/^[a-z][a-z0-9_]*$/, 'Le nom doit être en minuscules (lettres, chiffres, underscores)'),
9
+ description: z.string().optional(),
10
+ permissionIds: z.array(z.string()).optional(),
11
+ });
12
+ export function createRolesHandler(config) {
13
+ const { checkPermission, adminPermission, defaultRoles = {} } = config;
14
+ async function GET() {
15
+ const { error } = await checkPermission(adminPermission);
16
+ if (error)
17
+ return error;
18
+ const rRepo = new RoleRepository(await getDialect());
19
+ let roles = await rRepo.findAllWithPermissions();
20
+ // Fallback: if DB is empty, return hardcoded defaults
21
+ if (roles.length === 0) {
22
+ const fallbackRoles = Object.values(defaultRoles).map((r, i) => ({
23
+ id: `fallback_${i}`,
24
+ name: r.name,
25
+ description: r.description,
26
+ permissions: r.permissions.map((p) => ({ name: p })),
27
+ userCount: 0,
28
+ _fallback: true,
29
+ }));
30
+ return NextResponse.json({ data: fallbackRoles });
31
+ }
32
+ const uRepo = new UserRepository(await getDialect());
33
+ const allUsers = await uRepo.findAllSafe();
34
+ const rolesWithCount = roles.map((r) => (Object.assign(Object.assign({}, r), { userCount: allUsers.filter((u) => {
35
+ const userRoles = Array.isArray(u.roles) ? u.roles : [];
36
+ return userRoles.includes(r.id);
37
+ }).length })));
38
+ return NextResponse.json({ data: rolesWithCount });
39
+ }
40
+ async function POST(req) {
41
+ const { error } = await checkPermission(adminPermission);
42
+ if (error)
43
+ return error;
44
+ const body = await req.json();
45
+ const parsed = createRoleSchema.safeParse(body);
46
+ if (!parsed.success) {
47
+ return NextResponse.json({ error: { code: 'VALIDATION_ERROR', message: 'Données invalides', details: parsed.error.flatten() } }, { status: 400 });
48
+ }
49
+ const { name, description, permissionIds } = parsed.data;
50
+ const rRepo = new RoleRepository(await getDialect());
51
+ const existing = await rRepo.findByName(name);
52
+ if (existing) {
53
+ return NextResponse.json({ error: { code: 'DUPLICATE', message: 'Un rôle avec ce nom existe déjà' } }, { status: 409 });
54
+ }
55
+ const role = await rRepo.create({
56
+ name,
57
+ description: description || '',
58
+ permissions: permissionIds || [],
59
+ });
60
+ const populated = await rRepo.findByIdWithPermissions(role.id);
61
+ return NextResponse.json({ data: populated }, { status: 201 });
62
+ }
63
+ return { GET, POST };
64
+ }
65
+ //# sourceMappingURL=roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.js","sourceRoot":"","sources":["../../api/roles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { NextResponse } from 'next/server';
2
+ import type { PermissionDefinition, RoleDefinition, CategoryDefinition } from '../types';
3
+ export interface SeedHandlerConfig {
4
+ checkPermission: (perm: string) => Promise<{
5
+ error: NextResponse | null;
6
+ session: any;
7
+ }>;
8
+ adminPermission: string;
9
+ permissionDefinitions: PermissionDefinition[];
10
+ defaultRoles: Record<string, RoleDefinition>;
11
+ categoryDefinitions: CategoryDefinition[];
12
+ }
13
+ export declare function createSeedHandler(config: SeedHandlerConfig): {
14
+ POST: () => Promise<NextResponse<unknown>>;
15
+ };
16
+ //# sourceMappingURL=seed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../api/seed.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAExF,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;IACxF,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,oBAAoB,EAAE,CAAA;IAC7C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IAC5C,mBAAmB,EAAE,kBAAkB,EAAE,CAAA;CAC1C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB;;EA6D1D"}
@@ -0,0 +1,49 @@
1
+ // Author: Dr Hamid MADANI drmdh@msn.com
2
+ // RBAC API handler: POST /admin/permissions/seed
3
+ import { NextResponse } from 'next/server';
4
+ import { PermissionRepository, RoleRepository, PermissionCategoryRepository } from '@mostajs/auth';
5
+ import { getDialect } from '@mostajs/orm';
6
+ export function createSeedHandler(config) {
7
+ const { checkPermission, adminPermission, permissionDefinitions, defaultRoles, categoryDefinitions, } = config;
8
+ async function POST() {
9
+ const { error } = await checkPermission(adminPermission);
10
+ if (error)
11
+ return error;
12
+ const catRepo = new PermissionCategoryRepository(await getDialect());
13
+ const pRepo = new PermissionRepository(await getDialect());
14
+ const rRepo = new RoleRepository(await getDialect());
15
+ // Upsert categories
16
+ for (const catDef of categoryDefinitions) {
17
+ await catRepo.upsert({ name: catDef.name }, catDef);
18
+ }
19
+ // Upsert all permissions
20
+ const permissionMap = {};
21
+ for (const pDef of permissionDefinitions) {
22
+ const perm = await pRepo.upsert({ name: pDef.name }, { name: pDef.name, description: pDef.description, category: pDef.category });
23
+ permissionMap[pDef.code] = perm.id;
24
+ }
25
+ // Upsert all default roles
26
+ const rolesCreated = [];
27
+ for (const [, roleDef] of Object.entries(defaultRoles)) {
28
+ const permissionIds = roleDef.permissions
29
+ .map((code) => permissionMap[code])
30
+ .filter(Boolean);
31
+ await rRepo.upsert({ name: roleDef.name }, {
32
+ name: roleDef.name,
33
+ description: roleDef.description,
34
+ permissions: permissionIds,
35
+ });
36
+ rolesCreated.push(roleDef.name);
37
+ }
38
+ return NextResponse.json({
39
+ data: {
40
+ categories: categoryDefinitions.length,
41
+ permissions: permissionDefinitions.length,
42
+ roles: rolesCreated.length,
43
+ message: `${categoryDefinitions.length} catégories, ${permissionDefinitions.length} permissions et ${rolesCreated.length} rôles initialisés`,
44
+ },
45
+ });
46
+ }
47
+ return { POST };
48
+ }
49
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../api/seed.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,iDAAiD;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAA;AAClG,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAWzC,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,MAAM,EACJ,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,YAAY,EACZ,mBAAmB,GACpB,GAAG,MAAM,CAAA;IAEV,KAAK,UAAU,IAAI;QACjB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,eAAe,CAAC,CAAA;QACxD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;QAEvB,MAAM,OAAO,GAAG,IAAI,4BAA4B,CAAC,MAAM,UAAU,EAAE,CAAC,CAAA;QACpE,MAAM,KAAK,GAAG,IAAI,oBAAoB,CAAC,MAAM,UAAU,EAAE,CAAC,CAAA;QAC1D,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,MAAM,UAAU,EAAE,CAAC,CAAA;QAEpD,oBAAoB;QACpB,KAAK,MAAM,MAAM,IAAI,mBAAmB,EAAE,CAAC;YACzC,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,MAAa,CAAC,CAAA;QAC5D,CAAC;QAED,yBAAyB;QACzB,MAAM,aAAa,GAA2B,EAAE,CAAA;QAChD,KAAK,MAAM,IAAI,IAAI,qBAAqB,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAC7B,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EACnB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5E,CAAA;YACD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;QACpC,CAAC;QAED,2BAA2B;QAC3B,MAAM,YAAY,GAAa,EAAE,CAAA;QACjC,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACvD,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW;iBACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;iBAClC,MAAM,CAAC,OAAO,CAAC,CAAA;YAElB,MAAM,KAAK,CAAC,MAAM,CAChB,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EACtB;gBACE,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,WAAW,EAAE,aAAa;aAC3B,CACF,CAAA;YACD,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACjC,CAAC;QAED,OAAO,YAAY,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE;gBACJ,UAAU,EAAE,mBAAmB,CAAC,MAAM;gBACtC,WAAW,EAAE,qBAAqB,CAAC,MAAM;gBACzC,KAAK,EAAE,YAAY,CAAC,MAAM;gBAC1B,OAAO,EAAE,GAAG,mBAAmB,CAAC,MAAM,gBAAgB,qBAAqB,CAAC,MAAM,mBAAmB,YAAY,CAAC,MAAM,oBAAoB;aAC7I;SACF,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,CAAA;AACjB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ export interface UsersIdHandlerConfig {
3
+ checkPermission: (perm: string) => Promise<{
4
+ error: NextResponse | null;
5
+ session: any;
6
+ }>;
7
+ adminPermission: string;
8
+ knownRoles?: string[];
9
+ getPermissionsForRole?: (role: string) => Promise<string[]>;
10
+ }
11
+ export declare function createUsersIdHandler(config: UsersIdHandlerConfig): {
12
+ GET: (req: NextRequest, { params }: {
13
+ params: Promise<{
14
+ id: string;
15
+ }>;
16
+ }) => Promise<NextResponse<unknown>>;
17
+ PUT: (req: NextRequest, { params }: {
18
+ params: Promise<{
19
+ id: string;
20
+ }>;
21
+ }) => Promise<NextResponse<unknown>>;
22
+ DELETE: (req: NextRequest, { params }: {
23
+ params: Promise<{
24
+ id: string;
25
+ }>;
26
+ }) => Promise<NextResponse<unknown>>;
27
+ };
28
+ //# sourceMappingURL=users-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users-id.d.ts","sourceRoot":"","sources":["../../api/users-id.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAgBvD,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;IACxF,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAC5D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB;eASxD,WAAW,cACJ;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;eAoB1C,WAAW,cACJ;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;kBAuD1C,WAAW,cACJ;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;EA8BlD"}
@@ -0,0 +1,94 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ // Author: Dr Hamid MADANI drmdh@msn.com
13
+ // RBAC API handler: GET/PUT/DELETE /users/[id]
14
+ import { NextResponse } from 'next/server';
15
+ import { hashPassword } from '@mostajs/auth/lib/password';
16
+ import { UserRepository, RoleRepository } from '@mostajs/auth';
17
+ import { getDialect } from '@mostajs/orm';
18
+ import { z } from 'zod';
19
+ const updateUserSchema = z.object({
20
+ email: z.string().email().optional(),
21
+ password: z.string().min(6).optional(),
22
+ firstName: z.string().min(1).optional(),
23
+ lastName: z.string().min(1).optional(),
24
+ phone: z.string().optional(),
25
+ role: z.string().min(1).optional(),
26
+ status: z.enum(['active', 'locked', 'disabled']).optional(),
27
+ });
28
+ export function createUsersIdHandler(config) {
29
+ const { checkPermission, adminPermission, knownRoles = [], getPermissionsForRole, } = config;
30
+ async function GET(req, { params }) {
31
+ const { error } = await checkPermission(adminPermission);
32
+ if (error)
33
+ return error;
34
+ const { id } = await params;
35
+ const repo = new UserRepository(await getDialect());
36
+ const user = await repo.findByIdSafe(id);
37
+ if (!user) {
38
+ return NextResponse.json({ error: { code: 'NOT_FOUND', message: 'Utilisateur non trouvé' } }, { status: 404 });
39
+ }
40
+ return NextResponse.json({ data: user });
41
+ }
42
+ async function PUT(req, { params }) {
43
+ const { error } = await checkPermission(adminPermission);
44
+ if (error)
45
+ return error;
46
+ const { id } = await params;
47
+ const body = await req.json();
48
+ const parsed = updateUserSchema.safeParse(body);
49
+ if (!parsed.success) {
50
+ return NextResponse.json({ error: { code: 'VALIDATION_ERROR', message: 'Données invalides', details: parsed.error.flatten() } }, { status: 400 });
51
+ }
52
+ const updateData = Object.assign({}, parsed.data);
53
+ if (updateData.password) {
54
+ updateData.password = await hashPassword(updateData.password);
55
+ }
56
+ if (updateData.role) {
57
+ if (!knownRoles.includes(updateData.role)) {
58
+ const rRepo = new RoleRepository(await getDialect());
59
+ const dbRole = await rRepo.findByName(updateData.role);
60
+ if (!dbRole) {
61
+ return NextResponse.json({ error: { code: 'VALIDATION_ERROR', message: `Le rôle "${updateData.role}" n'existe pas` } }, { status: 400 });
62
+ }
63
+ }
64
+ if (getPermissionsForRole) {
65
+ updateData.permissions = await getPermissionsForRole(updateData.role);
66
+ }
67
+ }
68
+ const repo = new UserRepository(await getDialect());
69
+ const user = await repo.update(id, updateData);
70
+ if (!user) {
71
+ return NextResponse.json({ error: { code: 'NOT_FOUND', message: 'Utilisateur non trouvé' } }, { status: 404 });
72
+ }
73
+ const _a = user, { password: _ } = _a, userWithoutPassword = __rest(_a, ["password"]);
74
+ return NextResponse.json({ data: userWithoutPassword });
75
+ }
76
+ async function DELETE(req, { params }) {
77
+ const { error, session } = await checkPermission(adminPermission);
78
+ if (error)
79
+ return error;
80
+ const { id } = await params;
81
+ if (session.user.id === id) {
82
+ return NextResponse.json({ error: { code: 'FORBIDDEN', message: 'Impossible de supprimer votre propre compte' } }, { status: 403 });
83
+ }
84
+ const repo = new UserRepository(await getDialect());
85
+ const user = await repo.update(id, { status: 'disabled' });
86
+ if (!user) {
87
+ return NextResponse.json({ error: { code: 'NOT_FOUND', message: 'Utilisateur non trouvé' } }, { status: 404 });
88
+ }
89
+ const _a = user, { password: _ } = _a, userWithoutPassword = __rest(_a, ["password"]);
90
+ return NextResponse.json({ data: userWithoutPassword });
91
+ }
92
+ return { GET, PUT, DELETE };
93
+ }
94
+ //# sourceMappingURL=users-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users-id.js","sourceRoot":"","sources":["../../api/users-id.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ export interface UsersHandlerConfig {
3
+ checkPermission: (perm: string) => Promise<{
4
+ error: NextResponse | null;
5
+ session: any;
6
+ }>;
7
+ adminPermission: string;
8
+ knownRoles?: string[];
9
+ getPermissionsForRole?: (role: string) => Promise<string[]>;
10
+ logAudit?: (entry: Record<string, unknown>) => Promise<void>;
11
+ getAuditUser?: (session: any) => Record<string, unknown>;
12
+ }
13
+ export declare function createUsersHandler(config: UsersHandlerConfig): {
14
+ GET: () => Promise<NextResponse<unknown>>;
15
+ POST: (req: NextRequest) => Promise<NextResponse<unknown>>;
16
+ };
17
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../api/users.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAevD,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;IACxF,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC3D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACzD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB;;gBAoBlC,WAAW;EAoErC"}
@@ -0,0 +1,80 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ // Author: Dr Hamid MADANI drmdh@msn.com
13
+ // RBAC API handler: GET/POST /users
14
+ import { NextResponse } from 'next/server';
15
+ import { hashPassword } from '@mostajs/auth/lib/password';
16
+ import { UserRepository, RoleRepository } from '@mostajs/auth';
17
+ import { getDialect } from '@mostajs/orm';
18
+ import { z } from 'zod';
19
+ const createUserSchema = z.object({
20
+ email: z.string().email(),
21
+ password: z.string().min(6),
22
+ firstName: z.string().min(1),
23
+ lastName: z.string().min(1),
24
+ phone: z.string().optional(),
25
+ role: z.string().min(1),
26
+ });
27
+ export function createUsersHandler(config) {
28
+ const { checkPermission, adminPermission, knownRoles = [], getPermissionsForRole, logAudit, getAuditUser, } = config;
29
+ async function GET() {
30
+ const { error } = await checkPermission(adminPermission);
31
+ if (error)
32
+ return error;
33
+ const repo = new UserRepository(await getDialect());
34
+ const users = await repo.findAllSafe({}, { sort: { createdAt: -1 } });
35
+ return NextResponse.json({ data: users });
36
+ }
37
+ async function POST(req) {
38
+ const { error, session } = await checkPermission(adminPermission);
39
+ if (error)
40
+ return error;
41
+ const body = await req.json();
42
+ const parsed = createUserSchema.safeParse(body);
43
+ if (!parsed.success) {
44
+ return NextResponse.json({ error: { code: 'VALIDATION_ERROR', message: 'Données invalides', details: parsed.error.flatten() } }, { status: 400 });
45
+ }
46
+ const { email, password, firstName, lastName, phone, role } = parsed.data;
47
+ const repo = new UserRepository(await getDialect());
48
+ const existing = await repo.findByEmail(email);
49
+ if (existing) {
50
+ return NextResponse.json({ error: { code: 'DUPLICATE', message: 'Cet email est déjà utilisé' } }, { status: 409 });
51
+ }
52
+ // Validate role exists (known constants or DB)
53
+ if (!knownRoles.includes(role)) {
54
+ const rRepo = new RoleRepository(await getDialect());
55
+ const dbRole = await rRepo.findByName(role);
56
+ if (!dbRole) {
57
+ return NextResponse.json({ error: { code: 'VALIDATION_ERROR', message: `Le rôle "${role}" n'existe pas` } }, { status: 400 });
58
+ }
59
+ }
60
+ const hashedPassword = await hashPassword(password);
61
+ const permissions = getPermissionsForRole ? await getPermissionsForRole(role) : [];
62
+ const user = await repo.create({
63
+ email: email.toLowerCase(),
64
+ password: hashedPassword,
65
+ firstName,
66
+ lastName,
67
+ phone,
68
+ role,
69
+ permissions,
70
+ status: 'active',
71
+ });
72
+ const _a = user, { password: _ } = _a, userWithoutPassword = __rest(_a, ["password"]);
73
+ if (logAudit && getAuditUser) {
74
+ await logAudit(Object.assign(Object.assign({}, getAuditUser(session)), { action: 'user_create', module: 'users', resource: `${firstName} ${lastName}`, resourceId: user.id, details: { email, role } }));
75
+ }
76
+ return NextResponse.json({ data: userWithoutPassword }, { status: 201 });
77
+ }
78
+ return { GET, POST };
79
+ }
80
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../api/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { RBACConfig } from '../types';
2
+ export interface CategoriesManagerProps extends RBACConfig {
3
+ }
4
+ export declare function CategoriesManager({ apiBasePath, t, }: CategoriesManagerProps): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=CategoriesManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CategoriesManager.d.ts","sourceRoot":"","sources":["../../components/CategoriesManager.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,UAAU,CAAA;AAIxD,MAAM,WAAW,sBAAuB,SAAQ,UAAU;CAAG;AAE7D,wBAAgB,iBAAiB,CAAC,EAChC,WAAoB,EACpB,CAAY,GACb,EAAE,sBAAsB,2CAiRxB"}