@arch-cadre/core 0.0.41 → 0.0.42
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/dist/_virtual/_rolldown/runtime.mjs +1 -0
- package/dist/core/auth/augment.d.mts +20 -0
- package/dist/core/auth/augment.d.mts.map +1 -0
- package/dist/core/auth/augment.mjs +2 -0
- package/dist/core/auth/augment.mjs.map +1 -0
- package/dist/core/auth/email-verification.d.mts +62 -0
- package/dist/core/auth/email-verification.d.mts.map +1 -0
- package/dist/core/auth/email-verification.mjs +2 -0
- package/dist/core/auth/email-verification.mjs.map +1 -0
- package/dist/core/auth/logic.d.mts +110 -0
- package/dist/core/auth/logic.d.mts.map +1 -0
- package/dist/core/auth/logic.mjs +2 -0
- package/dist/core/auth/logic.mjs.map +1 -0
- package/dist/core/auth/password-reset.d.mts +39 -0
- package/dist/core/auth/password-reset.d.mts.map +1 -0
- package/dist/core/auth/password-reset.mjs +2 -0
- package/dist/core/auth/password-reset.mjs.map +1 -0
- package/dist/core/auth/rbac.d.mts +61 -0
- package/dist/core/auth/rbac.d.mts.map +1 -0
- package/dist/core/auth/rbac.mjs +2 -0
- package/dist/core/auth/rbac.mjs.map +1 -0
- package/dist/core/auth/session.d.mts +54 -0
- package/dist/core/auth/session.d.mts.map +1 -0
- package/dist/core/auth/session.mjs +2 -0
- package/dist/core/auth/session.mjs.map +1 -0
- package/dist/core/auth/types.d.mts +55 -0
- package/dist/core/auth/types.d.mts.map +1 -0
- package/dist/core/auth/utils/encode.d.mts +15 -0
- package/dist/core/auth/utils/encode.d.mts.map +1 -0
- package/dist/core/auth/utils/encode.mjs +2 -0
- package/dist/core/auth/utils/encode.mjs.map +1 -0
- package/dist/core/auth/utils/{encryption.d.ts → encryption.d.mts} +8 -5
- package/dist/core/auth/utils/encryption.d.mts.map +1 -0
- package/dist/core/auth/utils/encryption.mjs +2 -0
- package/dist/core/auth/utils/encryption.mjs.map +1 -0
- package/dist/core/auth/validation.d.mts +48 -0
- package/dist/core/auth/validation.d.mts.map +1 -0
- package/dist/core/auth/validation.mjs +2 -0
- package/dist/core/auth/validation.mjs.map +1 -0
- package/dist/core/bootstrap.d.mts +5 -0
- package/dist/core/bootstrap.d.mts.map +1 -0
- package/dist/core/bootstrap.mjs +2 -0
- package/dist/core/bootstrap.mjs.map +1 -0
- package/dist/core/config.d.mts +11 -0
- package/dist/core/config.d.mts.map +1 -0
- package/dist/core/config.mjs +2 -0
- package/dist/core/config.mjs.map +1 -0
- package/dist/core/config.server.d.mts +16 -0
- package/dist/core/config.server.d.mts.map +1 -0
- package/dist/core/config.server.mjs +2 -0
- package/dist/core/config.server.mjs.map +1 -0
- package/dist/core/event-bus.d.mts +17 -0
- package/dist/core/event-bus.d.mts.map +1 -0
- package/dist/core/event-bus.mjs +2 -0
- package/dist/core/event-bus.mjs.map +1 -0
- package/dist/core/filesystem/index.mjs +2 -0
- package/dist/core/filesystem/index.mjs.map +1 -0
- package/dist/core/filesystem/providers/local.mjs +2 -0
- package/dist/core/filesystem/providers/local.mjs.map +1 -0
- package/dist/core/filesystem/service.d.mts +19 -0
- package/dist/core/filesystem/service.d.mts.map +1 -0
- package/dist/core/filesystem/service.mjs +2 -0
- package/dist/core/filesystem/service.mjs.map +1 -0
- package/dist/core/filesystem/types.d.mts +22 -0
- package/dist/core/filesystem/types.d.mts.map +1 -0
- package/dist/core/notifications/actions.d.mts +58 -0
- package/dist/core/notifications/actions.d.mts.map +1 -0
- package/dist/core/notifications/actions.mjs +2 -0
- package/dist/core/notifications/actions.mjs.map +1 -0
- package/dist/core/notifications/index.mjs +1 -0
- package/dist/core/notifications/service.d.mts +9 -0
- package/dist/core/notifications/service.d.mts.map +1 -0
- package/dist/core/notifications/service.mjs +2 -0
- package/dist/core/notifications/service.mjs.map +1 -0
- package/dist/core/notifications/types.d.mts +21 -0
- package/dist/core/notifications/types.d.mts.map +1 -0
- package/dist/core/setup.d.mts +9 -0
- package/dist/core/setup.d.mts.map +1 -0
- package/dist/core/setup.mjs +2 -0
- package/dist/core/setup.mjs.map +1 -0
- package/dist/core/types.d.mts +13 -0
- package/dist/core/types.d.mts.map +1 -0
- package/dist/index.d.mts +8 -0
- package/dist/index.mjs +1 -0
- package/dist/server/auth/email.d.mts +13 -0
- package/dist/server/auth/email.d.mts.map +1 -0
- package/dist/server/auth/email.mjs +2 -0
- package/dist/server/auth/email.mjs.map +1 -0
- package/dist/server/auth/{password.d.ts → password.d.mts} +7 -4
- package/dist/server/auth/password.d.mts.map +1 -0
- package/dist/server/auth/password.mjs +2 -0
- package/dist/server/auth/password.mjs.map +1 -0
- package/dist/server/auth/user.d.mts +58 -0
- package/dist/server/auth/user.d.mts.map +1 -0
- package/dist/server/auth/user.mjs +2 -0
- package/dist/server/auth/user.mjs.map +1 -0
- package/dist/server/database/inject.d.mts +15 -0
- package/dist/server/database/inject.d.mts.map +1 -0
- package/dist/server/database/inject.mjs +2 -0
- package/dist/server/database/inject.mjs.map +1 -0
- package/dist/server/database/schema.d.mts +2962 -0
- package/dist/server/database/{schema.d.ts.map → schema.d.mts.map} +1 -1
- package/dist/server/database/schema.mjs +2 -0
- package/dist/server/database/schema.mjs.map +1 -0
- package/dist/server/emails/index.d.mts +26 -0
- package/dist/server/emails/index.d.mts.map +1 -0
- package/dist/server/emails/index.mjs +2 -0
- package/dist/server/emails/index.mjs.map +1 -0
- package/dist/server.d.mts +26 -0
- package/dist/server.mjs +1 -0
- package/package.json +4 -5
- package/dist/core/auth/augment.d.ts +0 -18
- package/dist/core/auth/augment.d.ts.map +0 -1
- package/dist/core/auth/augment.js +0 -53
- package/dist/core/auth/email-verification.d.ts +0 -58
- package/dist/core/auth/email-verification.d.ts.map +0 -1
- package/dist/core/auth/email-verification.js +0 -115
- package/dist/core/auth/events.d.ts +0 -53
- package/dist/core/auth/events.d.ts.map +0 -1
- package/dist/core/auth/events.js +0 -2
- package/dist/core/auth/logic.d.ts +0 -106
- package/dist/core/auth/logic.d.ts.map +0 -1
- package/dist/core/auth/logic.js +0 -264
- package/dist/core/auth/password-reset.d.ts +0 -35
- package/dist/core/auth/password-reset.d.ts.map +0 -1
- package/dist/core/auth/password-reset.js +0 -132
- package/dist/core/auth/rbac.d.ts +0 -56
- package/dist/core/auth/rbac.d.ts.map +0 -1
- package/dist/core/auth/rbac.js +0 -151
- package/dist/core/auth/session.d.ts +0 -50
- package/dist/core/auth/session.d.ts.map +0 -1
- package/dist/core/auth/session.js +0 -167
- package/dist/core/auth/types.d.ts +0 -52
- package/dist/core/auth/types.d.ts.map +0 -1
- package/dist/core/auth/types.js +0 -2
- package/dist/core/auth/utils/encode.d.ts +0 -12
- package/dist/core/auth/utils/encode.d.ts.map +0 -1
- package/dist/core/auth/utils/encode.js +0 -24
- package/dist/core/auth/utils/encryption.d.ts.map +0 -1
- package/dist/core/auth/utils/encryption.js +0 -68
- package/dist/core/auth/validation.d.ts +0 -44
- package/dist/core/auth/validation.d.ts.map +0 -1
- package/dist/core/auth/validation.js +0 -44
- package/dist/core/bootstrap.d.ts +0 -2
- package/dist/core/bootstrap.d.ts.map +0 -1
- package/dist/core/bootstrap.js +0 -54
- package/dist/core/config.d.ts +0 -9
- package/dist/core/config.d.ts.map +0 -1
- package/dist/core/config.js +0 -6
- package/dist/core/config.server.d.ts +0 -12
- package/dist/core/config.server.d.ts.map +0 -1
- package/dist/core/config.server.js +0 -101
- package/dist/core/event-bus.d.ts +0 -14
- package/dist/core/event-bus.d.ts.map +0 -1
- package/dist/core/event-bus.js +0 -54
- package/dist/core/filesystem/index.d.ts +0 -4
- package/dist/core/filesystem/index.d.ts.map +0 -1
- package/dist/core/filesystem/index.js +0 -27
- package/dist/core/filesystem/providers/local.d.ts +0 -8
- package/dist/core/filesystem/providers/local.d.ts.map +0 -1
- package/dist/core/filesystem/providers/local.js +0 -49
- package/dist/core/filesystem/service.d.ts +0 -16
- package/dist/core/filesystem/service.d.ts.map +0 -1
- package/dist/core/filesystem/service.js +0 -54
- package/dist/core/filesystem/types.d.ts +0 -19
- package/dist/core/filesystem/types.d.ts.map +0 -1
- package/dist/core/filesystem/types.js +0 -2
- package/dist/core/notifications/actions.d.ts +0 -54
- package/dist/core/notifications/actions.d.ts.map +0 -1
- package/dist/core/notifications/actions.js +0 -49
- package/dist/core/notifications/index.d.ts +0 -4
- package/dist/core/notifications/index.d.ts.map +0 -1
- package/dist/core/notifications/index.js +0 -19
- package/dist/core/notifications/service.d.ts +0 -7
- package/dist/core/notifications/service.d.ts.map +0 -1
- package/dist/core/notifications/service.js +0 -35
- package/dist/core/notifications/types.d.ts +0 -17
- package/dist/core/notifications/types.d.ts.map +0 -1
- package/dist/core/notifications/types.js +0 -2
- package/dist/core/setup.d.ts +0 -6
- package/dist/core/setup.d.ts.map +0 -1
- package/dist/core/setup.js +0 -28
- package/dist/core/types.d.ts +0 -10
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js +0 -2
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -32
- package/dist/server/auth/email.d.ts +0 -10
- package/dist/server/auth/email.d.ts.map +0 -1
- package/dist/server/auth/email.js +0 -24
- package/dist/server/auth/password.d.ts.map +0 -1
- package/dist/server/auth/password.js +0 -38
- package/dist/server/auth/types.d.ts +0 -13
- package/dist/server/auth/types.d.ts.map +0 -1
- package/dist/server/auth/types.js +0 -17
- package/dist/server/auth/user.d.ts +0 -54
- package/dist/server/auth/user.d.ts.map +0 -1
- package/dist/server/auth/user.js +0 -237
- package/dist/server/database/inject.d.ts +0 -11
- package/dist/server/database/inject.d.ts.map +0 -1
- package/dist/server/database/inject.js +0 -33
- package/dist/server/database/schema.d.ts +0 -2953
- package/dist/server/database/schema.js +0 -195
- package/dist/server/database/types.d.ts +0 -12
- package/dist/server/database/types.d.ts.map +0 -1
- package/dist/server/database/types.js +0 -2
- package/dist/server/emails/index.d.ts +0 -23
- package/dist/server/emails/index.d.ts.map +0 -1
- package/dist/server/emails/index.js +0 -73
- package/dist/server.d.ts +0 -25
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -48
package/dist/core/auth/logic.js
DELETED
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
"use server";
|
|
3
|
-
var _a, _b, _c, _d;
|
|
4
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.augmentSession = exports.augmentUser = exports.registerPasswordResetSessionAugmenter = exports.registerSessionAugmenter = exports.registerIdentityAugmenter = void 0;
|
|
6
|
-
exports.registerAuthValidator = registerAuthValidator;
|
|
7
|
-
exports.registerPasswordResetValidator = registerPasswordResetValidator;
|
|
8
|
-
exports.registerEmailVerificationValidator = registerEmailVerificationValidator;
|
|
9
|
-
exports.registerSecurityRequirement = registerSecurityRequirement;
|
|
10
|
-
exports.runPasswordResetValidators = runPasswordResetValidators;
|
|
11
|
-
exports.runEmailVerificationValidators = runEmailVerificationValidators;
|
|
12
|
-
exports.performFullUserAugmentation = performFullUserAugmentation;
|
|
13
|
-
exports.checkSecurity = checkSecurity;
|
|
14
|
-
exports.signIn = signIn;
|
|
15
|
-
exports.signUp = signUp;
|
|
16
|
-
exports.finalizeLogin = finalizeLogin;
|
|
17
|
-
exports.signOut = signOut;
|
|
18
|
-
const drizzle_orm_1 = require("drizzle-orm");
|
|
19
|
-
const password_1 = require("../../server/auth/password");
|
|
20
|
-
const user_1 = require("../../server/auth/user");
|
|
21
|
-
const inject_1 = require("../../server/database/inject");
|
|
22
|
-
const schema_1 = require("../../server/database/schema");
|
|
23
|
-
const event_bus_1 = require("../event-bus");
|
|
24
|
-
const augment_1 = require("./augment");
|
|
25
|
-
Object.defineProperty(exports, "augmentSession", { enumerable: true, get: function () { return augment_1.augmentSession; } });
|
|
26
|
-
Object.defineProperty(exports, "augmentUser", { enumerable: true, get: function () { return augment_1.augmentUser; } });
|
|
27
|
-
Object.defineProperty(exports, "registerIdentityAugmenter", { enumerable: true, get: function () { return augment_1.registerIdentityAugmenter; } });
|
|
28
|
-
Object.defineProperty(exports, "registerPasswordResetSessionAugmenter", { enumerable: true, get: function () { return augment_1.registerPasswordResetSessionAugmenter; } });
|
|
29
|
-
Object.defineProperty(exports, "registerSessionAugmenter", { enumerable: true, get: function () { return augment_1.registerSessionAugmenter; } });
|
|
30
|
-
const email_verification_1 = require("./email-verification");
|
|
31
|
-
const session_1 = require("./session");
|
|
32
|
-
const validation_1 = require("./validation");
|
|
33
|
-
/**
|
|
34
|
-
* Podstawowy moduł rozszerzający tożsamość dla ról i uprawnień
|
|
35
|
-
*/
|
|
36
|
-
async function coreRbacAugmenter(user) {
|
|
37
|
-
try {
|
|
38
|
-
// 1. Fetch direct roles
|
|
39
|
-
const userRoles = await inject_1.db
|
|
40
|
-
.select({ name: schema_1.rolesTable.name })
|
|
41
|
-
.from(schema_1.usersToRolesTable)
|
|
42
|
-
.innerJoin(schema_1.rolesTable, (0, drizzle_orm_1.eq)(schema_1.usersToRolesTable.roleId, schema_1.rolesTable.id))
|
|
43
|
-
.where((0, drizzle_orm_1.eq)(schema_1.usersToRolesTable.userId, user.id));
|
|
44
|
-
const roles = userRoles.map((r) => r.name);
|
|
45
|
-
// 2. Fetch direct permissions
|
|
46
|
-
const userDirectPerms = await inject_1.db
|
|
47
|
-
.select({ name: schema_1.permissionsTable.name })
|
|
48
|
-
.from(schema_1.usersToPermissionsTable)
|
|
49
|
-
.innerJoin(schema_1.permissionsTable, (0, drizzle_orm_1.eq)(schema_1.usersToPermissionsTable.permissionId, schema_1.permissionsTable.id))
|
|
50
|
-
.where((0, drizzle_orm_1.eq)(schema_1.usersToPermissionsTable.userId, user.id));
|
|
51
|
-
const directPerms = userDirectPerms.map((p) => p.name);
|
|
52
|
-
// 3. Fetch permissions from roles
|
|
53
|
-
let rolePerms = [];
|
|
54
|
-
if (roles.length > 0) {
|
|
55
|
-
const roleIdsResult = await inject_1.db
|
|
56
|
-
.select({ id: schema_1.rolesTable.id })
|
|
57
|
-
.from(schema_1.rolesTable)
|
|
58
|
-
.where((0, drizzle_orm_1.inArray)(schema_1.rolesTable.name, roles));
|
|
59
|
-
const roleIds = roleIdsResult.map((r) => r.id);
|
|
60
|
-
if (roleIds.length > 0) {
|
|
61
|
-
const rolePermsData = await inject_1.db
|
|
62
|
-
.select({ name: schema_1.permissionsTable.name })
|
|
63
|
-
.from(schema_1.rolesToPermissionsTable)
|
|
64
|
-
.innerJoin(schema_1.permissionsTable, (0, drizzle_orm_1.eq)(schema_1.rolesToPermissionsTable.permissionId, schema_1.permissionsTable.id))
|
|
65
|
-
.where((0, drizzle_orm_1.inArray)(schema_1.rolesToPermissionsTable.roleId, roleIds));
|
|
66
|
-
rolePerms = rolePermsData.map((p) => p.name);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return {
|
|
70
|
-
roles,
|
|
71
|
-
permissions: Array.from(new Set([...directPerms, ...rolePerms])),
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
console.error("[Auth:RBAC] Failed to augment user:", error);
|
|
76
|
-
return { roles: [], permissions: [] };
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
const globalForAuth = globalThis;
|
|
80
|
-
const authValidators = (_a = globalForAuth.__KRYO_AUTH_VALIDATORS__) !== null && _a !== void 0 ? _a : new Set();
|
|
81
|
-
const securityRequirements = (_b = globalForAuth.__KRYO_SECURITY_REQUIREMENTS__) !== null && _b !== void 0 ? _b : new Set();
|
|
82
|
-
const passwordResetValidators = (_c = globalForAuth.__KRYO_PASSWORD_RESET_VALIDATORS__) !== null && _c !== void 0 ? _c : new Set();
|
|
83
|
-
const emailVerificationValidators = (_d = globalForAuth.__KRYO_EMAIL_VERIFICATION_VALIDATORS__) !== null && _d !== void 0 ? _d : new Set();
|
|
84
|
-
globalForAuth.__KRYO_AUTH_VALIDATORS__ = authValidators;
|
|
85
|
-
globalForAuth.__KRYO_SECURITY_REQUIREMENTS__ = securityRequirements;
|
|
86
|
-
globalForAuth.__KRYO_PASSWORD_RESET_VALIDATORS__ = passwordResetValidators;
|
|
87
|
-
globalForAuth.__KRYO_EMAIL_VERIFICATION_VALIDATORS__ =
|
|
88
|
-
emailVerificationValidators;
|
|
89
|
-
async function registerAuthValidator(validator) {
|
|
90
|
-
authValidators.add(validator);
|
|
91
|
-
}
|
|
92
|
-
async function registerPasswordResetValidator(validator) {
|
|
93
|
-
passwordResetValidators.add(validator);
|
|
94
|
-
}
|
|
95
|
-
async function registerEmailVerificationValidator(validator) {
|
|
96
|
-
emailVerificationValidators.add(validator);
|
|
97
|
-
}
|
|
98
|
-
async function registerSecurityRequirement(requirement) {
|
|
99
|
-
securityRequirements.add(requirement);
|
|
100
|
-
}
|
|
101
|
-
async function runPasswordResetValidators(userId) {
|
|
102
|
-
for (const validator of passwordResetValidators) {
|
|
103
|
-
const interception = await validator(userId);
|
|
104
|
-
if (interception)
|
|
105
|
-
return interception;
|
|
106
|
-
}
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
async function runEmailVerificationValidators(userId) {
|
|
110
|
-
for (const validator of emailVerificationValidators) {
|
|
111
|
-
const interception = await validator(userId);
|
|
112
|
-
if (interception)
|
|
113
|
-
return interception;
|
|
114
|
-
}
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Augments a base user with data from all registered modules.
|
|
119
|
-
* This is now just a wrapper that includes core RBAC data.
|
|
120
|
-
*/
|
|
121
|
-
async function performFullUserAugmentation(user) {
|
|
122
|
-
const coreRbacData = await coreRbacAugmenter(user);
|
|
123
|
-
return await (0, augment_1.augmentUser)(user, coreRbacData);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Checks if the current session satisfies all registered security requirements.
|
|
127
|
-
*/
|
|
128
|
-
async function checkSecurity(session, user, requiredRoles, requiredPermissions, fallbackRedirect) {
|
|
129
|
-
var _a;
|
|
130
|
-
if (!user) {
|
|
131
|
-
console.warn("User is required for security check");
|
|
132
|
-
return { satisfied: false, redirect: fallbackRedirect !== null && fallbackRedirect !== void 0 ? fallbackRedirect : "/signin" };
|
|
133
|
-
}
|
|
134
|
-
const userRoles = Array.isArray(user.roles) ? user.roles : [];
|
|
135
|
-
const userPermissions = Array.isArray(user.permissions)
|
|
136
|
-
? user.permissions
|
|
137
|
-
: [];
|
|
138
|
-
// 1. Core Role Check (At least one role must match)
|
|
139
|
-
if (requiredRoles && requiredRoles.length > 0) {
|
|
140
|
-
const hasRole = requiredRoles.some((role) => userRoles.includes(role));
|
|
141
|
-
if (!hasRole) {
|
|
142
|
-
console.warn(`User lacks required roles: ${requiredRoles.join(", ")}`);
|
|
143
|
-
return {
|
|
144
|
-
satisfied: false,
|
|
145
|
-
redirect: fallbackRedirect,
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
// 2. Core Permission Check (ALL permissions must match)
|
|
150
|
-
if (requiredPermissions && requiredPermissions.length > 0) {
|
|
151
|
-
const hasAllPermissions = requiredPermissions.every((perm) => userPermissions.includes(perm));
|
|
152
|
-
if (!hasAllPermissions) {
|
|
153
|
-
console.warn(`User lacks required permissions: ${requiredPermissions.join(", ")}`);
|
|
154
|
-
return {
|
|
155
|
-
satisfied: false,
|
|
156
|
-
redirect: fallbackRedirect,
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
// 3. Modular Requirements Check
|
|
161
|
-
if (securityRequirements) {
|
|
162
|
-
for (const requirement of securityRequirements) {
|
|
163
|
-
try {
|
|
164
|
-
const result = await requirement(session, user);
|
|
165
|
-
if (result && !result.satisfied) {
|
|
166
|
-
return {
|
|
167
|
-
...result,
|
|
168
|
-
redirect: (_a = result.redirect) !== null && _a !== void 0 ? _a : fallbackRedirect,
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
catch (error) {
|
|
173
|
-
console.error("[Auth:Security] Requirement failed:", error);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
return { satisfied: true };
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Sign In Logic
|
|
181
|
-
*/
|
|
182
|
-
async function signIn(data) {
|
|
183
|
-
const { email, password } = await validation_1.loginSchema.parseAsync(data);
|
|
184
|
-
const user = await (0, user_1.getUserFromEmail)(email);
|
|
185
|
-
if (!user) {
|
|
186
|
-
return { status: "ERROR", message: "Invalid email or password" };
|
|
187
|
-
}
|
|
188
|
-
const passwordHash = await (0, user_1.getUserPasswordHash)(user.id);
|
|
189
|
-
if (!passwordHash || !(await (0, password_1.verifyPasswordHash)(passwordHash, password))) {
|
|
190
|
-
return { status: "ERROR", message: "Invalid email or password" };
|
|
191
|
-
}
|
|
192
|
-
// Interception Layer
|
|
193
|
-
for (const validator of authValidators) {
|
|
194
|
-
const interception = await validator(user.id);
|
|
195
|
-
if (interception)
|
|
196
|
-
return interception;
|
|
197
|
-
}
|
|
198
|
-
const sessionFlags = {};
|
|
199
|
-
const sessionToken = await (0, session_1.generateSessionToken)();
|
|
200
|
-
const session = await (0, session_1.createSession)(sessionToken, user.id, sessionFlags);
|
|
201
|
-
await (0, session_1.setSessionTokenCookie)(sessionToken, session.expiresAt);
|
|
202
|
-
const fullUser = await performFullUserAugmentation(user);
|
|
203
|
-
await event_bus_1.eventBus.publish("auth:session-created", { session, user: fullUser });
|
|
204
|
-
return {
|
|
205
|
-
status: "SUCCESS",
|
|
206
|
-
session: { ...session },
|
|
207
|
-
user: { ...fullUser },
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Sign Up Logic
|
|
212
|
-
*/
|
|
213
|
-
async function signUp(data) {
|
|
214
|
-
const { email, username, password } = validation_1.registerSchema.parse(data);
|
|
215
|
-
if (!(await (0, user_1.verifyUsernameInput)(username))) {
|
|
216
|
-
throw new Error("Invalid username");
|
|
217
|
-
}
|
|
218
|
-
if (!(await (0, password_1.verifyPasswordStrength)(password))) {
|
|
219
|
-
throw new Error("Weak password");
|
|
220
|
-
}
|
|
221
|
-
const user = await (0, user_1.createUser)(email, username, password);
|
|
222
|
-
const verificationRequest = await (0, email_verification_1.createEmailVerificationRequest)(user.id, user.email);
|
|
223
|
-
await (0, email_verification_1.sendVerificationEmail)(verificationRequest.email, verificationRequest.code);
|
|
224
|
-
await (0, email_verification_1.setEmailVerificationRequestCookie)(verificationRequest);
|
|
225
|
-
const sessionFlags = {};
|
|
226
|
-
const sessionToken = await (0, session_1.generateSessionToken)();
|
|
227
|
-
const session = await (0, session_1.createSession)(sessionToken, user.id, sessionFlags);
|
|
228
|
-
await (0, session_1.setSessionTokenCookie)(sessionToken, session.expiresAt);
|
|
229
|
-
const fullUser = await performFullUserAugmentation(user);
|
|
230
|
-
await event_bus_1.eventBus.publish("auth:session-created", { session, user: fullUser });
|
|
231
|
-
return {
|
|
232
|
-
session: { ...session },
|
|
233
|
-
user: { ...fullUser },
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Finalizes login after a challenge
|
|
238
|
-
*/
|
|
239
|
-
async function finalizeLogin(userId, flags) {
|
|
240
|
-
const sessionToken = await (0, session_1.generateSessionToken)();
|
|
241
|
-
const session = await (0, session_1.createSession)(sessionToken, userId, flags);
|
|
242
|
-
await (0, session_1.setSessionTokenCookie)(sessionToken, session.expiresAt);
|
|
243
|
-
const user = await (0, user_1.getUserById)(userId);
|
|
244
|
-
if (user) {
|
|
245
|
-
await event_bus_1.eventBus.publish("auth:session-created", { session, user });
|
|
246
|
-
}
|
|
247
|
-
return {
|
|
248
|
-
session: session ? { ...session } : null,
|
|
249
|
-
user: user ? { ...user } : null,
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Sign Out
|
|
254
|
-
*/
|
|
255
|
-
async function signOut() {
|
|
256
|
-
const { session, user } = await (0, session_1.getCurrentSession)();
|
|
257
|
-
if (session) {
|
|
258
|
-
if (user) {
|
|
259
|
-
await event_bus_1.eventBus.publish("auth:signed-out", { userId: user.id });
|
|
260
|
-
}
|
|
261
|
-
await (0, session_1.invalidateSession)(session.id);
|
|
262
|
-
await (0, session_1.deleteSessionTokenCookie)();
|
|
263
|
-
}
|
|
264
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type { PasswordResetAuthSession, PasswordResetSession } from "./types";
|
|
2
|
-
/**
|
|
3
|
-
* Creates a new password reset session.
|
|
4
|
-
*/
|
|
5
|
-
export declare function createPasswordResetSession(token: string, userId: string, email: string): Promise<PasswordResetSession>;
|
|
6
|
-
/**
|
|
7
|
-
* Validates the password reset session token and retrieves user data.
|
|
8
|
-
* The user data is augmented by registered modules (e.g. 2FA).
|
|
9
|
-
*/
|
|
10
|
-
export declare function validatePasswordResetSessionToken(token: string): Promise<PasswordResetAuthSession>;
|
|
11
|
-
/**
|
|
12
|
-
* Marks the password reset session as email verified.
|
|
13
|
-
*/
|
|
14
|
-
export declare function setPasswordResetSessionAsEmailVerified(sessionId: string): Promise<void>;
|
|
15
|
-
/**
|
|
16
|
-
* Invalidates all password reset sessions for a user.
|
|
17
|
-
*/
|
|
18
|
-
export declare function invalidateUserPasswordResetSessions(userId: string): Promise<void>;
|
|
19
|
-
/**
|
|
20
|
-
* Validates the current password reset session from cookies.
|
|
21
|
-
*/
|
|
22
|
-
export declare function getCurrentPasswordResetSession(): Promise<PasswordResetAuthSession>;
|
|
23
|
-
/**
|
|
24
|
-
* Sets the password reset session token cookie.
|
|
25
|
-
*/
|
|
26
|
-
export declare function setPasswordResetSessionTokenCookie(token: string, expiresAt: Date): Promise<void>;
|
|
27
|
-
/**
|
|
28
|
-
* Deletes the password reset session token cookie.
|
|
29
|
-
*/
|
|
30
|
-
export declare function deletePasswordResetSessionTokenCookie(): Promise<void>;
|
|
31
|
-
/**
|
|
32
|
-
* Sends a password reset email with the OTP code.
|
|
33
|
-
*/
|
|
34
|
-
export declare function sendPasswordResetEmail(email: string, code: string): Promise<void>;
|
|
35
|
-
//# sourceMappingURL=password-reset.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"password-reset.d.ts","sourceRoot":"","sources":["../../../src/core/auth/password-reset.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAG9E;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,oBAAoB,CAAC,CAe/B;AAED;;;GAGG;AACH,wBAAsB,iCAAiC,CACrD,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,wBAAwB,CAAC,CAoCnC;AAED;;GAEG;AACH,wBAAsB,sCAAsC,CAC1D,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,mCAAmC,CACvD,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;GAEG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAexF;AAED;;GAEG;AACH,wBAAsB,kCAAkC,CACtD,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,IAAI,GACd,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;GAEG;AACH,wBAAsB,qCAAqC,IAAI,OAAO,CAAC,IAAI,CAAC,CAG3E;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
"use server";
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.createPasswordResetSession = createPasswordResetSession;
|
|
5
|
-
exports.validatePasswordResetSessionToken = validatePasswordResetSessionToken;
|
|
6
|
-
exports.setPasswordResetSessionAsEmailVerified = setPasswordResetSessionAsEmailVerified;
|
|
7
|
-
exports.invalidateUserPasswordResetSessions = invalidateUserPasswordResetSessions;
|
|
8
|
-
exports.getCurrentPasswordResetSession = getCurrentPasswordResetSession;
|
|
9
|
-
exports.setPasswordResetSessionTokenCookie = setPasswordResetSessionTokenCookie;
|
|
10
|
-
exports.deletePasswordResetSessionTokenCookie = deletePasswordResetSessionTokenCookie;
|
|
11
|
-
exports.sendPasswordResetEmail = sendPasswordResetEmail;
|
|
12
|
-
const sha2_1 = require("@oslojs/crypto/sha2");
|
|
13
|
-
const encoding_1 = require("@oslojs/encoding");
|
|
14
|
-
const date_fns_1 = require("date-fns");
|
|
15
|
-
const drizzle_orm_1 = require("drizzle-orm");
|
|
16
|
-
const headers_1 = require("next/headers");
|
|
17
|
-
const inject_1 = require("../../server/database/inject");
|
|
18
|
-
const schema_1 = require("../../server/database/schema");
|
|
19
|
-
const index_1 = require("../../server/emails/index");
|
|
20
|
-
const augment_1 = require("./augment");
|
|
21
|
-
const logic_1 = require("./logic");
|
|
22
|
-
const encode_1 = require("./utils/encode");
|
|
23
|
-
/**
|
|
24
|
-
* Creates a new password reset session.
|
|
25
|
-
*/
|
|
26
|
-
async function createPasswordResetSession(token, userId, email) {
|
|
27
|
-
const sessionId = (0, encoding_1.encodeHexLowerCase)((0, sha2_1.sha256)(new TextEncoder().encode(token)));
|
|
28
|
-
const [session] = await inject_1.db
|
|
29
|
-
.insert(schema_1.passwordResetSessionTable)
|
|
30
|
-
.values({
|
|
31
|
-
id: sessionId,
|
|
32
|
-
email: email,
|
|
33
|
-
code: (0, encode_1.generateRandomOTP)(),
|
|
34
|
-
expiresAt: new Date((0, date_fns_1.addHours)(new Date(), 1)),
|
|
35
|
-
userId: userId,
|
|
36
|
-
})
|
|
37
|
-
.returning();
|
|
38
|
-
return session;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Validates the password reset session token and retrieves user data.
|
|
42
|
-
* The user data is augmented by registered modules (e.g. 2FA).
|
|
43
|
-
*/
|
|
44
|
-
async function validatePasswordResetSessionToken(token) {
|
|
45
|
-
const sessionId = (0, encoding_1.encodeHexLowerCase)((0, sha2_1.sha256)(new TextEncoder().encode(token)));
|
|
46
|
-
const [row] = await inject_1.db
|
|
47
|
-
.select({
|
|
48
|
-
session: schema_1.passwordResetSessionTable,
|
|
49
|
-
user: schema_1.userTable,
|
|
50
|
-
})
|
|
51
|
-
.from(schema_1.passwordResetSessionTable)
|
|
52
|
-
.innerJoin(schema_1.userTable, (0, drizzle_orm_1.eq)(schema_1.passwordResetSessionTable.userId, schema_1.userTable.id))
|
|
53
|
-
.where((0, drizzle_orm_1.eq)(schema_1.passwordResetSessionTable.id, sessionId));
|
|
54
|
-
if (!row || !row.user) {
|
|
55
|
-
return { session: null, user: null };
|
|
56
|
-
}
|
|
57
|
-
const { session: baseSession, user: baseUser } = row;
|
|
58
|
-
// Check for expiration
|
|
59
|
-
if (new Date() > baseSession.expiresAt) {
|
|
60
|
-
await inject_1.db
|
|
61
|
-
.delete(schema_1.passwordResetSessionTable)
|
|
62
|
-
.where((0, drizzle_orm_1.eq)(schema_1.passwordResetSessionTable.id, baseSession.id));
|
|
63
|
-
return { session: null, user: null };
|
|
64
|
-
}
|
|
65
|
-
// STRICTLY remove non-serializable and sensitive fields
|
|
66
|
-
const { password, recovery_code, ...safeUser } = baseUser;
|
|
67
|
-
// AUGMENT (EXTENSIBILITY POINTS)
|
|
68
|
-
const user = await (0, logic_1.performFullUserAugmentation)(safeUser);
|
|
69
|
-
const session = await (0, augment_1.augmentPasswordResetSession)(baseSession);
|
|
70
|
-
return { session, user };
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Marks the password reset session as email verified.
|
|
74
|
-
*/
|
|
75
|
-
async function setPasswordResetSessionAsEmailVerified(sessionId) {
|
|
76
|
-
await inject_1.db
|
|
77
|
-
.update(schema_1.passwordResetSessionTable)
|
|
78
|
-
.set({
|
|
79
|
-
emailVerified: true,
|
|
80
|
-
})
|
|
81
|
-
.where((0, drizzle_orm_1.eq)(schema_1.passwordResetSessionTable.id, sessionId));
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Invalidates all password reset sessions for a user.
|
|
85
|
-
*/
|
|
86
|
-
async function invalidateUserPasswordResetSessions(userId) {
|
|
87
|
-
await inject_1.db
|
|
88
|
-
.delete(schema_1.passwordResetSessionTable)
|
|
89
|
-
.where((0, drizzle_orm_1.eq)(schema_1.passwordResetSessionTable.userId, userId));
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Validates the current password reset session from cookies.
|
|
93
|
-
*/
|
|
94
|
-
async function getCurrentPasswordResetSession() {
|
|
95
|
-
var _a, _b;
|
|
96
|
-
const cookieStore = await (0, headers_1.cookies)();
|
|
97
|
-
const token = (_b = (_a = cookieStore.get("password_reset_session")) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : null;
|
|
98
|
-
if (token === null) {
|
|
99
|
-
return { session: null, user: null };
|
|
100
|
-
}
|
|
101
|
-
const result = await validatePasswordResetSessionToken(token);
|
|
102
|
-
if (result.session === null) {
|
|
103
|
-
await deletePasswordResetSessionTokenCookie();
|
|
104
|
-
}
|
|
105
|
-
return result;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Sets the password reset session token cookie.
|
|
109
|
-
*/
|
|
110
|
-
async function setPasswordResetSessionTokenCookie(token, expiresAt) {
|
|
111
|
-
const cookieStore = await (0, headers_1.cookies)();
|
|
112
|
-
cookieStore.set("password_reset_session", token, {
|
|
113
|
-
expires: expiresAt,
|
|
114
|
-
sameSite: "lax",
|
|
115
|
-
httpOnly: true,
|
|
116
|
-
path: "/",
|
|
117
|
-
secure: process.env.NODE_ENV === "production",
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Deletes the password reset session token cookie.
|
|
122
|
-
*/
|
|
123
|
-
async function deletePasswordResetSessionTokenCookie() {
|
|
124
|
-
const cookieStore = await (0, headers_1.cookies)();
|
|
125
|
-
cookieStore.delete("password_reset_session");
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Sends a password reset email with the OTP code.
|
|
129
|
-
*/
|
|
130
|
-
async function sendPasswordResetEmail(email, code) {
|
|
131
|
-
await (0, index_1.sendResetPassword)(email, code);
|
|
132
|
-
}
|
package/dist/core/auth/rbac.d.ts
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CORE RBAC LOGIC
|
|
3
|
-
* This file handles all database operations for Roles and Permissions.
|
|
4
|
-
*/
|
|
5
|
-
export declare function getRoles(): Promise<{
|
|
6
|
-
id: string;
|
|
7
|
-
name: string;
|
|
8
|
-
description: string | null;
|
|
9
|
-
}[]>;
|
|
10
|
-
export declare function getRoleById(roleId: string): Promise<{
|
|
11
|
-
id: string;
|
|
12
|
-
name: string;
|
|
13
|
-
description: string | null;
|
|
14
|
-
}>;
|
|
15
|
-
export declare function createRole(name: string, description?: string): Promise<{
|
|
16
|
-
id: string;
|
|
17
|
-
name: string;
|
|
18
|
-
description: string | null;
|
|
19
|
-
}[]>;
|
|
20
|
-
export declare function deleteRole(roleId: string): Promise<import("pg").QueryResult<never>>;
|
|
21
|
-
export declare function getPermissions(): Promise<{
|
|
22
|
-
id: string;
|
|
23
|
-
name: string;
|
|
24
|
-
description: string | null;
|
|
25
|
-
}[]>;
|
|
26
|
-
export declare function createPermission(name: string, description?: string): Promise<{
|
|
27
|
-
id: string;
|
|
28
|
-
name: string;
|
|
29
|
-
description: string | null;
|
|
30
|
-
}[]>;
|
|
31
|
-
export declare function deletePermission(permissionId: string): Promise<import("pg").QueryResult<never>>;
|
|
32
|
-
export declare function getRolePermissions(roleId: string): Promise<{
|
|
33
|
-
id: string;
|
|
34
|
-
name: string;
|
|
35
|
-
}[]>;
|
|
36
|
-
export declare function assignPermissionToRole(roleId: string, permissionId: string): Promise<import("pg").QueryResult<never>>;
|
|
37
|
-
export declare function revokePermissionFromRole(roleId: string, permissionId: string): Promise<import("pg").QueryResult<never>>;
|
|
38
|
-
export declare function assignRoleToUser(userId: string, roleId: string): Promise<import("pg").QueryResult<never>>;
|
|
39
|
-
export declare function revokeRoleFromUser(userId: string, roleId: string): Promise<import("pg").QueryResult<never>>;
|
|
40
|
-
export declare function assignPermissionToUser(userId: string, permissionId: string): Promise<import("pg").QueryResult<never>>;
|
|
41
|
-
export declare function revokePermissionFromUser(userId: string, permissionId: string): Promise<import("pg").QueryResult<never>>;
|
|
42
|
-
export declare function getUserRbacData(userId: string): Promise<{
|
|
43
|
-
roles: {
|
|
44
|
-
id: string;
|
|
45
|
-
name: string;
|
|
46
|
-
}[];
|
|
47
|
-
directPermissions: {
|
|
48
|
-
id: string;
|
|
49
|
-
name: string;
|
|
50
|
-
}[];
|
|
51
|
-
effectivePermissions: {
|
|
52
|
-
id: string;
|
|
53
|
-
name: string;
|
|
54
|
-
}[];
|
|
55
|
-
}>;
|
|
56
|
-
//# sourceMappingURL=rbac.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rbac.d.ts","sourceRoot":"","sources":["../../../src/core/auth/rbac.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AAIH,wBAAsB,QAAQ;;;;KAE7B;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM;;;;GAM/C;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;;;;KAElE;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,4CAE9C;AAID,wBAAsB,cAAc;;;;KAKnC;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;;;;KAKxE;AAED,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,4CAI1D;AAID,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM;;;KAYtD;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,4CAMrB;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,4CAUrB;AAID,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,4CAKpE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,4CAStE;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,4CAMrB;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,4CAUrB;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;YAwCP,MAAM;cAAQ,MAAM;;GAUhE"}
|
package/dist/core/auth/rbac.js
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
"use server";
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.getRoles = getRoles;
|
|
5
|
-
exports.getRoleById = getRoleById;
|
|
6
|
-
exports.createRole = createRole;
|
|
7
|
-
exports.deleteRole = deleteRole;
|
|
8
|
-
exports.getPermissions = getPermissions;
|
|
9
|
-
exports.createPermission = createPermission;
|
|
10
|
-
exports.deletePermission = deletePermission;
|
|
11
|
-
exports.getRolePermissions = getRolePermissions;
|
|
12
|
-
exports.assignPermissionToRole = assignPermissionToRole;
|
|
13
|
-
exports.revokePermissionFromRole = revokePermissionFromRole;
|
|
14
|
-
exports.assignRoleToUser = assignRoleToUser;
|
|
15
|
-
exports.revokeRoleFromUser = revokeRoleFromUser;
|
|
16
|
-
exports.assignPermissionToUser = assignPermissionToUser;
|
|
17
|
-
exports.revokePermissionFromUser = revokePermissionFromUser;
|
|
18
|
-
exports.getUserRbacData = getUserRbacData;
|
|
19
|
-
const drizzle_orm_1 = require("drizzle-orm");
|
|
20
|
-
const inject_1 = require("../../server/database/inject");
|
|
21
|
-
const schema_1 = require("../../server/database/schema");
|
|
22
|
-
const index_1 = require("../notifications/index");
|
|
23
|
-
// Ensure notification service is loaded
|
|
24
|
-
if (typeof window === "undefined") {
|
|
25
|
-
index_1.notificationService.init();
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* CORE RBAC LOGIC
|
|
29
|
-
* This file handles all database operations for Roles and Permissions.
|
|
30
|
-
*/
|
|
31
|
-
// --- Roles ---
|
|
32
|
-
async function getRoles() {
|
|
33
|
-
return await inject_1.db.select().from(schema_1.rolesTable).orderBy(schema_1.rolesTable.name);
|
|
34
|
-
}
|
|
35
|
-
async function getRoleById(roleId) {
|
|
36
|
-
const [role] = await inject_1.db
|
|
37
|
-
.select()
|
|
38
|
-
.from(schema_1.rolesTable)
|
|
39
|
-
.where((0, drizzle_orm_1.eq)(schema_1.rolesTable.id, roleId));
|
|
40
|
-
return role;
|
|
41
|
-
}
|
|
42
|
-
async function createRole(name, description) {
|
|
43
|
-
return await inject_1.db.insert(schema_1.rolesTable).values({ name, description }).returning();
|
|
44
|
-
}
|
|
45
|
-
async function deleteRole(roleId) {
|
|
46
|
-
return await inject_1.db.delete(schema_1.rolesTable).where((0, drizzle_orm_1.eq)(schema_1.rolesTable.id, roleId));
|
|
47
|
-
}
|
|
48
|
-
// --- Permissions ---
|
|
49
|
-
async function getPermissions() {
|
|
50
|
-
return await inject_1.db
|
|
51
|
-
.select()
|
|
52
|
-
.from(schema_1.permissionsTable)
|
|
53
|
-
.orderBy(schema_1.permissionsTable.name);
|
|
54
|
-
}
|
|
55
|
-
async function createPermission(name, description) {
|
|
56
|
-
return await inject_1.db
|
|
57
|
-
.insert(schema_1.permissionsTable)
|
|
58
|
-
.values({ name, description })
|
|
59
|
-
.returning();
|
|
60
|
-
}
|
|
61
|
-
async function deletePermission(permissionId) {
|
|
62
|
-
return await inject_1.db
|
|
63
|
-
.delete(schema_1.permissionsTable)
|
|
64
|
-
.where((0, drizzle_orm_1.eq)(schema_1.permissionsTable.id, permissionId));
|
|
65
|
-
}
|
|
66
|
-
// --- Mappings ---
|
|
67
|
-
async function getRolePermissions(roleId) {
|
|
68
|
-
return await inject_1.db
|
|
69
|
-
.select({
|
|
70
|
-
id: schema_1.permissionsTable.id,
|
|
71
|
-
name: schema_1.permissionsTable.name,
|
|
72
|
-
})
|
|
73
|
-
.from(schema_1.rolesToPermissionsTable)
|
|
74
|
-
.innerJoin(schema_1.permissionsTable, (0, drizzle_orm_1.eq)(schema_1.rolesToPermissionsTable.permissionId, schema_1.permissionsTable.id))
|
|
75
|
-
.where((0, drizzle_orm_1.eq)(schema_1.rolesToPermissionsTable.roleId, roleId));
|
|
76
|
-
}
|
|
77
|
-
async function assignPermissionToRole(roleId, permissionId) {
|
|
78
|
-
return await inject_1.db
|
|
79
|
-
.insert(schema_1.rolesToPermissionsTable)
|
|
80
|
-
.values({ roleId, permissionId })
|
|
81
|
-
.onConflictDoNothing();
|
|
82
|
-
}
|
|
83
|
-
async function revokePermissionFromRole(roleId, permissionId) {
|
|
84
|
-
return await inject_1.db
|
|
85
|
-
.delete(schema_1.rolesToPermissionsTable)
|
|
86
|
-
.where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(schema_1.rolesToPermissionsTable.roleId, roleId), (0, drizzle_orm_1.eq)(schema_1.rolesToPermissionsTable.permissionId, permissionId)));
|
|
87
|
-
}
|
|
88
|
-
// --- User Assignment ---
|
|
89
|
-
async function assignRoleToUser(userId, roleId) {
|
|
90
|
-
return await inject_1.db
|
|
91
|
-
.insert(schema_1.usersToRolesTable)
|
|
92
|
-
.values({ userId, roleId })
|
|
93
|
-
.onConflictDoNothing();
|
|
94
|
-
}
|
|
95
|
-
async function revokeRoleFromUser(userId, roleId) {
|
|
96
|
-
return await inject_1.db
|
|
97
|
-
.delete(schema_1.usersToRolesTable)
|
|
98
|
-
.where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(schema_1.usersToRolesTable.userId, userId), (0, drizzle_orm_1.eq)(schema_1.usersToRolesTable.roleId, roleId)));
|
|
99
|
-
}
|
|
100
|
-
async function assignPermissionToUser(userId, permissionId) {
|
|
101
|
-
return await inject_1.db
|
|
102
|
-
.insert(schema_1.usersToPermissionsTable)
|
|
103
|
-
.values({ userId, permissionId })
|
|
104
|
-
.onConflictDoNothing();
|
|
105
|
-
}
|
|
106
|
-
async function revokePermissionFromUser(userId, permissionId) {
|
|
107
|
-
return await inject_1.db
|
|
108
|
-
.delete(schema_1.usersToPermissionsTable)
|
|
109
|
-
.where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(schema_1.usersToPermissionsTable.userId, userId), (0, drizzle_orm_1.eq)(schema_1.usersToPermissionsTable.permissionId, permissionId)));
|
|
110
|
-
}
|
|
111
|
-
async function getUserRbacData(userId) {
|
|
112
|
-
const roles = await inject_1.db
|
|
113
|
-
.select({
|
|
114
|
-
id: schema_1.rolesTable.id,
|
|
115
|
-
name: schema_1.rolesTable.name,
|
|
116
|
-
})
|
|
117
|
-
.from(schema_1.usersToRolesTable)
|
|
118
|
-
.innerJoin(schema_1.rolesTable, (0, drizzle_orm_1.eq)(schema_1.usersToRolesTable.roleId, schema_1.rolesTable.id))
|
|
119
|
-
.where((0, drizzle_orm_1.eq)(schema_1.usersToRolesTable.userId, userId));
|
|
120
|
-
const directPermissions = await inject_1.db
|
|
121
|
-
.select({
|
|
122
|
-
id: schema_1.permissionsTable.id,
|
|
123
|
-
name: schema_1.permissionsTable.name,
|
|
124
|
-
})
|
|
125
|
-
.from(schema_1.usersToPermissionsTable)
|
|
126
|
-
.innerJoin(schema_1.permissionsTable, (0, drizzle_orm_1.eq)(schema_1.usersToPermissionsTable.permissionId, schema_1.permissionsTable.id))
|
|
127
|
-
.where((0, drizzle_orm_1.eq)(schema_1.usersToPermissionsTable.userId, userId));
|
|
128
|
-
// Fetch inherited permissions from roles
|
|
129
|
-
let rolePermissions = [];
|
|
130
|
-
if (roles.length > 0) {
|
|
131
|
-
const roleIds = roles.map((r) => r.id);
|
|
132
|
-
rolePermissions = await inject_1.db
|
|
133
|
-
.select({
|
|
134
|
-
id: schema_1.permissionsTable.id,
|
|
135
|
-
name: schema_1.permissionsTable.name,
|
|
136
|
-
})
|
|
137
|
-
.from(schema_1.rolesToPermissionsTable)
|
|
138
|
-
.innerJoin(schema_1.permissionsTable, (0, drizzle_orm_1.eq)(schema_1.rolesToPermissionsTable.permissionId, schema_1.permissionsTable.id))
|
|
139
|
-
.where((0, drizzle_orm_1.inArray)(schema_1.rolesToPermissionsTable.roleId, roleIds));
|
|
140
|
-
}
|
|
141
|
-
// Combine for effective permissions
|
|
142
|
-
const effectiveMap = new Map();
|
|
143
|
-
for (const p of [...directPermissions, ...rolePermissions]) {
|
|
144
|
-
effectiveMap.set(p.id, p);
|
|
145
|
-
}
|
|
146
|
-
return {
|
|
147
|
-
roles,
|
|
148
|
-
directPermissions,
|
|
149
|
-
effectivePermissions: Array.from(effectiveMap.values()),
|
|
150
|
-
};
|
|
151
|
-
}
|