@arch-cadre/core 0.0.23 → 0.0.26

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 (98) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +1 -29
  2. package/dist/_virtual/_rolldown/runtime.mjs +1 -18
  3. package/dist/core/auth/augment.cjs +1 -71
  4. package/dist/core/auth/augment.d.cts.map +1 -1
  5. package/dist/core/auth/augment.d.mts.map +1 -1
  6. package/dist/core/auth/augment.mjs +1 -65
  7. package/dist/core/auth/augment.mjs.map +1 -1
  8. package/dist/core/auth/email-verification.cjs +1 -99
  9. package/dist/core/auth/email-verification.d.cts +1 -1
  10. package/dist/core/auth/email-verification.d.mts +1 -1
  11. package/dist/core/auth/email-verification.mjs +1 -91
  12. package/dist/core/auth/email-verification.mjs.map +1 -1
  13. package/dist/core/auth/logic.cjs +1 -224
  14. package/dist/core/auth/logic.d.cts +6 -6
  15. package/dist/core/auth/logic.d.mts +6 -6
  16. package/dist/core/auth/logic.mjs +1 -212
  17. package/dist/core/auth/logic.mjs.map +1 -1
  18. package/dist/core/auth/password-reset.cjs +1 -118
  19. package/dist/core/auth/password-reset.mjs +1 -110
  20. package/dist/core/auth/password-reset.mjs.map +1 -1
  21. package/dist/core/auth/rbac.cjs +1 -118
  22. package/dist/core/auth/rbac.d.cts +2 -2
  23. package/dist/core/auth/rbac.d.mts +2 -2
  24. package/dist/core/auth/rbac.mjs +1 -103
  25. package/dist/core/auth/rbac.mjs.map +1 -1
  26. package/dist/core/auth/session.cjs +1 -154
  27. package/dist/core/auth/session.mjs +1 -142
  28. package/dist/core/auth/session.mjs.map +1 -1
  29. package/dist/core/auth/types.d.cts.map +1 -1
  30. package/dist/core/auth/types.d.mts.map +1 -1
  31. package/dist/core/auth/utils/encode.cjs +1 -27
  32. package/dist/core/auth/utils/encode.mjs +1 -25
  33. package/dist/core/auth/utils/encode.mjs.map +1 -1
  34. package/dist/core/auth/utils/encryption.cjs +1 -67
  35. package/dist/core/auth/utils/encryption.mjs +1 -63
  36. package/dist/core/auth/utils/encryption.mjs.map +1 -1
  37. package/dist/core/auth/validation.cjs +1 -39
  38. package/dist/core/auth/validation.mjs +1 -30
  39. package/dist/core/auth/validation.mjs.map +1 -1
  40. package/dist/core/bootstrap.cjs +1 -39
  41. package/dist/core/bootstrap.mjs +1 -39
  42. package/dist/core/bootstrap.mjs.map +1 -1
  43. package/dist/core/config.cjs +1 -6
  44. package/dist/core/config.mjs +1 -5
  45. package/dist/core/config.mjs.map +1 -1
  46. package/dist/core/config.server.cjs +1 -60
  47. package/dist/core/config.server.mjs +1 -56
  48. package/dist/core/config.server.mjs.map +1 -1
  49. package/dist/core/event-bus.cjs +1 -48
  50. package/dist/core/event-bus.d.cts.map +1 -1
  51. package/dist/core/event-bus.d.mts.map +1 -1
  52. package/dist/core/event-bus.mjs +1 -47
  53. package/dist/core/event-bus.mjs.map +1 -1
  54. package/dist/core/filesystem/index.cjs +1 -11
  55. package/dist/core/filesystem/index.mjs +1 -12
  56. package/dist/core/filesystem/index.mjs.map +1 -1
  57. package/dist/core/filesystem/providers/local.cjs +1 -43
  58. package/dist/core/filesystem/providers/local.mjs +1 -40
  59. package/dist/core/filesystem/providers/local.mjs.map +1 -1
  60. package/dist/core/filesystem/service.cjs +1 -43
  61. package/dist/core/filesystem/service.mjs +1 -42
  62. package/dist/core/filesystem/service.mjs.map +1 -1
  63. package/dist/core/notifications/actions.cjs +1 -36
  64. package/dist/core/notifications/actions.d.cts +1 -1
  65. package/dist/core/notifications/actions.d.mts +1 -1
  66. package/dist/core/notifications/actions.mjs +1 -32
  67. package/dist/core/notifications/actions.mjs.map +1 -1
  68. package/dist/core/notifications/index.cjs +1 -2
  69. package/dist/core/notifications/index.mjs +1 -4
  70. package/dist/core/notifications/service.cjs +1 -30
  71. package/dist/core/notifications/service.mjs +1 -30
  72. package/dist/core/notifications/service.mjs.map +1 -1
  73. package/dist/core/setup.cjs +1 -25
  74. package/dist/core/setup.mjs +1 -24
  75. package/dist/core/setup.mjs.map +1 -1
  76. package/dist/index.cjs +1 -30
  77. package/dist/index.mjs +1 -6
  78. package/dist/server/auth/email.cjs +1 -24
  79. package/dist/server/auth/email.mjs +1 -22
  80. package/dist/server/auth/email.mjs.map +1 -1
  81. package/dist/server/auth/password.cjs +1 -37
  82. package/dist/server/auth/password.mjs +1 -33
  83. package/dist/server/auth/password.mjs.map +1 -1
  84. package/dist/server/auth/user.cjs +1 -165
  85. package/dist/server/auth/user.mjs +1 -152
  86. package/dist/server/auth/user.mjs.map +1 -1
  87. package/dist/server/database/inject.cjs +1 -24
  88. package/dist/server/database/inject.mjs +1 -22
  89. package/dist/server/database/inject.mjs.map +1 -1
  90. package/dist/server/database/schema.cjs +1 -163
  91. package/dist/server/database/schema.mjs +1 -150
  92. package/dist/server/database/schema.mjs.map +1 -1
  93. package/dist/server/emails/index.cjs +1 -32
  94. package/dist/server/emails/index.mjs +1 -28
  95. package/dist/server/emails/index.mjs.map +1 -1
  96. package/dist/server.cjs +1 -145
  97. package/dist/server.mjs +1 -23
  98. package/package.json +1 -1
@@ -1,118 +1 @@
1
- "use server";
2
-
3
- const require_runtime = require('../../_virtual/_rolldown/runtime.cjs');
4
- const require_inject = require('../../server/database/inject.cjs');
5
- const require_schema = require('../../server/database/schema.cjs');
6
- const require_augment = require('./augment.cjs');
7
- const require_encode = require('./utils/encode.cjs');
8
- const require_index = require('../../server/emails/index.cjs');
9
- const require_logic = require('./logic.cjs');
10
- let drizzle_orm = require("drizzle-orm");
11
- let _oslojs_crypto_sha2 = require("@oslojs/crypto/sha2");
12
- let _oslojs_encoding = require("@oslojs/encoding");
13
- let date_fns = require("date-fns");
14
- let next_headers = require("next/headers");
15
-
16
- //#region src/core/auth/password-reset.ts
17
- /**
18
- * Creates a new password reset session.
19
- */
20
- async function createPasswordResetSession(token, userId, email) {
21
- const sessionId = (0, _oslojs_encoding.encodeHexLowerCase)((0, _oslojs_crypto_sha2.sha256)(new TextEncoder().encode(token)));
22
- const [session] = await require_inject.db.insert(require_schema.passwordResetSessionTable).values({
23
- id: sessionId,
24
- email,
25
- code: require_encode.generateRandomOTP(),
26
- expiresAt: new Date((0, date_fns.addHours)(/* @__PURE__ */ new Date(), 1)),
27
- userId
28
- }).returning();
29
- return session;
30
- }
31
- /**
32
- * Validates the password reset session token and retrieves user data.
33
- * The user data is augmented by registered modules (e.g. 2FA).
34
- */
35
- async function validatePasswordResetSessionToken(token) {
36
- const sessionId = (0, _oslojs_encoding.encodeHexLowerCase)((0, _oslojs_crypto_sha2.sha256)(new TextEncoder().encode(token)));
37
- const [row] = await require_inject.db.select({
38
- session: require_schema.passwordResetSessionTable,
39
- user: require_schema.userTable
40
- }).from(require_schema.passwordResetSessionTable).innerJoin(require_schema.userTable, (0, drizzle_orm.eq)(require_schema.passwordResetSessionTable.userId, require_schema.userTable.id)).where((0, drizzle_orm.eq)(require_schema.passwordResetSessionTable.id, sessionId));
41
- if (!row || !row.user) return {
42
- session: null,
43
- user: null
44
- };
45
- const { session: baseSession, user: baseUser } = row;
46
- if (/* @__PURE__ */ new Date() > baseSession.expiresAt) {
47
- await require_inject.db.delete(require_schema.passwordResetSessionTable).where((0, drizzle_orm.eq)(require_schema.passwordResetSessionTable.id, baseSession.id));
48
- return {
49
- session: null,
50
- user: null
51
- };
52
- }
53
- const { password, recovery_code, ...safeUser } = baseUser;
54
- const user = await require_logic.performFullUserAugmentation(safeUser);
55
- return {
56
- session: await require_augment.augmentPasswordResetSession(baseSession),
57
- user
58
- };
59
- }
60
- /**
61
- * Marks the password reset session as email verified.
62
- */
63
- async function setPasswordResetSessionAsEmailVerified(sessionId) {
64
- await require_inject.db.update(require_schema.passwordResetSessionTable).set({ emailVerified: true }).where((0, drizzle_orm.eq)(require_schema.passwordResetSessionTable.id, sessionId));
65
- }
66
- /**
67
- * Invalidates all password reset sessions for a user.
68
- */
69
- async function invalidateUserPasswordResetSessions(userId) {
70
- await require_inject.db.delete(require_schema.passwordResetSessionTable).where((0, drizzle_orm.eq)(require_schema.passwordResetSessionTable.userId, userId));
71
- }
72
- /**
73
- * Validates the current password reset session from cookies.
74
- */
75
- async function getCurrentPasswordResetSession() {
76
- const token = (await (0, next_headers.cookies)()).get("password_reset_session")?.value ?? null;
77
- if (token === null) return {
78
- session: null,
79
- user: null
80
- };
81
- const result = await validatePasswordResetSessionToken(token);
82
- if (result.session === null) await deletePasswordResetSessionTokenCookie();
83
- return result;
84
- }
85
- /**
86
- * Sets the password reset session token cookie.
87
- */
88
- async function setPasswordResetSessionTokenCookie(token, expiresAt) {
89
- (await (0, next_headers.cookies)()).set("password_reset_session", token, {
90
- expires: expiresAt,
91
- sameSite: "lax",
92
- httpOnly: true,
93
- path: "/",
94
- secure: process.env.NODE_ENV === "production"
95
- });
96
- }
97
- /**
98
- * Deletes the password reset session token cookie.
99
- */
100
- async function deletePasswordResetSessionTokenCookie() {
101
- (await (0, next_headers.cookies)()).delete("password_reset_session");
102
- }
103
- /**
104
- * Sends a password reset email with the OTP code.
105
- */
106
- async function sendPasswordResetEmail(email, code) {
107
- await /* @__PURE__ */ require_index.sendResetPassword(email, code);
108
- }
109
-
110
- //#endregion
111
- exports.createPasswordResetSession = createPasswordResetSession;
112
- exports.deletePasswordResetSessionTokenCookie = deletePasswordResetSessionTokenCookie;
113
- exports.getCurrentPasswordResetSession = getCurrentPasswordResetSession;
114
- exports.invalidateUserPasswordResetSessions = invalidateUserPasswordResetSessions;
115
- exports.sendPasswordResetEmail = sendPasswordResetEmail;
116
- exports.setPasswordResetSessionAsEmailVerified = setPasswordResetSessionAsEmailVerified;
117
- exports.setPasswordResetSessionTokenCookie = setPasswordResetSessionTokenCookie;
118
- exports.validatePasswordResetSessionToken = validatePasswordResetSessionToken;
1
+ "use server";require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../server/database/inject.cjs`),t=require(`../../server/database/schema.cjs`),n=require(`./augment.cjs`),r=require(`./utils/encode.cjs`),i=require(`../../server/emails/index.cjs`),a=require(`./logic.cjs`);let o=require(`drizzle-orm`),s=require(`@oslojs/crypto/sha2`),c=require(`@oslojs/encoding`),l=require(`date-fns`),u=require(`next/headers`);async function d(n,i,a){let o=(0,c.encodeHexLowerCase)((0,s.sha256)(new TextEncoder().encode(n))),[u]=await e.db.insert(t.passwordResetSessionTable).values({id:o,email:a,code:r.generateRandomOTP(),expiresAt:new Date((0,l.addHours)(new Date,1)),userId:i}).returning();return u}async function f(r){let i=(0,c.encodeHexLowerCase)((0,s.sha256)(new TextEncoder().encode(r))),[l]=await e.db.select({session:t.passwordResetSessionTable,user:t.userTable}).from(t.passwordResetSessionTable).innerJoin(t.userTable,(0,o.eq)(t.passwordResetSessionTable.userId,t.userTable.id)).where((0,o.eq)(t.passwordResetSessionTable.id,i));if(!l||!l.user)return{session:null,user:null};let{session:u,user:d}=l;if(new Date>u.expiresAt)return await e.db.delete(t.passwordResetSessionTable).where((0,o.eq)(t.passwordResetSessionTable.id,u.id)),{session:null,user:null};let{password:f,recovery_code:p,...m}=d,h=await a.performFullUserAugmentation(m);return{session:await n.augmentPasswordResetSession(u),user:h}}async function p(n){await e.db.update(t.passwordResetSessionTable).set({emailVerified:!0}).where((0,o.eq)(t.passwordResetSessionTable.id,n))}async function m(n){await e.db.delete(t.passwordResetSessionTable).where((0,o.eq)(t.passwordResetSessionTable.userId,n))}async function h(){let e=(await(0,u.cookies)()).get(`password_reset_session`)?.value??null;if(e===null)return{session:null,user:null};let t=await f(e);return t.session===null&&await _(),t}async function g(e,t){(await(0,u.cookies)()).set(`password_reset_session`,e,{expires:t,sameSite:`lax`,httpOnly:!0,path:`/`,secure:process.env.NODE_ENV===`production`})}async function _(){(await(0,u.cookies)()).delete(`password_reset_session`)}async function v(e,t){await i.sendResetPassword(e,t)}exports.createPasswordResetSession=d,exports.deletePasswordResetSessionTokenCookie=_,exports.getCurrentPasswordResetSession=h,exports.invalidateUserPasswordResetSessions=m,exports.sendPasswordResetEmail=v,exports.setPasswordResetSessionAsEmailVerified=p,exports.setPasswordResetSessionTokenCookie=g,exports.validatePasswordResetSessionToken=f;
@@ -1,111 +1,2 @@
1
- "use server";
2
-
3
- import { db } from "../../server/database/inject.mjs";
4
- import { passwordResetSessionTable, userTable } from "../../server/database/schema.mjs";
5
- import { augmentPasswordResetSession } from "./augment.mjs";
6
- import { generateRandomOTP } from "./utils/encode.mjs";
7
- import { sendResetPassword } from "../../server/emails/index.mjs";
8
- import { performFullUserAugmentation } from "./logic.mjs";
9
- import { eq } from "drizzle-orm";
10
- import { sha256 } from "@oslojs/crypto/sha2";
11
- import { encodeHexLowerCase } from "@oslojs/encoding";
12
- import { addHours } from "date-fns";
13
- import { cookies } from "next/headers";
14
-
15
- //#region src/core/auth/password-reset.ts
16
- /**
17
- * Creates a new password reset session.
18
- */
19
- async function createPasswordResetSession(token, userId, email) {
20
- const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token)));
21
- const [session] = await db.insert(passwordResetSessionTable).values({
22
- id: sessionId,
23
- email,
24
- code: generateRandomOTP(),
25
- expiresAt: new Date(addHours(/* @__PURE__ */ new Date(), 1)),
26
- userId
27
- }).returning();
28
- return session;
29
- }
30
- /**
31
- * Validates the password reset session token and retrieves user data.
32
- * The user data is augmented by registered modules (e.g. 2FA).
33
- */
34
- async function validatePasswordResetSessionToken(token) {
35
- const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token)));
36
- const [row] = await db.select({
37
- session: passwordResetSessionTable,
38
- user: userTable
39
- }).from(passwordResetSessionTable).innerJoin(userTable, eq(passwordResetSessionTable.userId, userTable.id)).where(eq(passwordResetSessionTable.id, sessionId));
40
- if (!row || !row.user) return {
41
- session: null,
42
- user: null
43
- };
44
- const { session: baseSession, user: baseUser } = row;
45
- if (/* @__PURE__ */ new Date() > baseSession.expiresAt) {
46
- await db.delete(passwordResetSessionTable).where(eq(passwordResetSessionTable.id, baseSession.id));
47
- return {
48
- session: null,
49
- user: null
50
- };
51
- }
52
- const { password, recovery_code, ...safeUser } = baseUser;
53
- const user = await performFullUserAugmentation(safeUser);
54
- return {
55
- session: await augmentPasswordResetSession(baseSession),
56
- user
57
- };
58
- }
59
- /**
60
- * Marks the password reset session as email verified.
61
- */
62
- async function setPasswordResetSessionAsEmailVerified(sessionId) {
63
- await db.update(passwordResetSessionTable).set({ emailVerified: true }).where(eq(passwordResetSessionTable.id, sessionId));
64
- }
65
- /**
66
- * Invalidates all password reset sessions for a user.
67
- */
68
- async function invalidateUserPasswordResetSessions(userId) {
69
- await db.delete(passwordResetSessionTable).where(eq(passwordResetSessionTable.userId, userId));
70
- }
71
- /**
72
- * Validates the current password reset session from cookies.
73
- */
74
- async function getCurrentPasswordResetSession() {
75
- const token = (await cookies()).get("password_reset_session")?.value ?? null;
76
- if (token === null) return {
77
- session: null,
78
- user: null
79
- };
80
- const result = await validatePasswordResetSessionToken(token);
81
- if (result.session === null) await deletePasswordResetSessionTokenCookie();
82
- return result;
83
- }
84
- /**
85
- * Sets the password reset session token cookie.
86
- */
87
- async function setPasswordResetSessionTokenCookie(token, expiresAt) {
88
- (await cookies()).set("password_reset_session", token, {
89
- expires: expiresAt,
90
- sameSite: "lax",
91
- httpOnly: true,
92
- path: "/",
93
- secure: process.env.NODE_ENV === "production"
94
- });
95
- }
96
- /**
97
- * Deletes the password reset session token cookie.
98
- */
99
- async function deletePasswordResetSessionTokenCookie() {
100
- (await cookies()).delete("password_reset_session");
101
- }
102
- /**
103
- * Sends a password reset email with the OTP code.
104
- */
105
- async function sendPasswordResetEmail(email, code) {
106
- await /* @__PURE__ */ sendResetPassword(email, code);
107
- }
108
-
109
- //#endregion
110
- export { createPasswordResetSession, deletePasswordResetSessionTokenCookie, getCurrentPasswordResetSession, invalidateUserPasswordResetSessions, sendPasswordResetEmail, setPasswordResetSessionAsEmailVerified, setPasswordResetSessionTokenCookie, validatePasswordResetSessionToken };
1
+ "use server";import{db as e}from"../../server/database/inject.mjs";import{passwordResetSessionTable as t,userTable as n}from"../../server/database/schema.mjs";import{augmentPasswordResetSession as r}from"./augment.mjs";import{generateRandomOTP as i}from"./utils/encode.mjs";import{sendResetPassword as a}from"../../server/emails/index.mjs";import{performFullUserAugmentation as o}from"./logic.mjs";import{eq as s}from"drizzle-orm";import{sha256 as c}from"@oslojs/crypto/sha2";import{encodeHexLowerCase as l}from"@oslojs/encoding";import{addHours as u}from"date-fns";import{cookies as d}from"next/headers";async function f(n,r,a){let o=l(c(new TextEncoder().encode(n))),[s]=await e.insert(t).values({id:o,email:a,code:i(),expiresAt:new Date(u(new Date,1)),userId:r}).returning();return s}async function p(i){let a=l(c(new TextEncoder().encode(i))),[u]=await e.select({session:t,user:n}).from(t).innerJoin(n,s(t.userId,n.id)).where(s(t.id,a));if(!u||!u.user)return{session:null,user:null};let{session:d,user:f}=u;if(new Date>d.expiresAt)return await e.delete(t).where(s(t.id,d.id)),{session:null,user:null};let{password:p,recovery_code:m,...h}=f,g=await o(h);return{session:await r(d),user:g}}async function m(n){await e.update(t).set({emailVerified:!0}).where(s(t.id,n))}async function h(n){await e.delete(t).where(s(t.userId,n))}async function g(){let e=(await d()).get(`password_reset_session`)?.value??null;if(e===null)return{session:null,user:null};let t=await p(e);return t.session===null&&await v(),t}async function _(e,t){(await d()).set(`password_reset_session`,e,{expires:t,sameSite:`lax`,httpOnly:!0,path:`/`,secure:process.env.NODE_ENV===`production`})}async function v(){(await d()).delete(`password_reset_session`)}async function y(e,t){await a(e,t)}export{f as createPasswordResetSession,v as deletePasswordResetSessionTokenCookie,g as getCurrentPasswordResetSession,h as invalidateUserPasswordResetSessions,y as sendPasswordResetEmail,m as setPasswordResetSessionAsEmailVerified,_ as setPasswordResetSessionTokenCookie,p as validatePasswordResetSessionToken};
111
2
  //# sourceMappingURL=password-reset.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"password-reset.mjs","names":[],"sources":["../../../src/core/auth/password-reset.ts"],"sourcesContent":["\"use server\";\n\nimport { sha256 } from \"@oslojs/crypto/sha2\";\nimport { encodeHexLowerCase } from \"@oslojs/encoding\";\nimport { addHours } from \"date-fns\";\nimport { eq } from \"drizzle-orm\";\nimport { cookies } from \"next/headers\";\nimport { db } from \"../../server/database/inject\";\nimport {\n passwordResetSessionTable,\n userTable,\n} from \"../../server/database/schema\";\nimport { sendResetPassword } from \"../../server/emails\";\nimport { augmentPasswordResetSession } from \"./augment\";\nimport { performFullUserAugmentation } from \"./logic\";\nimport type { PasswordResetAuthSession, PasswordResetSession } from \"./types\";\nimport { generateRandomOTP } from \"./utils/encode\";\n\n/**\n * Creates a new password reset session.\n */\nexport async function createPasswordResetSession(\n token: string,\n userId: string,\n email: string,\n): Promise<PasswordResetSession> {\n const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token)));\n\n const [session] = await db\n .insert(passwordResetSessionTable)\n .values({\n id: sessionId,\n email: email,\n code: generateRandomOTP(),\n expiresAt: new Date(addHours(new Date(), 1)),\n userId: userId,\n })\n .returning();\n\n return session;\n}\n\n/**\n * Validates the password reset session token and retrieves user data.\n * The user data is augmented by registered modules (e.g. 2FA).\n */\nexport async function validatePasswordResetSessionToken(\n token: string,\n): Promise<PasswordResetAuthSession> {\n const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token)));\n\n const [row] = await db\n .select({\n session: passwordResetSessionTable,\n user: userTable,\n })\n .from(passwordResetSessionTable)\n .innerJoin(userTable, eq(passwordResetSessionTable.userId, userTable.id))\n .where(eq(passwordResetSessionTable.id, sessionId));\n\n if (!row || !row.user) {\n return { session: null, user: null };\n }\n\n const { session: baseSession, user: baseUser } = row;\n\n // Check for expiration\n if (new Date() > baseSession.expiresAt) {\n await db\n .delete(passwordResetSessionTable)\n .where(eq(passwordResetSessionTable.id, baseSession.id));\n return { session: null, user: null };\n }\n\n // STRICTLY remove non-serializable and sensitive fields\n const { password, recovery_code, ...safeUser } = baseUser;\n\n // AUGMENT (EXTENSIBILITY POINTS)\n const user = await performFullUserAugmentation(safeUser as any);\n const session = await augmentPasswordResetSession(\n baseSession as PasswordResetSession,\n );\n\n return { session, user };\n}\n\n/**\n * Marks the password reset session as email verified.\n */\nexport async function setPasswordResetSessionAsEmailVerified(\n sessionId: string,\n): Promise<void> {\n await db\n .update(passwordResetSessionTable)\n .set({\n emailVerified: true,\n })\n .where(eq(passwordResetSessionTable.id, sessionId));\n}\n\n/**\n * Invalidates all password reset sessions for a user.\n */\nexport async function invalidateUserPasswordResetSessions(\n userId: string,\n): Promise<void> {\n await db\n .delete(passwordResetSessionTable)\n .where(eq(passwordResetSessionTable.userId, userId));\n}\n\n/**\n * Validates the current password reset session from cookies.\n */\nexport async function getCurrentPasswordResetSession(): Promise<PasswordResetAuthSession> {\n const cookieStore = await cookies();\n const token = cookieStore.get(\"password_reset_session\")?.value ?? null;\n\n if (token === null) {\n return { session: null, user: null };\n }\n\n const result = await validatePasswordResetSessionToken(token);\n\n if (result.session === null) {\n await deletePasswordResetSessionTokenCookie();\n }\n\n return result;\n}\n\n/**\n * Sets the password reset session token cookie.\n */\nexport async function setPasswordResetSessionTokenCookie(\n token: string,\n expiresAt: Date,\n): Promise<void> {\n const cookieStore = await cookies();\n\n cookieStore.set(\"password_reset_session\", token, {\n expires: expiresAt,\n sameSite: \"lax\",\n httpOnly: true,\n path: \"/\",\n secure: process.env.NODE_ENV === \"production\",\n });\n}\n\n/**\n * Deletes the password reset session token cookie.\n */\nexport async function deletePasswordResetSessionTokenCookie(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.delete(\"password_reset_session\");\n}\n\n/**\n * Sends a password reset email with the OTP code.\n */\nexport async function sendPasswordResetEmail(\n email: string,\n code: string,\n): Promise<void> {\n await sendResetPassword(email, code);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqBA,eAAsB,2BACpB,OACA,QACA,OAC+B;CAC/B,MAAM,YAAY,mBAAmB,OAAO,IAAI,aAAa,CAAC,OAAO,MAAM,CAAC,CAAC;CAE7E,MAAM,CAAC,WAAW,MAAM,GACrB,OAAO,0BAA0B,CACjC,OAAO;EACN,IAAI;EACG;EACP,MAAM,mBAAmB;EACzB,WAAW,IAAI,KAAK,yBAAS,IAAI,MAAM,EAAE,EAAE,CAAC;EACpC;EACT,CAAC,CACD,WAAW;AAEd,QAAO;;;;;;AAOT,eAAsB,kCACpB,OACmC;CACnC,MAAM,YAAY,mBAAmB,OAAO,IAAI,aAAa,CAAC,OAAO,MAAM,CAAC,CAAC;CAE7E,MAAM,CAAC,OAAO,MAAM,GACjB,OAAO;EACN,SAAS;EACT,MAAM;EACP,CAAC,CACD,KAAK,0BAA0B,CAC/B,UAAU,WAAW,GAAG,0BAA0B,QAAQ,UAAU,GAAG,CAAC,CACxE,MAAM,GAAG,0BAA0B,IAAI,UAAU,CAAC;AAErD,KAAI,CAAC,OAAO,CAAC,IAAI,KACf,QAAO;EAAE,SAAS;EAAM,MAAM;EAAM;CAGtC,MAAM,EAAE,SAAS,aAAa,MAAM,aAAa;AAGjD,qBAAI,IAAI,MAAM,GAAG,YAAY,WAAW;AACtC,QAAM,GACH,OAAO,0BAA0B,CACjC,MAAM,GAAG,0BAA0B,IAAI,YAAY,GAAG,CAAC;AAC1D,SAAO;GAAE,SAAS;GAAM,MAAM;GAAM;;CAItC,MAAM,EAAE,UAAU,eAAe,GAAG,aAAa;CAGjD,MAAM,OAAO,MAAM,4BAA4B,SAAgB;AAK/D,QAAO;EAAE,SAJO,MAAM,4BACpB,YACD;EAEiB;EAAM;;;;;AAM1B,eAAsB,uCACpB,WACe;AACf,OAAM,GACH,OAAO,0BAA0B,CACjC,IAAI,EACH,eAAe,MAChB,CAAC,CACD,MAAM,GAAG,0BAA0B,IAAI,UAAU,CAAC;;;;;AAMvD,eAAsB,oCACpB,QACe;AACf,OAAM,GACH,OAAO,0BAA0B,CACjC,MAAM,GAAG,0BAA0B,QAAQ,OAAO,CAAC;;;;;AAMxD,eAAsB,iCAAoE;CAExF,MAAM,SADc,MAAM,SAAS,EACT,IAAI,yBAAyB,EAAE,SAAS;AAElE,KAAI,UAAU,KACZ,QAAO;EAAE,SAAS;EAAM,MAAM;EAAM;CAGtC,MAAM,SAAS,MAAM,kCAAkC,MAAM;AAE7D,KAAI,OAAO,YAAY,KACrB,OAAM,uCAAuC;AAG/C,QAAO;;;;;AAMT,eAAsB,mCACpB,OACA,WACe;AAGf,EAFoB,MAAM,SAAS,EAEvB,IAAI,0BAA0B,OAAO;EAC/C,SAAS;EACT,UAAU;EACV,UAAU;EACV,MAAM;EACN,QAAQ,QAAQ,IAAI,aAAa;EAClC,CAAC;;;;;AAMJ,eAAsB,wCAAuD;AAE3E,EADoB,MAAM,SAAS,EACvB,OAAO,yBAAyB;;;;;AAM9C,eAAsB,uBACpB,OACA,MACe;AACf,OAAM,kCAAkB,OAAO,KAAK"}
1
+ {"version":3,"file":"password-reset.mjs","names":[],"sources":["../../../src/core/auth/password-reset.ts"],"sourcesContent":["\"use server\";\n\nimport { sha256 } from \"@oslojs/crypto/sha2\";\nimport { encodeHexLowerCase } from \"@oslojs/encoding\";\nimport { addHours } from \"date-fns\";\nimport { eq } from \"drizzle-orm\";\nimport { cookies } from \"next/headers\";\nimport { db } from \"../../server/database/inject.js\";\nimport {\n passwordResetSessionTable,\n userTable,\n} from \"../../server/database/schema.js\";\nimport { sendResetPassword } from \"../../server/emails/index.js\";\nimport { augmentPasswordResetSession } from \"./augment.js\";\nimport { performFullUserAugmentation } from \"./logic.js\";\nimport type { PasswordResetAuthSession, PasswordResetSession } from \"./types.js\";\nimport { generateRandomOTP } from \"./utils/encode.js\";\n\n/**\n * Creates a new password reset session.\n */\nexport async function createPasswordResetSession(\n token: string,\n userId: string,\n email: string,\n): Promise<PasswordResetSession> {\n const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token)));\n\n const [session] = await db\n .insert(passwordResetSessionTable)\n .values({\n id: sessionId,\n email: email,\n code: generateRandomOTP(),\n expiresAt: new Date(addHours(new Date(), 1)),\n userId: userId,\n })\n .returning();\n\n return session;\n}\n\n/**\n * Validates the password reset session token and retrieves user data.\n * The user data is augmented by registered modules (e.g. 2FA).\n */\nexport async function validatePasswordResetSessionToken(\n token: string,\n): Promise<PasswordResetAuthSession> {\n const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token)));\n\n const [row] = await db\n .select({\n session: passwordResetSessionTable,\n user: userTable,\n })\n .from(passwordResetSessionTable)\n .innerJoin(userTable, eq(passwordResetSessionTable.userId, userTable.id))\n .where(eq(passwordResetSessionTable.id, sessionId));\n\n if (!row || !row.user) {\n return { session: null, user: null };\n }\n\n const { session: baseSession, user: baseUser } = row;\n\n // Check for expiration\n if (new Date() > baseSession.expiresAt) {\n await db\n .delete(passwordResetSessionTable)\n .where(eq(passwordResetSessionTable.id, baseSession.id));\n return { session: null, user: null };\n }\n\n // STRICTLY remove non-serializable and sensitive fields\n const { password, recovery_code, ...safeUser } = baseUser;\n\n // AUGMENT (EXTENSIBILITY POINTS)\n const user = await performFullUserAugmentation(safeUser as any);\n const session = await augmentPasswordResetSession(\n baseSession as PasswordResetSession,\n );\n\n return { session, user };\n}\n\n/**\n * Marks the password reset session as email verified.\n */\nexport async function setPasswordResetSessionAsEmailVerified(\n sessionId: string,\n): Promise<void> {\n await db\n .update(passwordResetSessionTable)\n .set({\n emailVerified: true,\n })\n .where(eq(passwordResetSessionTable.id, sessionId));\n}\n\n/**\n * Invalidates all password reset sessions for a user.\n */\nexport async function invalidateUserPasswordResetSessions(\n userId: string,\n): Promise<void> {\n await db\n .delete(passwordResetSessionTable)\n .where(eq(passwordResetSessionTable.userId, userId));\n}\n\n/**\n * Validates the current password reset session from cookies.\n */\nexport async function getCurrentPasswordResetSession(): Promise<PasswordResetAuthSession> {\n const cookieStore = await cookies();\n const token = cookieStore.get(\"password_reset_session\")?.value ?? null;\n\n if (token === null) {\n return { session: null, user: null };\n }\n\n const result = await validatePasswordResetSessionToken(token);\n\n if (result.session === null) {\n await deletePasswordResetSessionTokenCookie();\n }\n\n return result;\n}\n\n/**\n * Sets the password reset session token cookie.\n */\nexport async function setPasswordResetSessionTokenCookie(\n token: string,\n expiresAt: Date,\n): Promise<void> {\n const cookieStore = await cookies();\n\n cookieStore.set(\"password_reset_session\", token, {\n expires: expiresAt,\n sameSite: \"lax\",\n httpOnly: true,\n path: \"/\",\n secure: process.env.NODE_ENV === \"production\",\n });\n}\n\n/**\n * Deletes the password reset session token cookie.\n */\nexport async function deletePasswordResetSessionTokenCookie(): Promise<void> {\n const cookieStore = await cookies();\n cookieStore.delete(\"password_reset_session\");\n}\n\n/**\n * Sends a password reset email with the OTP code.\n */\nexport async function sendPasswordResetEmail(\n email: string,\n code: string,\n): Promise<void> {\n await sendResetPassword(email, code);\n}\n"],"mappings":"6lBAqBA,eAAsB,EACpB,EACA,EACA,EAC+B,CAC/B,IAAM,EAAY,EAAmB,EAAO,IAAI,aAAa,CAAC,OAAO,EAAM,CAAC,CAAC,CAEvE,CAAC,GAAW,MAAM,EACrB,OAAO,EAA0B,CACjC,OAAO,CACN,GAAI,EACG,QACP,KAAM,GAAmB,CACzB,UAAW,IAAI,KAAK,EAAS,IAAI,KAAQ,EAAE,CAAC,CACpC,SACT,CAAC,CACD,WAAW,CAEd,OAAO,EAOT,eAAsB,EACpB,EACmC,CACnC,IAAM,EAAY,EAAmB,EAAO,IAAI,aAAa,CAAC,OAAO,EAAM,CAAC,CAAC,CAEvE,CAAC,GAAO,MAAM,EACjB,OAAO,CACN,QAAS,EACT,KAAM,EACP,CAAC,CACD,KAAK,EAA0B,CAC/B,UAAU,EAAW,EAAG,EAA0B,OAAQ,EAAU,GAAG,CAAC,CACxE,MAAM,EAAG,EAA0B,GAAI,EAAU,CAAC,CAErD,GAAI,CAAC,GAAO,CAAC,EAAI,KACf,MAAO,CAAE,QAAS,KAAM,KAAM,KAAM,CAGtC,GAAM,CAAE,QAAS,EAAa,KAAM,GAAa,EAGjD,GAAI,IAAI,KAAS,EAAY,UAI3B,OAHA,MAAM,EACH,OAAO,EAA0B,CACjC,MAAM,EAAG,EAA0B,GAAI,EAAY,GAAG,CAAC,CACnD,CAAE,QAAS,KAAM,KAAM,KAAM,CAItC,GAAM,CAAE,WAAU,gBAAe,GAAG,GAAa,EAG3C,EAAO,MAAM,EAA4B,EAAgB,CAK/D,MAAO,CAAE,QAJO,MAAM,EACpB,EACD,CAEiB,OAAM,CAM1B,eAAsB,EACpB,EACe,CACf,MAAM,EACH,OAAO,EAA0B,CACjC,IAAI,CACH,cAAe,GAChB,CAAC,CACD,MAAM,EAAG,EAA0B,GAAI,EAAU,CAAC,CAMvD,eAAsB,EACpB,EACe,CACf,MAAM,EACH,OAAO,EAA0B,CACjC,MAAM,EAAG,EAA0B,OAAQ,EAAO,CAAC,CAMxD,eAAsB,GAAoE,CAExF,IAAM,GADc,MAAM,GAAS,EACT,IAAI,yBAAyB,EAAE,OAAS,KAElE,GAAI,IAAU,KACZ,MAAO,CAAE,QAAS,KAAM,KAAM,KAAM,CAGtC,IAAM,EAAS,MAAM,EAAkC,EAAM,CAM7D,OAJI,EAAO,UAAY,MACrB,MAAM,GAAuC,CAGxC,EAMT,eAAsB,EACpB,EACA,EACe,EACK,MAAM,GAAS,EAEvB,IAAI,yBAA0B,EAAO,CAC/C,QAAS,EACT,SAAU,MACV,SAAU,GACV,KAAM,IACN,OAAQ,QAAQ,IAAI,WAAa,aAClC,CAAC,CAMJ,eAAsB,GAAuD,EACvD,MAAM,GAAS,EACvB,OAAO,yBAAyB,CAM9C,eAAsB,EACpB,EACA,EACe,CACf,MAAM,EAAkB,EAAO,EAAK"}
@@ -1,118 +1 @@
1
- "use server";
2
-
3
- const require_runtime = require('../../_virtual/_rolldown/runtime.cjs');
4
- const require_inject = require('../../server/database/inject.cjs');
5
- const require_schema = require('../../server/database/schema.cjs');
6
- const require_service = require('../notifications/service.cjs');
7
- require('../notifications/index.cjs');
8
- let drizzle_orm = require("drizzle-orm");
9
-
10
- //#region src/core/auth/rbac.ts
11
- if (typeof window === "undefined") require_service.notificationService.init();
12
- /**
13
- * CORE RBAC LOGIC
14
- * This file handles all database operations for Roles and Permissions.
15
- */
16
- async function getRoles() {
17
- return await require_inject.db.select().from(require_schema.rolesTable).orderBy(require_schema.rolesTable.name);
18
- }
19
- async function getRoleById(roleId) {
20
- const [role] = await require_inject.db.select().from(require_schema.rolesTable).where((0, drizzle_orm.eq)(require_schema.rolesTable.id, roleId));
21
- return role;
22
- }
23
- async function createRole(name, description) {
24
- return await require_inject.db.insert(require_schema.rolesTable).values({
25
- name,
26
- description
27
- }).returning();
28
- }
29
- async function deleteRole(roleId) {
30
- return await require_inject.db.delete(require_schema.rolesTable).where((0, drizzle_orm.eq)(require_schema.rolesTable.id, roleId));
31
- }
32
- async function getPermissions() {
33
- return await require_inject.db.select().from(require_schema.permissionsTable).orderBy(require_schema.permissionsTable.name);
34
- }
35
- async function createPermission(name, description) {
36
- return await require_inject.db.insert(require_schema.permissionsTable).values({
37
- name,
38
- description
39
- }).returning();
40
- }
41
- async function deletePermission(permissionId) {
42
- return await require_inject.db.delete(require_schema.permissionsTable).where((0, drizzle_orm.eq)(require_schema.permissionsTable.id, permissionId));
43
- }
44
- async function getRolePermissions(roleId) {
45
- return await require_inject.db.select({
46
- id: require_schema.permissionsTable.id,
47
- name: require_schema.permissionsTable.name
48
- }).from(require_schema.rolesToPermissionsTable).innerJoin(require_schema.permissionsTable, (0, drizzle_orm.eq)(require_schema.rolesToPermissionsTable.permissionId, require_schema.permissionsTable.id)).where((0, drizzle_orm.eq)(require_schema.rolesToPermissionsTable.roleId, roleId));
49
- }
50
- async function assignPermissionToRole(roleId, permissionId) {
51
- return await require_inject.db.insert(require_schema.rolesToPermissionsTable).values({
52
- roleId,
53
- permissionId
54
- }).onConflictDoNothing();
55
- }
56
- async function revokePermissionFromRole(roleId, permissionId) {
57
- return await require_inject.db.delete(require_schema.rolesToPermissionsTable).where((0, drizzle_orm.and)((0, drizzle_orm.eq)(require_schema.rolesToPermissionsTable.roleId, roleId), (0, drizzle_orm.eq)(require_schema.rolesToPermissionsTable.permissionId, permissionId)));
58
- }
59
- async function assignRoleToUser(userId, roleId) {
60
- return await require_inject.db.insert(require_schema.usersToRolesTable).values({
61
- userId,
62
- roleId
63
- }).onConflictDoNothing();
64
- }
65
- async function revokeRoleFromUser(userId, roleId) {
66
- return await require_inject.db.delete(require_schema.usersToRolesTable).where((0, drizzle_orm.and)((0, drizzle_orm.eq)(require_schema.usersToRolesTable.userId, userId), (0, drizzle_orm.eq)(require_schema.usersToRolesTable.roleId, roleId)));
67
- }
68
- async function assignPermissionToUser(userId, permissionId) {
69
- return await require_inject.db.insert(require_schema.usersToPermissionsTable).values({
70
- userId,
71
- permissionId
72
- }).onConflictDoNothing();
73
- }
74
- async function revokePermissionFromUser(userId, permissionId) {
75
- return await require_inject.db.delete(require_schema.usersToPermissionsTable).where((0, drizzle_orm.and)((0, drizzle_orm.eq)(require_schema.usersToPermissionsTable.userId, userId), (0, drizzle_orm.eq)(require_schema.usersToPermissionsTable.permissionId, permissionId)));
76
- }
77
- async function getUserRbacData(userId) {
78
- const roles = await require_inject.db.select({
79
- id: require_schema.rolesTable.id,
80
- name: require_schema.rolesTable.name
81
- }).from(require_schema.usersToRolesTable).innerJoin(require_schema.rolesTable, (0, drizzle_orm.eq)(require_schema.usersToRolesTable.roleId, require_schema.rolesTable.id)).where((0, drizzle_orm.eq)(require_schema.usersToRolesTable.userId, userId));
82
- const directPermissions = await require_inject.db.select({
83
- id: require_schema.permissionsTable.id,
84
- name: require_schema.permissionsTable.name
85
- }).from(require_schema.usersToPermissionsTable).innerJoin(require_schema.permissionsTable, (0, drizzle_orm.eq)(require_schema.usersToPermissionsTable.permissionId, require_schema.permissionsTable.id)).where((0, drizzle_orm.eq)(require_schema.usersToPermissionsTable.userId, userId));
86
- let rolePermissions = [];
87
- if (roles.length > 0) {
88
- const roleIds = roles.map((r) => r.id);
89
- rolePermissions = await require_inject.db.select({
90
- id: require_schema.permissionsTable.id,
91
- name: require_schema.permissionsTable.name
92
- }).from(require_schema.rolesToPermissionsTable).innerJoin(require_schema.permissionsTable, (0, drizzle_orm.eq)(require_schema.rolesToPermissionsTable.permissionId, require_schema.permissionsTable.id)).where((0, drizzle_orm.inArray)(require_schema.rolesToPermissionsTable.roleId, roleIds));
93
- }
94
- const effectiveMap = /* @__PURE__ */ new Map();
95
- for (const p of [...directPermissions, ...rolePermissions]) effectiveMap.set(p.id, p);
96
- return {
97
- roles,
98
- directPermissions,
99
- effectivePermissions: Array.from(effectiveMap.values())
100
- };
101
- }
102
-
103
- //#endregion
104
- exports.assignPermissionToRole = assignPermissionToRole;
105
- exports.assignPermissionToUser = assignPermissionToUser;
106
- exports.assignRoleToUser = assignRoleToUser;
107
- exports.createPermission = createPermission;
108
- exports.createRole = createRole;
109
- exports.deletePermission = deletePermission;
110
- exports.deleteRole = deleteRole;
111
- exports.getPermissions = getPermissions;
112
- exports.getRoleById = getRoleById;
113
- exports.getRolePermissions = getRolePermissions;
114
- exports.getRoles = getRoles;
115
- exports.getUserRbacData = getUserRbacData;
116
- exports.revokePermissionFromRole = revokePermissionFromRole;
117
- exports.revokePermissionFromUser = revokePermissionFromUser;
118
- exports.revokeRoleFromUser = revokeRoleFromUser;
1
+ "use server";require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../server/database/inject.cjs`),t=require(`../../server/database/schema.cjs`),n=require(`../notifications/service.cjs`);require(`../notifications/index.cjs`);let r=require(`drizzle-orm`);typeof window>`u`&&n.notificationService.init();async function i(){return await e.db.select().from(t.rolesTable).orderBy(t.rolesTable.name)}async function a(n){let[i]=await e.db.select().from(t.rolesTable).where((0,r.eq)(t.rolesTable.id,n));return i}async function o(n,r){return await e.db.insert(t.rolesTable).values({name:n,description:r}).returning()}async function s(n){return await e.db.delete(t.rolesTable).where((0,r.eq)(t.rolesTable.id,n))}async function c(){return await e.db.select().from(t.permissionsTable).orderBy(t.permissionsTable.name)}async function l(n,r){return await e.db.insert(t.permissionsTable).values({name:n,description:r}).returning()}async function u(n){return await e.db.delete(t.permissionsTable).where((0,r.eq)(t.permissionsTable.id,n))}async function d(n){return await e.db.select({id:t.permissionsTable.id,name:t.permissionsTable.name}).from(t.rolesToPermissionsTable).innerJoin(t.permissionsTable,(0,r.eq)(t.rolesToPermissionsTable.permissionId,t.permissionsTable.id)).where((0,r.eq)(t.rolesToPermissionsTable.roleId,n))}async function f(n,r){return await e.db.insert(t.rolesToPermissionsTable).values({roleId:n,permissionId:r}).onConflictDoNothing()}async function p(n,i){return await e.db.delete(t.rolesToPermissionsTable).where((0,r.and)((0,r.eq)(t.rolesToPermissionsTable.roleId,n),(0,r.eq)(t.rolesToPermissionsTable.permissionId,i)))}async function m(n,r){return await e.db.insert(t.usersToRolesTable).values({userId:n,roleId:r}).onConflictDoNothing()}async function h(n,i){return await e.db.delete(t.usersToRolesTable).where((0,r.and)((0,r.eq)(t.usersToRolesTable.userId,n),(0,r.eq)(t.usersToRolesTable.roleId,i)))}async function g(n,r){return await e.db.insert(t.usersToPermissionsTable).values({userId:n,permissionId:r}).onConflictDoNothing()}async function _(n,i){return await e.db.delete(t.usersToPermissionsTable).where((0,r.and)((0,r.eq)(t.usersToPermissionsTable.userId,n),(0,r.eq)(t.usersToPermissionsTable.permissionId,i)))}async function v(n){let i=await e.db.select({id:t.rolesTable.id,name:t.rolesTable.name}).from(t.usersToRolesTable).innerJoin(t.rolesTable,(0,r.eq)(t.usersToRolesTable.roleId,t.rolesTable.id)).where((0,r.eq)(t.usersToRolesTable.userId,n)),a=await e.db.select({id:t.permissionsTable.id,name:t.permissionsTable.name}).from(t.usersToPermissionsTable).innerJoin(t.permissionsTable,(0,r.eq)(t.usersToPermissionsTable.permissionId,t.permissionsTable.id)).where((0,r.eq)(t.usersToPermissionsTable.userId,n)),o=[];if(i.length>0){let n=i.map(e=>e.id);o=await e.db.select({id:t.permissionsTable.id,name:t.permissionsTable.name}).from(t.rolesToPermissionsTable).innerJoin(t.permissionsTable,(0,r.eq)(t.rolesToPermissionsTable.permissionId,t.permissionsTable.id)).where((0,r.inArray)(t.rolesToPermissionsTable.roleId,n))}let s=new Map;for(let e of[...a,...o])s.set(e.id,e);return{roles:i,directPermissions:a,effectivePermissions:Array.from(s.values())}}exports.assignPermissionToRole=f,exports.assignPermissionToUser=g,exports.assignRoleToUser=m,exports.createPermission=l,exports.createRole=o,exports.deletePermission=u,exports.deleteRole=s,exports.getPermissions=c,exports.getRoleById=a,exports.getRolePermissions=d,exports.getRoles=i,exports.getUserRbacData=v,exports.revokePermissionFromRole=p,exports.revokePermissionFromUser=_,exports.revokeRoleFromUser=h;
@@ -16,8 +16,8 @@ declare function getRoleById(roleId: string): Promise<{
16
16
  description: string | null;
17
17
  }>;
18
18
  declare function createRole(name: string, description?: string): Promise<{
19
- id: string;
20
19
  name: string;
20
+ id: string;
21
21
  description: string | null;
22
22
  }[]>;
23
23
  declare function deleteRole(roleId: string): Promise<pg.QueryResult<never>>;
@@ -27,8 +27,8 @@ declare function getPermissions(): Promise<{
27
27
  description: string | null;
28
28
  }[]>;
29
29
  declare function createPermission(name: string, description?: string): Promise<{
30
- id: string;
31
30
  name: string;
31
+ id: string;
32
32
  description: string | null;
33
33
  }[]>;
34
34
  declare function deletePermission(permissionId: string): Promise<pg.QueryResult<never>>;
@@ -16,8 +16,8 @@ declare function getRoleById(roleId: string): Promise<{
16
16
  description: string | null;
17
17
  }>;
18
18
  declare function createRole(name: string, description?: string): Promise<{
19
- id: string;
20
19
  name: string;
20
+ id: string;
21
21
  description: string | null;
22
22
  }[]>;
23
23
  declare function deleteRole(roleId: string): Promise<pg.QueryResult<never>>;
@@ -27,8 +27,8 @@ declare function getPermissions(): Promise<{
27
27
  description: string | null;
28
28
  }[]>;
29
29
  declare function createPermission(name: string, description?: string): Promise<{
30
- id: string;
31
30
  name: string;
31
+ id: string;
32
32
  description: string | null;
33
33
  }[]>;
34
34
  declare function deletePermission(permissionId: string): Promise<pg.QueryResult<never>>;
@@ -1,104 +1,2 @@
1
- "use server";
2
-
3
- import { db } from "../../server/database/inject.mjs";
4
- import { permissionsTable, rolesTable, rolesToPermissionsTable, usersToPermissionsTable, usersToRolesTable } from "../../server/database/schema.mjs";
5
- import { notificationService } from "../notifications/service.mjs";
6
- import "../notifications/index.mjs";
7
- import { and, eq, inArray } from "drizzle-orm";
8
-
9
- //#region src/core/auth/rbac.ts
10
- if (typeof window === "undefined") notificationService.init();
11
- /**
12
- * CORE RBAC LOGIC
13
- * This file handles all database operations for Roles and Permissions.
14
- */
15
- async function getRoles() {
16
- return await db.select().from(rolesTable).orderBy(rolesTable.name);
17
- }
18
- async function getRoleById(roleId) {
19
- const [role] = await db.select().from(rolesTable).where(eq(rolesTable.id, roleId));
20
- return role;
21
- }
22
- async function createRole(name, description) {
23
- return await db.insert(rolesTable).values({
24
- name,
25
- description
26
- }).returning();
27
- }
28
- async function deleteRole(roleId) {
29
- return await db.delete(rolesTable).where(eq(rolesTable.id, roleId));
30
- }
31
- async function getPermissions() {
32
- return await db.select().from(permissionsTable).orderBy(permissionsTable.name);
33
- }
34
- async function createPermission(name, description) {
35
- return await db.insert(permissionsTable).values({
36
- name,
37
- description
38
- }).returning();
39
- }
40
- async function deletePermission(permissionId) {
41
- return await db.delete(permissionsTable).where(eq(permissionsTable.id, permissionId));
42
- }
43
- async function getRolePermissions(roleId) {
44
- return await db.select({
45
- id: permissionsTable.id,
46
- name: permissionsTable.name
47
- }).from(rolesToPermissionsTable).innerJoin(permissionsTable, eq(rolesToPermissionsTable.permissionId, permissionsTable.id)).where(eq(rolesToPermissionsTable.roleId, roleId));
48
- }
49
- async function assignPermissionToRole(roleId, permissionId) {
50
- return await db.insert(rolesToPermissionsTable).values({
51
- roleId,
52
- permissionId
53
- }).onConflictDoNothing();
54
- }
55
- async function revokePermissionFromRole(roleId, permissionId) {
56
- return await db.delete(rolesToPermissionsTable).where(and(eq(rolesToPermissionsTable.roleId, roleId), eq(rolesToPermissionsTable.permissionId, permissionId)));
57
- }
58
- async function assignRoleToUser(userId, roleId) {
59
- return await db.insert(usersToRolesTable).values({
60
- userId,
61
- roleId
62
- }).onConflictDoNothing();
63
- }
64
- async function revokeRoleFromUser(userId, roleId) {
65
- return await db.delete(usersToRolesTable).where(and(eq(usersToRolesTable.userId, userId), eq(usersToRolesTable.roleId, roleId)));
66
- }
67
- async function assignPermissionToUser(userId, permissionId) {
68
- return await db.insert(usersToPermissionsTable).values({
69
- userId,
70
- permissionId
71
- }).onConflictDoNothing();
72
- }
73
- async function revokePermissionFromUser(userId, permissionId) {
74
- return await db.delete(usersToPermissionsTable).where(and(eq(usersToPermissionsTable.userId, userId), eq(usersToPermissionsTable.permissionId, permissionId)));
75
- }
76
- async function getUserRbacData(userId) {
77
- const roles = await db.select({
78
- id: rolesTable.id,
79
- name: rolesTable.name
80
- }).from(usersToRolesTable).innerJoin(rolesTable, eq(usersToRolesTable.roleId, rolesTable.id)).where(eq(usersToRolesTable.userId, userId));
81
- const directPermissions = await db.select({
82
- id: permissionsTable.id,
83
- name: permissionsTable.name
84
- }).from(usersToPermissionsTable).innerJoin(permissionsTable, eq(usersToPermissionsTable.permissionId, permissionsTable.id)).where(eq(usersToPermissionsTable.userId, userId));
85
- let rolePermissions = [];
86
- if (roles.length > 0) {
87
- const roleIds = roles.map((r) => r.id);
88
- rolePermissions = await db.select({
89
- id: permissionsTable.id,
90
- name: permissionsTable.name
91
- }).from(rolesToPermissionsTable).innerJoin(permissionsTable, eq(rolesToPermissionsTable.permissionId, permissionsTable.id)).where(inArray(rolesToPermissionsTable.roleId, roleIds));
92
- }
93
- const effectiveMap = /* @__PURE__ */ new Map();
94
- for (const p of [...directPermissions, ...rolePermissions]) effectiveMap.set(p.id, p);
95
- return {
96
- roles,
97
- directPermissions,
98
- effectivePermissions: Array.from(effectiveMap.values())
99
- };
100
- }
101
-
102
- //#endregion
103
- export { assignPermissionToRole, assignPermissionToUser, assignRoleToUser, createPermission, createRole, deletePermission, deleteRole, getPermissions, getRoleById, getRolePermissions, getRoles, getUserRbacData, revokePermissionFromRole, revokePermissionFromUser, revokeRoleFromUser };
1
+ "use server";import{db as e}from"../../server/database/inject.mjs";import{permissionsTable as t,rolesTable as n,rolesToPermissionsTable as r,usersToPermissionsTable as i,usersToRolesTable as a}from"../../server/database/schema.mjs";import{notificationService as o}from"../notifications/service.mjs";import"../notifications/index.mjs";import{and as s,eq as c,inArray as l}from"drizzle-orm";typeof window>`u`&&o.init();async function u(){return await e.select().from(n).orderBy(n.name)}async function d(t){let[r]=await e.select().from(n).where(c(n.id,t));return r}async function f(t,r){return await e.insert(n).values({name:t,description:r}).returning()}async function p(t){return await e.delete(n).where(c(n.id,t))}async function m(){return await e.select().from(t).orderBy(t.name)}async function h(n,r){return await e.insert(t).values({name:n,description:r}).returning()}async function g(n){return await e.delete(t).where(c(t.id,n))}async function _(n){return await e.select({id:t.id,name:t.name}).from(r).innerJoin(t,c(r.permissionId,t.id)).where(c(r.roleId,n))}async function v(t,n){return await e.insert(r).values({roleId:t,permissionId:n}).onConflictDoNothing()}async function y(t,n){return await e.delete(r).where(s(c(r.roleId,t),c(r.permissionId,n)))}async function b(t,n){return await e.insert(a).values({userId:t,roleId:n}).onConflictDoNothing()}async function x(t,n){return await e.delete(a).where(s(c(a.userId,t),c(a.roleId,n)))}async function S(t,n){return await e.insert(i).values({userId:t,permissionId:n}).onConflictDoNothing()}async function C(t,n){return await e.delete(i).where(s(c(i.userId,t),c(i.permissionId,n)))}async function w(o){let s=await e.select({id:n.id,name:n.name}).from(a).innerJoin(n,c(a.roleId,n.id)).where(c(a.userId,o)),u=await e.select({id:t.id,name:t.name}).from(i).innerJoin(t,c(i.permissionId,t.id)).where(c(i.userId,o)),d=[];if(s.length>0){let n=s.map(e=>e.id);d=await e.select({id:t.id,name:t.name}).from(r).innerJoin(t,c(r.permissionId,t.id)).where(l(r.roleId,n))}let f=new Map;for(let e of[...u,...d])f.set(e.id,e);return{roles:s,directPermissions:u,effectivePermissions:Array.from(f.values())}}export{v as assignPermissionToRole,S as assignPermissionToUser,b as assignRoleToUser,h as createPermission,f as createRole,g as deletePermission,p as deleteRole,m as getPermissions,d as getRoleById,_ as getRolePermissions,u as getRoles,w as getUserRbacData,y as revokePermissionFromRole,C as revokePermissionFromUser,x as revokeRoleFromUser};
104
2
  //# sourceMappingURL=rbac.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"rbac.mjs","names":[],"sources":["../../../src/core/auth/rbac.ts"],"sourcesContent":["\"use server\";\n\nimport { and, eq, inArray } from \"drizzle-orm\";\nimport { db } from \"../../server/database/inject\";\nimport {\n permissionsTable,\n rolesTable,\n rolesToPermissionsTable,\n usersToPermissionsTable,\n usersToRolesTable,\n} from \"../../server/database/schema\";\nimport { notificationService } from \"../notifications\";\n\n// Ensure notification service is loaded\nif (typeof window === \"undefined\") {\n notificationService.init();\n}\n\n/**\n * CORE RBAC LOGIC\n * This file handles all database operations for Roles and Permissions.\n */\n\n// --- Roles ---\n\nexport async function getRoles() {\n return await db.select().from(rolesTable).orderBy(rolesTable.name);\n}\n\nexport async function getRoleById(roleId: string) {\n const [role] = await db\n .select()\n .from(rolesTable)\n .where(eq(rolesTable.id, roleId));\n return role;\n}\n\nexport async function createRole(name: string, description?: string) {\n return await db.insert(rolesTable).values({ name, description }).returning();\n}\n\nexport async function deleteRole(roleId: string) {\n return await db.delete(rolesTable).where(eq(rolesTable.id, roleId));\n}\n\n// --- Permissions ---\n\nexport async function getPermissions() {\n return await db\n .select()\n .from(permissionsTable)\n .orderBy(permissionsTable.name);\n}\n\nexport async function createPermission(name: string, description?: string) {\n return await db\n .insert(permissionsTable)\n .values({ name, description })\n .returning();\n}\n\nexport async function deletePermission(permissionId: string) {\n return await db\n .delete(permissionsTable)\n .where(eq(permissionsTable.id, permissionId));\n}\n\n// --- Mappings ---\n\nexport async function getRolePermissions(roleId: string) {\n return await db\n .select({\n id: permissionsTable.id,\n name: permissionsTable.name,\n })\n .from(rolesToPermissionsTable)\n .innerJoin(\n permissionsTable,\n eq(rolesToPermissionsTable.permissionId, permissionsTable.id),\n )\n .where(eq(rolesToPermissionsTable.roleId, roleId));\n}\n\nexport async function assignPermissionToRole(\n roleId: string,\n permissionId: string,\n) {\n return await db\n .insert(rolesToPermissionsTable)\n .values({ roleId, permissionId })\n .onConflictDoNothing();\n}\n\nexport async function revokePermissionFromRole(\n roleId: string,\n permissionId: string,\n) {\n return await db\n .delete(rolesToPermissionsTable)\n .where(\n and(\n eq(rolesToPermissionsTable.roleId, roleId),\n eq(rolesToPermissionsTable.permissionId, permissionId),\n ),\n );\n}\n\n// --- User Assignment ---\n\nexport async function assignRoleToUser(userId: string, roleId: string) {\n return await db\n .insert(usersToRolesTable)\n .values({ userId, roleId })\n .onConflictDoNothing();\n}\n\nexport async function revokeRoleFromUser(userId: string, roleId: string) {\n return await db\n .delete(usersToRolesTable)\n .where(\n and(\n eq(usersToRolesTable.userId, userId),\n eq(usersToRolesTable.roleId, roleId),\n ),\n );\n}\n\nexport async function assignPermissionToUser(\n userId: string,\n permissionId: string,\n) {\n return await db\n .insert(usersToPermissionsTable)\n .values({ userId, permissionId })\n .onConflictDoNothing();\n}\n\nexport async function revokePermissionFromUser(\n userId: string,\n permissionId: string,\n) {\n return await db\n .delete(usersToPermissionsTable)\n .where(\n and(\n eq(usersToPermissionsTable.userId, userId),\n eq(usersToPermissionsTable.permissionId, permissionId),\n ),\n );\n}\n\nexport async function getUserRbacData(userId: string) {\n const roles = await db\n .select({\n id: rolesTable.id,\n name: rolesTable.name,\n })\n .from(usersToRolesTable)\n .innerJoin(rolesTable, eq(usersToRolesTable.roleId, rolesTable.id))\n .where(eq(usersToRolesTable.userId, userId));\n\n const directPermissions = await db\n .select({\n id: permissionsTable.id,\n name: permissionsTable.name,\n })\n .from(usersToPermissionsTable)\n .innerJoin(\n permissionsTable,\n eq(usersToPermissionsTable.permissionId, permissionsTable.id),\n )\n .where(eq(usersToPermissionsTable.userId, userId));\n\n // Fetch inherited permissions from roles\n let rolePermissions: { id: string; name: string }[] = [];\n if (roles.length > 0) {\n const roleIds = roles.map((r) => r.id);\n rolePermissions = await db\n .select({\n id: permissionsTable.id,\n name: permissionsTable.name,\n })\n .from(rolesToPermissionsTable)\n .innerJoin(\n permissionsTable,\n eq(rolesToPermissionsTable.permissionId, permissionsTable.id),\n )\n .where(inArray(rolesToPermissionsTable.roleId, roleIds));\n }\n\n // Combine for effective permissions\n const effectiveMap = new Map<string, { id: string; name: string }>();\n for (const p of [...directPermissions, ...rolePermissions]) {\n effectiveMap.set(p.id, p);\n }\n\n return {\n roles,\n directPermissions,\n effectivePermissions: Array.from(effectiveMap.values()),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"rbac.mjs","names":[],"sources":["../../../src/core/auth/rbac.ts"],"sourcesContent":["\"use server\";\n\nimport { and, eq, inArray } from \"drizzle-orm\";\nimport { db } from \"../../server/database/inject.js\";\nimport {\n permissionsTable,\n rolesTable,\n rolesToPermissionsTable,\n usersToPermissionsTable,\n usersToRolesTable,\n} from \"../../server/database/schema.js\";\nimport { notificationService } from \"../notifications/index.js\";\n\n// Ensure notification service is loaded\nif (typeof window === \"undefined\") {\n notificationService.init();\n}\n\n/**\n * CORE RBAC LOGIC\n * This file handles all database operations for Roles and Permissions.\n */\n\n// --- Roles ---\n\nexport async function getRoles() {\n return await db.select().from(rolesTable).orderBy(rolesTable.name);\n}\n\nexport async function getRoleById(roleId: string) {\n const [role] = await db\n .select()\n .from(rolesTable)\n .where(eq(rolesTable.id, roleId));\n return role;\n}\n\nexport async function createRole(name: string, description?: string) {\n return await db.insert(rolesTable).values({ name, description }).returning();\n}\n\nexport async function deleteRole(roleId: string) {\n return await db.delete(rolesTable).where(eq(rolesTable.id, roleId));\n}\n\n// --- Permissions ---\n\nexport async function getPermissions() {\n return await db\n .select()\n .from(permissionsTable)\n .orderBy(permissionsTable.name);\n}\n\nexport async function createPermission(name: string, description?: string) {\n return await db\n .insert(permissionsTable)\n .values({ name, description })\n .returning();\n}\n\nexport async function deletePermission(permissionId: string) {\n return await db\n .delete(permissionsTable)\n .where(eq(permissionsTable.id, permissionId));\n}\n\n// --- Mappings ---\n\nexport async function getRolePermissions(roleId: string) {\n return await db\n .select({\n id: permissionsTable.id,\n name: permissionsTable.name,\n })\n .from(rolesToPermissionsTable)\n .innerJoin(\n permissionsTable,\n eq(rolesToPermissionsTable.permissionId, permissionsTable.id),\n )\n .where(eq(rolesToPermissionsTable.roleId, roleId));\n}\n\nexport async function assignPermissionToRole(\n roleId: string,\n permissionId: string,\n) {\n return await db\n .insert(rolesToPermissionsTable)\n .values({ roleId, permissionId })\n .onConflictDoNothing();\n}\n\nexport async function revokePermissionFromRole(\n roleId: string,\n permissionId: string,\n) {\n return await db\n .delete(rolesToPermissionsTable)\n .where(\n and(\n eq(rolesToPermissionsTable.roleId, roleId),\n eq(rolesToPermissionsTable.permissionId, permissionId),\n ),\n );\n}\n\n// --- User Assignment ---\n\nexport async function assignRoleToUser(userId: string, roleId: string) {\n return await db\n .insert(usersToRolesTable)\n .values({ userId, roleId })\n .onConflictDoNothing();\n}\n\nexport async function revokeRoleFromUser(userId: string, roleId: string) {\n return await db\n .delete(usersToRolesTable)\n .where(\n and(\n eq(usersToRolesTable.userId, userId),\n eq(usersToRolesTable.roleId, roleId),\n ),\n );\n}\n\nexport async function assignPermissionToUser(\n userId: string,\n permissionId: string,\n) {\n return await db\n .insert(usersToPermissionsTable)\n .values({ userId, permissionId })\n .onConflictDoNothing();\n}\n\nexport async function revokePermissionFromUser(\n userId: string,\n permissionId: string,\n) {\n return await db\n .delete(usersToPermissionsTable)\n .where(\n and(\n eq(usersToPermissionsTable.userId, userId),\n eq(usersToPermissionsTable.permissionId, permissionId),\n ),\n );\n}\n\nexport async function getUserRbacData(userId: string) {\n const roles = await db\n .select({\n id: rolesTable.id,\n name: rolesTable.name,\n })\n .from(usersToRolesTable)\n .innerJoin(rolesTable, eq(usersToRolesTable.roleId, rolesTable.id))\n .where(eq(usersToRolesTable.userId, userId));\n\n const directPermissions = await db\n .select({\n id: permissionsTable.id,\n name: permissionsTable.name,\n })\n .from(usersToPermissionsTable)\n .innerJoin(\n permissionsTable,\n eq(usersToPermissionsTable.permissionId, permissionsTable.id),\n )\n .where(eq(usersToPermissionsTable.userId, userId));\n\n // Fetch inherited permissions from roles\n let rolePermissions: { id: string; name: string }[] = [];\n if (roles.length > 0) {\n const roleIds = roles.map((r) => r.id);\n rolePermissions = await db\n .select({\n id: permissionsTable.id,\n name: permissionsTable.name,\n })\n .from(rolesToPermissionsTable)\n .innerJoin(\n permissionsTable,\n eq(rolesToPermissionsTable.permissionId, permissionsTable.id),\n )\n .where(inArray(rolesToPermissionsTable.roleId, roleIds));\n }\n\n // Combine for effective permissions\n const effectiveMap = new Map<string, { id: string; name: string }>();\n for (const p of [...directPermissions, ...rolePermissions]) {\n effectiveMap.set(p.id, p);\n }\n\n return {\n roles,\n directPermissions,\n effectivePermissions: Array.from(effectiveMap.values()),\n };\n}\n"],"mappings":"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"}