@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.
- package/README.md +694 -0
- package/dist/api/categories-id.d.ts +21 -0
- package/dist/api/categories-id.d.ts.map +1 -0
- package/dist/api/categories-id.js +66 -0
- package/dist/api/categories-id.js.map +1 -0
- package/dist/api/categories.d.ts +15 -0
- package/dist/api/categories.d.ts.map +1 -0
- package/dist/api/categories.js +65 -0
- package/dist/api/categories.js.map +1 -0
- package/dist/api/matrix.d.ts +15 -0
- package/dist/api/matrix.d.ts.map +1 -0
- package/dist/api/matrix.js +104 -0
- package/dist/api/matrix.js.map +1 -0
- package/dist/api/permissions-id.d.ts +21 -0
- package/dist/api/permissions-id.d.ts.map +1 -0
- package/dist/api/permissions-id.js +48 -0
- package/dist/api/permissions-id.js.map +1 -0
- package/dist/api/permissions.d.ts +16 -0
- package/dist/api/permissions.d.ts.map +1 -0
- package/dist/api/permissions.js +102 -0
- package/dist/api/permissions.js.map +1 -0
- package/dist/api/roles-id.d.ts +27 -0
- package/dist/api/roles-id.d.ts.map +1 -0
- package/dist/api/roles-id.js +89 -0
- package/dist/api/roles-id.js.map +1 -0
- package/dist/api/roles.d.ts +15 -0
- package/dist/api/roles.d.ts.map +1 -0
- package/dist/api/roles.js +65 -0
- package/dist/api/roles.js.map +1 -0
- package/dist/api/seed.d.ts +16 -0
- package/dist/api/seed.d.ts.map +1 -0
- package/dist/api/seed.js +49 -0
- package/dist/api/seed.js.map +1 -0
- package/dist/api/users-id.d.ts +28 -0
- package/dist/api/users-id.d.ts.map +1 -0
- package/dist/api/users-id.js +94 -0
- package/dist/api/users-id.js.map +1 -0
- package/dist/api/users.d.ts +17 -0
- package/dist/api/users.d.ts.map +1 -0
- package/dist/api/users.js +80 -0
- package/dist/api/users.js.map +1 -0
- package/dist/components/CategoriesManager.d.ts +5 -0
- package/dist/components/CategoriesManager.d.ts.map +1 -0
- package/dist/components/CategoriesManager.js +115 -0
- package/dist/components/CategoriesManager.js.map +1 -0
- package/dist/components/PermissionMatrix.d.ts +5 -0
- package/dist/components/PermissionMatrix.d.ts.map +1 -0
- package/dist/components/PermissionMatrix.js +82 -0
- package/dist/components/PermissionMatrix.js.map +1 -0
- package/dist/components/PermissionsManager.d.ts +5 -0
- package/dist/components/PermissionsManager.d.ts.map +1 -0
- package/dist/components/PermissionsManager.js +89 -0
- package/dist/components/PermissionsManager.js.map +1 -0
- package/dist/components/RBACManager.d.ts +5 -0
- package/dist/components/RBACManager.d.ts.map +1 -0
- package/dist/components/RBACManager.js +16 -0
- package/dist/components/RBACManager.js.map +1 -0
- package/dist/components/RolesManager.d.ts +5 -0
- package/dist/components/RolesManager.d.ts.map +1 -0
- package/dist/components/RolesManager.js +97 -0
- package/dist/components/RolesManager.js.map +1 -0
- package/dist/components/UsersManager.d.ts +10 -0
- package/dist/components/UsersManager.d.ts.map +1 -0
- package/dist/components/UsersManager.js +111 -0
- package/dist/components/UsersManager.js.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts +19 -0
- package/dist/components/ui/alert-dialog.d.ts.map +1 -0
- package/dist/components/ui/alert-dialog.js +67 -0
- package/dist/components/ui/alert-dialog.js.map +1 -0
- package/dist/components/ui/badge.d.ts +10 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.js +37 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/button.d.ts +11 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +48 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/card.d.ts +10 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/card.js +43 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts +5 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/checkbox.js +23 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +18 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/dialog.js +60 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/input.d.ts +4 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +19 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/label.d.ts +5 -0
- package/dist/components/ui/label.d.ts.map +1 -0
- package/dist/components/ui/label.js +22 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/select.d.ts +16 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/select.js +61 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/table.d.ts +11 -0
- package/dist/components/ui/table.d.ts.map +1 -0
- package/dist/components/ui/table.js +49 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.d.ts +12 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/tabs.js +46 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/rbac-api.d.ts +66 -0
- package/dist/lib/rbac-api.d.ts.map +1 -0
- package/dist/lib/rbac-api.js +158 -0
- package/dist/lib/rbac-api.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +7 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +14 -0
- package/dist/server.js.map +1 -0
- package/dist/types/index.d.ts +88 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +126 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
export interface CategoriesIdHandlerConfig {
|
|
3
|
+
checkPermission: (perm: string) => Promise<{
|
|
4
|
+
error: NextResponse | null;
|
|
5
|
+
session: any;
|
|
6
|
+
}>;
|
|
7
|
+
adminPermission: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function createCategoriesIdHandler(config: CategoriesIdHandlerConfig): {
|
|
10
|
+
PUT: (req: NextRequest, { params }: {
|
|
11
|
+
params: Promise<{
|
|
12
|
+
id: string;
|
|
13
|
+
}>;
|
|
14
|
+
}) => Promise<NextResponse<unknown>>;
|
|
15
|
+
DELETE: (req: NextRequest, { params }: {
|
|
16
|
+
params: Promise<{
|
|
17
|
+
id: string;
|
|
18
|
+
}>;
|
|
19
|
+
}) => Promise<NextResponse<unknown>>;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=categories-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categories-id.d.ts","sourceRoot":"","sources":["../../api/categories-id.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAYvD,MAAM,WAAW,yBAAyB;IACxC,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;CACxB;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,yBAAyB;eAGjD,WAAW,cAAc;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;kBAoCzD,WAAW,cAAc;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;EAsCxF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Author: Dr Hamid MADANI drmdh@msn.com
|
|
2
|
+
// RBAC API handler: PUT/DELETE /admin/categories/[id]
|
|
3
|
+
import { NextResponse } from 'next/server';
|
|
4
|
+
import { PermissionCategoryRepository, PermissionRepository } from '@mostajs/auth';
|
|
5
|
+
import { getDialect } from '@mostajs/orm';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
const updateCategorySchema = z.object({
|
|
8
|
+
label: z.string().min(1).optional(),
|
|
9
|
+
description: z.string().optional(),
|
|
10
|
+
icon: z.string().optional(),
|
|
11
|
+
order: z.number().int().min(0).optional(),
|
|
12
|
+
});
|
|
13
|
+
export function createCategoriesIdHandler(config) {
|
|
14
|
+
const { checkPermission, adminPermission } = config;
|
|
15
|
+
async function PUT(req, { params }) {
|
|
16
|
+
const { error } = await checkPermission(adminPermission);
|
|
17
|
+
if (error)
|
|
18
|
+
return error;
|
|
19
|
+
const { id } = await params;
|
|
20
|
+
const body = await req.json();
|
|
21
|
+
const parsed = updateCategorySchema.safeParse(body);
|
|
22
|
+
if (!parsed.success) {
|
|
23
|
+
return NextResponse.json({ error: { code: 'VALIDATION_ERROR', message: 'Donnees invalides', details: parsed.error.flatten() } }, { status: 400 });
|
|
24
|
+
}
|
|
25
|
+
const catRepo = new PermissionCategoryRepository(await getDialect());
|
|
26
|
+
const category = await catRepo.findById(id);
|
|
27
|
+
if (!category) {
|
|
28
|
+
return NextResponse.json({ error: { code: 'NOT_FOUND', message: 'Categorie introuvable' } }, { status: 404 });
|
|
29
|
+
}
|
|
30
|
+
const updates = {};
|
|
31
|
+
if (parsed.data.label !== undefined)
|
|
32
|
+
updates.label = parsed.data.label;
|
|
33
|
+
if (parsed.data.description !== undefined)
|
|
34
|
+
updates.description = parsed.data.description;
|
|
35
|
+
if (parsed.data.icon !== undefined)
|
|
36
|
+
updates.icon = parsed.data.icon;
|
|
37
|
+
if (parsed.data.order !== undefined)
|
|
38
|
+
updates.order = parsed.data.order;
|
|
39
|
+
const updated = await catRepo.update(id, updates);
|
|
40
|
+
return NextResponse.json({ data: updated });
|
|
41
|
+
}
|
|
42
|
+
async function DELETE(req, { params }) {
|
|
43
|
+
const { error } = await checkPermission(adminPermission);
|
|
44
|
+
if (error)
|
|
45
|
+
return error;
|
|
46
|
+
const { id } = await params;
|
|
47
|
+
const catRepo = new PermissionCategoryRepository(await getDialect());
|
|
48
|
+
const category = await catRepo.findById(id);
|
|
49
|
+
if (!category) {
|
|
50
|
+
return NextResponse.json({ error: { code: 'NOT_FOUND', message: 'Categorie introuvable' } }, { status: 404 });
|
|
51
|
+
}
|
|
52
|
+
if (category.system) {
|
|
53
|
+
return NextResponse.json({ error: { code: 'SYSTEM_PROTECTED', message: 'Les categories systeme ne peuvent pas etre supprimees' } }, { status: 403 });
|
|
54
|
+
}
|
|
55
|
+
// Check if permissions are using this category
|
|
56
|
+
const pRepo = new PermissionRepository(await getDialect());
|
|
57
|
+
const permCount = await pRepo.count({ category: category.name });
|
|
58
|
+
if (permCount > 0) {
|
|
59
|
+
return NextResponse.json({ error: { code: 'IN_USE', message: `Impossible : ${permCount} permission(s) utilisent cette categorie` } }, { status: 409 });
|
|
60
|
+
}
|
|
61
|
+
await catRepo.delete(id);
|
|
62
|
+
return NextResponse.json({ data: { message: 'Categorie supprimee' } });
|
|
63
|
+
}
|
|
64
|
+
return { PUT, DELETE };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=categories-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categories-id.js","sourceRoot":"","sources":["../../api/categories-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
import type { CategoryDefinition } from '../types';
|
|
3
|
+
export interface CategoriesHandlerConfig {
|
|
4
|
+
checkPermission: (perm: string) => Promise<{
|
|
5
|
+
error: NextResponse | null;
|
|
6
|
+
session: any;
|
|
7
|
+
}>;
|
|
8
|
+
adminPermission: string;
|
|
9
|
+
categoryDefinitions?: CategoryDefinition[];
|
|
10
|
+
}
|
|
11
|
+
export declare function createCategoriesHandler(config: CategoriesHandlerConfig): {
|
|
12
|
+
GET: () => Promise<NextResponse<unknown>>;
|
|
13
|
+
POST: (req: NextRequest) => Promise<NextResponse<unknown>>;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=categories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["../../api/categories.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAIvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAUlD,MAAM,WAAW,uBAAuB;IACtC,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,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAA;CAC3C;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,uBAAuB;;gBA4B5C,WAAW;EAsCrC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Author: Dr Hamid MADANI drmdh@msn.com
|
|
2
|
+
// RBAC API handler: GET/POST /admin/categories
|
|
3
|
+
import { NextResponse } from 'next/server';
|
|
4
|
+
import { PermissionCategoryRepository } from '@mostajs/auth';
|
|
5
|
+
import { getDialect } from '@mostajs/orm';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
const createCategorySchema = z.object({
|
|
8
|
+
name: z.string().min(1).regex(/^[a-z][a-z0-9_]*$/, 'Format requis : minuscules, chiffres et underscores'),
|
|
9
|
+
label: z.string().min(1),
|
|
10
|
+
description: z.string().optional(),
|
|
11
|
+
icon: z.string().optional(),
|
|
12
|
+
order: z.number().int().min(0).optional(),
|
|
13
|
+
});
|
|
14
|
+
export function createCategoriesHandler(config) {
|
|
15
|
+
const { checkPermission, adminPermission, categoryDefinitions = [] } = config;
|
|
16
|
+
async function GET() {
|
|
17
|
+
const { error } = await checkPermission(adminPermission);
|
|
18
|
+
if (error)
|
|
19
|
+
return error;
|
|
20
|
+
const repo = new PermissionCategoryRepository(await getDialect());
|
|
21
|
+
let categories = await repo.findAllOrdered();
|
|
22
|
+
// Fallback: if DB is empty, return hardcoded definitions
|
|
23
|
+
if (categories.length === 0) {
|
|
24
|
+
const fallback = categoryDefinitions.map((c, i) => ({
|
|
25
|
+
id: `fallback_${i}`,
|
|
26
|
+
name: c.name,
|
|
27
|
+
label: c.label,
|
|
28
|
+
description: c.description,
|
|
29
|
+
icon: c.icon,
|
|
30
|
+
order: c.order,
|
|
31
|
+
system: c.system,
|
|
32
|
+
_fallback: true,
|
|
33
|
+
}));
|
|
34
|
+
return NextResponse.json({ data: fallback });
|
|
35
|
+
}
|
|
36
|
+
return NextResponse.json({ data: categories });
|
|
37
|
+
}
|
|
38
|
+
async function POST(req) {
|
|
39
|
+
const { error } = await checkPermission(adminPermission);
|
|
40
|
+
if (error)
|
|
41
|
+
return error;
|
|
42
|
+
const body = await req.json();
|
|
43
|
+
const parsed = createCategorySchema.safeParse(body);
|
|
44
|
+
if (!parsed.success) {
|
|
45
|
+
return NextResponse.json({ error: { code: 'VALIDATION_ERROR', message: 'Donnees invalides', details: parsed.error.flatten() } }, { status: 400 });
|
|
46
|
+
}
|
|
47
|
+
const { name, label, description, icon, order } = parsed.data;
|
|
48
|
+
const repo = new PermissionCategoryRepository(await getDialect());
|
|
49
|
+
const existing = await repo.findByName(name);
|
|
50
|
+
if (existing) {
|
|
51
|
+
return NextResponse.json({ error: { code: 'DUPLICATE', message: 'Une categorie avec ce nom existe deja' } }, { status: 409 });
|
|
52
|
+
}
|
|
53
|
+
const category = await repo.create({
|
|
54
|
+
name,
|
|
55
|
+
label,
|
|
56
|
+
description: description || '',
|
|
57
|
+
icon: icon || '',
|
|
58
|
+
order: order !== null && order !== void 0 ? order : 0,
|
|
59
|
+
system: false,
|
|
60
|
+
});
|
|
61
|
+
return NextResponse.json({ data: category }, { status: 201 });
|
|
62
|
+
}
|
|
63
|
+
return { GET, POST };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=categories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categories.js","sourceRoot":"","sources":["../../api/categories.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
import type { CategoryDefinition } from '../types';
|
|
3
|
+
export interface MatrixHandlerConfig {
|
|
4
|
+
checkPermission: (perm: string) => Promise<{
|
|
5
|
+
error: NextResponse | null;
|
|
6
|
+
session: any;
|
|
7
|
+
}>;
|
|
8
|
+
adminPermission: string;
|
|
9
|
+
categoryDefinitions?: CategoryDefinition[];
|
|
10
|
+
}
|
|
11
|
+
export declare function createMatrixHandler(config: MatrixHandlerConfig): {
|
|
12
|
+
GET: () => Promise<NextResponse<unknown>>;
|
|
13
|
+
POST: (req: NextRequest) => Promise<NextResponse<unknown>>;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=matrix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../../api/matrix.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAIvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAElD,MAAM,WAAW,mBAAmB;IAClC,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,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAA;CAC3C;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB;;gBA6EpC,WAAW;EAmCrC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// Author: Dr Hamid MADANI drmdh@msn.com
|
|
2
|
+
// RBAC API handler: GET/POST /admin/permissions/matrix
|
|
3
|
+
import { NextResponse } from 'next/server';
|
|
4
|
+
import { PermissionRepository, RoleRepository, PermissionCategoryRepository } from '@mostajs/auth';
|
|
5
|
+
import { getDialect } from '@mostajs/orm';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
export function createMatrixHandler(config) {
|
|
8
|
+
const { checkPermission, adminPermission, categoryDefinitions = [] } = config;
|
|
9
|
+
async function GET() {
|
|
10
|
+
const { error } = await checkPermission(adminPermission);
|
|
11
|
+
if (error)
|
|
12
|
+
return error;
|
|
13
|
+
const [pRepo, rRepo, catRepo] = await Promise.all([
|
|
14
|
+
getDialect().then(d => new PermissionRepository(d)),
|
|
15
|
+
getDialect().then(d => new RoleRepository(d)),
|
|
16
|
+
getDialect().then(d => new PermissionCategoryRepository(d)),
|
|
17
|
+
]);
|
|
18
|
+
const [permissions, roles, dbCategories] = await Promise.all([
|
|
19
|
+
pRepo.findAllSorted(),
|
|
20
|
+
rRepo.findAllWithPermissions(),
|
|
21
|
+
catRepo.findAllOrdered(),
|
|
22
|
+
]);
|
|
23
|
+
// Build category labels from DB or fallback
|
|
24
|
+
const categoryLabels = {};
|
|
25
|
+
if (dbCategories.length > 0) {
|
|
26
|
+
for (const cat of dbCategories) {
|
|
27
|
+
categoryLabels[cat.name] = cat.label;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
for (const cat of categoryDefinitions) {
|
|
32
|
+
categoryLabels[cat.name] = cat.label;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Group permissions by category
|
|
36
|
+
const categories = {};
|
|
37
|
+
for (const p of permissions) {
|
|
38
|
+
const cat = p.category || 'other';
|
|
39
|
+
if (!categories[cat])
|
|
40
|
+
categories[cat] = [];
|
|
41
|
+
categories[cat].push({
|
|
42
|
+
id: p.id,
|
|
43
|
+
name: p.name,
|
|
44
|
+
description: p.description || '',
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
// Build matrix: roleId -> { permId: boolean }
|
|
48
|
+
const matrix = {};
|
|
49
|
+
for (const role of roles) {
|
|
50
|
+
matrix[role.id] = {};
|
|
51
|
+
const permIds = role.permissions.map((p) => { var _a; return typeof p === 'object' ? (p.id || ((_a = p._id) === null || _a === void 0 ? void 0 : _a.toString())) : p.toString(); });
|
|
52
|
+
for (const p of permissions) {
|
|
53
|
+
matrix[role.id][p.id] = permIds.includes(p.id);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return NextResponse.json({
|
|
57
|
+
data: {
|
|
58
|
+
roles: roles.map((r) => ({
|
|
59
|
+
id: r.id,
|
|
60
|
+
name: r.name,
|
|
61
|
+
description: r.description || '',
|
|
62
|
+
})),
|
|
63
|
+
categories,
|
|
64
|
+
categoryLabels,
|
|
65
|
+
matrix,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const matrixChangeSchema = z.object({
|
|
70
|
+
changes: z.array(z.object({
|
|
71
|
+
roleId: z.string(),
|
|
72
|
+
permissionId: z.string(),
|
|
73
|
+
granted: z.boolean(),
|
|
74
|
+
})),
|
|
75
|
+
});
|
|
76
|
+
async function POST(req) {
|
|
77
|
+
const { error } = await checkPermission(adminPermission);
|
|
78
|
+
if (error)
|
|
79
|
+
return error;
|
|
80
|
+
const body = await req.json();
|
|
81
|
+
const parsed = matrixChangeSchema.safeParse(body);
|
|
82
|
+
if (!parsed.success) {
|
|
83
|
+
return NextResponse.json({ error: { code: 'VALIDATION_ERROR', message: 'Données invalides', details: parsed.error.flatten() } }, { status: 400 });
|
|
84
|
+
}
|
|
85
|
+
const { changes } = parsed.data;
|
|
86
|
+
const rRepo = new RoleRepository(await getDialect());
|
|
87
|
+
let applied = 0;
|
|
88
|
+
for (const change of changes) {
|
|
89
|
+
const { roleId, permissionId, granted } = change;
|
|
90
|
+
if (granted) {
|
|
91
|
+
await rRepo.addPermission(roleId, permissionId);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
await rRepo.removePermission(roleId, permissionId);
|
|
95
|
+
}
|
|
96
|
+
applied++;
|
|
97
|
+
}
|
|
98
|
+
return NextResponse.json({
|
|
99
|
+
data: { applied, message: `${applied} modification(s) appliquée(s)` },
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return { GET, POST };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=matrix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix.js","sourceRoot":"","sources":["../../api/matrix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
export interface PermissionsIdHandlerConfig {
|
|
3
|
+
checkPermission: (perm: string) => Promise<{
|
|
4
|
+
error: NextResponse | null;
|
|
5
|
+
session: any;
|
|
6
|
+
}>;
|
|
7
|
+
adminPermission: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function createPermissionsIdHandler(config: PermissionsIdHandlerConfig): {
|
|
10
|
+
PUT: (req: NextRequest, { params }: {
|
|
11
|
+
params: Promise<{
|
|
12
|
+
id: string;
|
|
13
|
+
}>;
|
|
14
|
+
}) => Promise<NextResponse<unknown>>;
|
|
15
|
+
DELETE: (req: NextRequest, { params }: {
|
|
16
|
+
params: Promise<{
|
|
17
|
+
id: string;
|
|
18
|
+
}>;
|
|
19
|
+
}) => Promise<NextResponse<unknown>>;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=permissions-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions-id.d.ts","sourceRoot":"","sources":["../../api/permissions-id.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAUvD,MAAM,WAAW,0BAA0B;IACzC,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;CACxB;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,0BAA0B;eAIpE,WAAW,cACJ;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;kBA+B1C,WAAW,cACJ;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;EA0BlD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Author: Dr Hamid MADANI drmdh@msn.com
|
|
2
|
+
// RBAC API handler: PUT/DELETE /admin/permissions/[id]
|
|
3
|
+
import { NextResponse } from 'next/server';
|
|
4
|
+
import { PermissionRepository, RoleRepository } from '@mostajs/auth';
|
|
5
|
+
import { getDialect } from '@mostajs/orm';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
const updatePermissionSchema = z.object({
|
|
8
|
+
description: z.string().optional(),
|
|
9
|
+
category: z.string().optional(),
|
|
10
|
+
});
|
|
11
|
+
export function createPermissionsIdHandler(config) {
|
|
12
|
+
const { checkPermission, adminPermission } = config;
|
|
13
|
+
async function PUT(req, { params }) {
|
|
14
|
+
const { error } = await checkPermission(adminPermission);
|
|
15
|
+
if (error)
|
|
16
|
+
return error;
|
|
17
|
+
const { id } = await params;
|
|
18
|
+
const body = await req.json();
|
|
19
|
+
const parsed = updatePermissionSchema.safeParse(body);
|
|
20
|
+
if (!parsed.success) {
|
|
21
|
+
return NextResponse.json({ error: { code: 'VALIDATION_ERROR', message: 'Données invalides', details: parsed.error.flatten() } }, { status: 400 });
|
|
22
|
+
}
|
|
23
|
+
const pRepo = new PermissionRepository(await getDialect());
|
|
24
|
+
const permission = await pRepo.update(id, parsed.data);
|
|
25
|
+
if (!permission) {
|
|
26
|
+
return NextResponse.json({ error: { code: 'NOT_FOUND', message: 'Permission non trouvée' } }, { status: 404 });
|
|
27
|
+
}
|
|
28
|
+
return NextResponse.json({ data: permission });
|
|
29
|
+
}
|
|
30
|
+
async function DELETE(req, { params }) {
|
|
31
|
+
const { error } = await checkPermission(adminPermission);
|
|
32
|
+
if (error)
|
|
33
|
+
return error;
|
|
34
|
+
const { id } = await params;
|
|
35
|
+
const pRepo = new PermissionRepository(await getDialect());
|
|
36
|
+
const permission = await pRepo.findById(id);
|
|
37
|
+
if (!permission) {
|
|
38
|
+
return NextResponse.json({ error: { code: 'NOT_FOUND', message: 'Permission non trouvée' } }, { status: 404 });
|
|
39
|
+
}
|
|
40
|
+
// Remove permission from all roles that have it
|
|
41
|
+
const rRepo = new RoleRepository(await getDialect());
|
|
42
|
+
await rRepo.removePermissionFromAll(id);
|
|
43
|
+
await pRepo.delete(id);
|
|
44
|
+
return NextResponse.json({ data: { message: 'Permission supprimée' } });
|
|
45
|
+
}
|
|
46
|
+
return { PUT, DELETE };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=permissions-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions-id.js","sourceRoot":"","sources":["../../api/permissions-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
import type { PermissionDefinition, CategoryDefinition } from '../types';
|
|
3
|
+
export interface PermissionsHandlerConfig {
|
|
4
|
+
checkPermission: (perm: string) => Promise<{
|
|
5
|
+
error: NextResponse | null;
|
|
6
|
+
session: any;
|
|
7
|
+
}>;
|
|
8
|
+
adminPermission: string;
|
|
9
|
+
permissionDefinitions?: PermissionDefinition[];
|
|
10
|
+
categoryDefinitions?: CategoryDefinition[];
|
|
11
|
+
}
|
|
12
|
+
export declare function createPermissionsHandler(config: PermissionsHandlerConfig): {
|
|
13
|
+
GET: () => Promise<NextResponse<unknown>>;
|
|
14
|
+
POST: (req: NextRequest) => Promise<NextResponse<unknown>>;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../api/permissions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAIvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAQxE,MAAM,WAAW,wBAAwB;IACvC,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,CAAC,EAAE,oBAAoB,EAAE,CAAA;IAC9C,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAA;CAC3C;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,wBAAwB;;gBAoE9C,WAAW;EAmDrC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// Author: Dr Hamid MADANI drmdh@msn.com
|
|
2
|
+
// RBAC API handler: GET/POST /admin/permissions
|
|
3
|
+
import { NextResponse } from 'next/server';
|
|
4
|
+
import { PermissionRepository, RoleRepository, PermissionCategoryRepository } from '@mostajs/auth';
|
|
5
|
+
import { getDialect } from '@mostajs/orm';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
const createPermissionSchema = z.object({
|
|
8
|
+
name: z.string().min(1).regex(/^[a-z_]+:[a-z_]+$/, 'Format requis : categorie:action'),
|
|
9
|
+
description: z.string().optional(),
|
|
10
|
+
category: z.string().optional(),
|
|
11
|
+
});
|
|
12
|
+
export function createPermissionsHandler(config) {
|
|
13
|
+
const { checkPermission, adminPermission, permissionDefinitions = [], categoryDefinitions = [], } = config;
|
|
14
|
+
async function GET() {
|
|
15
|
+
var _a;
|
|
16
|
+
const { error } = await checkPermission(adminPermission);
|
|
17
|
+
if (error)
|
|
18
|
+
return error;
|
|
19
|
+
// Read category labels from DB, fallback to hardcoded
|
|
20
|
+
const catRepo = new PermissionCategoryRepository(await getDialect());
|
|
21
|
+
const dbCategories = await catRepo.findAllOrdered();
|
|
22
|
+
const categoryLabels = {};
|
|
23
|
+
if (dbCategories.length > 0) {
|
|
24
|
+
for (const cat of dbCategories) {
|
|
25
|
+
categoryLabels[cat.name] = cat.label;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
for (const cat of categoryDefinitions) {
|
|
30
|
+
categoryLabels[cat.name] = cat.label;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const pRepo = new PermissionRepository(await getDialect());
|
|
34
|
+
let permissions = await pRepo.findAllSorted();
|
|
35
|
+
// Fallback: if DB is empty, return hardcoded definitions
|
|
36
|
+
if (permissions.length === 0) {
|
|
37
|
+
const fallback = permissionDefinitions.map((p, i) => ({
|
|
38
|
+
id: `fallback_${i}`,
|
|
39
|
+
name: p.name,
|
|
40
|
+
description: p.description,
|
|
41
|
+
category: p.category,
|
|
42
|
+
_fallback: true,
|
|
43
|
+
}));
|
|
44
|
+
return NextResponse.json({ data: fallback, categories: categoryLabels });
|
|
45
|
+
}
|
|
46
|
+
// Count roles per permission
|
|
47
|
+
const rRepo = new RoleRepository(await getDialect());
|
|
48
|
+
const roles = await rRepo.findAllWithPermissions();
|
|
49
|
+
const permRoleCount = {};
|
|
50
|
+
for (const role of roles) {
|
|
51
|
+
for (const permId of role.permissions) {
|
|
52
|
+
const key = typeof permId === 'object' ? permId.id || ((_a = permId._id) === null || _a === void 0 ? void 0 : _a.toString()) : permId.toString();
|
|
53
|
+
permRoleCount[key] = (permRoleCount[key] || 0) + 1;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const permissionsWithCount = permissions.map((p) => (Object.assign(Object.assign({}, p), { roleCount: permRoleCount[p.id] || 0 })));
|
|
57
|
+
// Group by category
|
|
58
|
+
const grouped = {};
|
|
59
|
+
for (const p of permissionsWithCount) {
|
|
60
|
+
const cat = p.category || 'other';
|
|
61
|
+
if (!grouped[cat])
|
|
62
|
+
grouped[cat] = [];
|
|
63
|
+
grouped[cat].push(p);
|
|
64
|
+
}
|
|
65
|
+
return NextResponse.json({ data: permissionsWithCount, grouped, categories: categoryLabels });
|
|
66
|
+
}
|
|
67
|
+
async function POST(req) {
|
|
68
|
+
const { error } = await checkPermission(adminPermission);
|
|
69
|
+
if (error)
|
|
70
|
+
return error;
|
|
71
|
+
const body = await req.json();
|
|
72
|
+
const parsed = createPermissionSchema.safeParse(body);
|
|
73
|
+
if (!parsed.success) {
|
|
74
|
+
return NextResponse.json({ error: { code: 'VALIDATION_ERROR', message: 'Données invalides', details: parsed.error.flatten() } }, { status: 400 });
|
|
75
|
+
}
|
|
76
|
+
const { name, description, category } = parsed.data;
|
|
77
|
+
const pRepo = new PermissionRepository(await getDialect());
|
|
78
|
+
const existing = await pRepo.findByName(name);
|
|
79
|
+
if (existing) {
|
|
80
|
+
return NextResponse.json({ error: { code: 'DUPLICATE', message: 'Une permission avec ce nom existe déjà' } }, { status: 409 });
|
|
81
|
+
}
|
|
82
|
+
// Auto-derive category from name if not provided
|
|
83
|
+
const derivedCategory = category || name.split(':')[0];
|
|
84
|
+
// Validate category exists in DB or in fallback definitions
|
|
85
|
+
const catRepo = new PermissionCategoryRepository(await getDialect());
|
|
86
|
+
const catExists = await catRepo.findByName(derivedCategory);
|
|
87
|
+
if (!catExists) {
|
|
88
|
+
const fallbackExists = categoryDefinitions.some((c) => c.name === derivedCategory);
|
|
89
|
+
if (!fallbackExists) {
|
|
90
|
+
return NextResponse.json({ error: { code: 'INVALID_CATEGORY', message: `La categorie '${derivedCategory}' n'existe pas` } }, { status: 400 });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const permission = await pRepo.create({
|
|
94
|
+
name,
|
|
95
|
+
description: description || '',
|
|
96
|
+
category: derivedCategory,
|
|
97
|
+
});
|
|
98
|
+
return NextResponse.json({ data: permission }, { status: 201 });
|
|
99
|
+
}
|
|
100
|
+
return { GET, POST };
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../api/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
export interface RolesIdHandlerConfig {
|
|
3
|
+
checkPermission: (perm: string) => Promise<{
|
|
4
|
+
error: NextResponse | null;
|
|
5
|
+
session: any;
|
|
6
|
+
}>;
|
|
7
|
+
adminPermission: string;
|
|
8
|
+
systemRoles?: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function createRolesIdHandler(config: RolesIdHandlerConfig): {
|
|
11
|
+
GET: (req: NextRequest, { params }: {
|
|
12
|
+
params: Promise<{
|
|
13
|
+
id: string;
|
|
14
|
+
}>;
|
|
15
|
+
}) => Promise<NextResponse<unknown>>;
|
|
16
|
+
PUT: (req: NextRequest, { params }: {
|
|
17
|
+
params: Promise<{
|
|
18
|
+
id: string;
|
|
19
|
+
}>;
|
|
20
|
+
}) => Promise<NextResponse<unknown>>;
|
|
21
|
+
DELETE: (req: NextRequest, { params }: {
|
|
22
|
+
params: Promise<{
|
|
23
|
+
id: string;
|
|
24
|
+
}>;
|
|
25
|
+
}) => Promise<NextResponse<unknown>>;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=roles-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles-id.d.ts","sourceRoot":"","sources":["../../api/roles-id.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAWvD,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,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB;eAIxD,WAAW,cACJ;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;eAuB1C,WAAW,cACJ;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;kBA2D1C,WAAW,cACJ;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;EAsClD"}
|