@arch-cadre/core 0.0.22 → 0.0.24

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 (90) 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.mjs +1 -91
  10. package/dist/core/auth/email-verification.mjs.map +1 -1
  11. package/dist/core/auth/logic.cjs +1 -224
  12. package/dist/core/auth/logic.mjs +1 -212
  13. package/dist/core/auth/logic.mjs.map +1 -1
  14. package/dist/core/auth/password-reset.cjs +1 -118
  15. package/dist/core/auth/password-reset.mjs +1 -110
  16. package/dist/core/auth/password-reset.mjs.map +1 -1
  17. package/dist/core/auth/rbac.cjs +1 -118
  18. package/dist/core/auth/rbac.mjs +1 -103
  19. package/dist/core/auth/rbac.mjs.map +1 -1
  20. package/dist/core/auth/session.cjs +1 -154
  21. package/dist/core/auth/session.mjs +1 -142
  22. package/dist/core/auth/session.mjs.map +1 -1
  23. package/dist/core/auth/types.d.cts.map +1 -1
  24. package/dist/core/auth/types.d.mts.map +1 -1
  25. package/dist/core/auth/utils/encode.cjs +1 -27
  26. package/dist/core/auth/utils/encode.mjs +1 -25
  27. package/dist/core/auth/utils/encode.mjs.map +1 -1
  28. package/dist/core/auth/utils/encryption.cjs +1 -67
  29. package/dist/core/auth/utils/encryption.mjs +1 -63
  30. package/dist/core/auth/utils/encryption.mjs.map +1 -1
  31. package/dist/core/auth/validation.cjs +1 -39
  32. package/dist/core/auth/validation.mjs +1 -30
  33. package/dist/core/auth/validation.mjs.map +1 -1
  34. package/dist/core/bootstrap.cjs +1 -39
  35. package/dist/core/bootstrap.mjs +1 -39
  36. package/dist/core/bootstrap.mjs.map +1 -1
  37. package/dist/core/config.cjs +1 -6
  38. package/dist/core/config.mjs +1 -5
  39. package/dist/core/config.mjs.map +1 -1
  40. package/dist/core/config.server.cjs +1 -60
  41. package/dist/core/config.server.mjs +1 -56
  42. package/dist/core/config.server.mjs.map +1 -1
  43. package/dist/core/event-bus.cjs +1 -48
  44. package/dist/core/event-bus.d.cts.map +1 -1
  45. package/dist/core/event-bus.d.mts.map +1 -1
  46. package/dist/core/event-bus.mjs +1 -47
  47. package/dist/core/event-bus.mjs.map +1 -1
  48. package/dist/core/filesystem/index.cjs +1 -11
  49. package/dist/core/filesystem/index.mjs +1 -12
  50. package/dist/core/filesystem/index.mjs.map +1 -1
  51. package/dist/core/filesystem/providers/local.cjs +1 -43
  52. package/dist/core/filesystem/providers/local.mjs +1 -40
  53. package/dist/core/filesystem/providers/local.mjs.map +1 -1
  54. package/dist/core/filesystem/service.cjs +1 -43
  55. package/dist/core/filesystem/service.mjs +1 -42
  56. package/dist/core/filesystem/service.mjs.map +1 -1
  57. package/dist/core/notifications/actions.cjs +1 -36
  58. package/dist/core/notifications/actions.mjs +1 -32
  59. package/dist/core/notifications/actions.mjs.map +1 -1
  60. package/dist/core/notifications/index.cjs +1 -2
  61. package/dist/core/notifications/index.mjs +1 -4
  62. package/dist/core/notifications/service.cjs +1 -30
  63. package/dist/core/notifications/service.mjs +1 -30
  64. package/dist/core/notifications/service.mjs.map +1 -1
  65. package/dist/core/setup.cjs +1 -25
  66. package/dist/core/setup.mjs +1 -24
  67. package/dist/core/setup.mjs.map +1 -1
  68. package/dist/index.cjs +1 -30
  69. package/dist/index.mjs +1 -6
  70. package/dist/server/auth/email.cjs +1 -24
  71. package/dist/server/auth/email.mjs +1 -22
  72. package/dist/server/auth/email.mjs.map +1 -1
  73. package/dist/server/auth/password.cjs +1 -37
  74. package/dist/server/auth/password.mjs +1 -33
  75. package/dist/server/auth/password.mjs.map +1 -1
  76. package/dist/server/auth/user.cjs +1 -165
  77. package/dist/server/auth/user.mjs +1 -152
  78. package/dist/server/auth/user.mjs.map +1 -1
  79. package/dist/server/database/inject.cjs +1 -24
  80. package/dist/server/database/inject.mjs +1 -22
  81. package/dist/server/database/inject.mjs.map +1 -1
  82. package/dist/server/database/schema.cjs +1 -163
  83. package/dist/server/database/schema.mjs +1 -150
  84. package/dist/server/database/schema.mjs.map +1 -1
  85. package/dist/server/emails/index.cjs +1 -32
  86. package/dist/server/emails/index.mjs +1 -28
  87. package/dist/server/emails/index.mjs.map +1 -1
  88. package/dist/server.cjs +1 -145
  89. package/dist/server.mjs +1 -23
  90. package/package.json +1 -1
@@ -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;
@@ -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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"}
@@ -1,154 +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_logic = require('./logic.cjs');
8
- let drizzle_orm = require("drizzle-orm");
9
- let _oslojs_crypto_sha2 = require("@oslojs/crypto/sha2");
10
- let _oslojs_encoding = require("@oslojs/encoding");
11
- let date_fns = require("date-fns");
12
- let next_headers = require("next/headers");
13
- let next_navigation = require("next/navigation");
14
-
15
- //#region src/core/auth/session.ts
16
- /**
17
- * Returns the user's IP address.
18
- */
19
- async function getIPAddress() {
20
- return (await (0, next_headers.headers)()).get("x-forwarded-for");
21
- }
22
- /**
23
- * Validates the session token.
24
- */
25
- async function validateSessionToken(token) {
26
- const sessionId = (0, _oslojs_encoding.encodeHexLowerCase)((0, _oslojs_crypto_sha2.sha256)(new TextEncoder().encode(token)));
27
- const [row] = await require_inject.db.select({
28
- session: require_schema.sessionTable,
29
- user: require_schema.userTable
30
- }).from(require_schema.sessionTable).innerJoin(require_schema.userTable, (0, drizzle_orm.eq)(require_schema.sessionTable.userId, require_schema.userTable.id)).where((0, drizzle_orm.eq)(require_schema.sessionTable.id, sessionId));
31
- if (!row || !row.user) return {
32
- session: null,
33
- user: null
34
- };
35
- const { session: baseSession, user: baseUser } = row;
36
- const { password, recovery_code, ...safeUser } = baseUser;
37
- if (/* @__PURE__ */ new Date() > baseSession.expiresAt) {
38
- await require_inject.db.delete(require_schema.sessionTable).where((0, drizzle_orm.eq)(require_schema.sessionTable.id, baseSession.id));
39
- return {
40
- session: null,
41
- user: null
42
- };
43
- }
44
- const augmentedUser = await require_logic.performFullUserAugmentation(safeUser);
45
- const augmentedSession = await require_augment.augmentSession(baseSession);
46
- return {
47
- session: augmentedSession ? { ...augmentedSession } : null,
48
- user: augmentedUser ? { ...augmentedUser } : null
49
- };
50
- }
51
- /**
52
- * Returns the current user session from cookies.
53
- */
54
- const getCurrentSession = async () => {
55
- const token = (await (0, next_headers.cookies)()).get("session")?.value ?? null;
56
- if (token === null) return {
57
- session: null,
58
- user: null
59
- };
60
- return await validateSessionToken(token);
61
- };
62
- /**
63
- * Invalidates a single session.
64
- */
65
- async function invalidateSession(sessionId) {
66
- await require_inject.db.delete(require_schema.sessionTable).where((0, drizzle_orm.eq)(require_schema.sessionTable.id, sessionId));
67
- }
68
- /**
69
- * Invalidates all user sessions.
70
- */
71
- async function invalidateUserSessions(userId) {
72
- await require_inject.db.delete(require_schema.sessionTable).where((0, drizzle_orm.eq)(require_schema.sessionTable.userId, userId));
73
- }
74
- /**
75
- * Sets the session token in a cookie.
76
- */
77
- async function setSessionTokenCookie(token, expiresAt) {
78
- (await (0, next_headers.cookies)()).set("session", token, {
79
- httpOnly: true,
80
- path: "/",
81
- secure: process.env.NODE_ENV === "production",
82
- sameSite: "lax",
83
- expires: expiresAt
84
- });
85
- }
86
- /**
87
- * Removes the session token cookie.
88
- */
89
- async function deleteSessionTokenCookie() {
90
- (await (0, next_headers.cookies)()).delete("session");
91
- }
92
- /**
93
- * Generates a new random session token.
94
- */
95
- async function generateSessionToken() {
96
- const tokenBytes = new Uint8Array(20);
97
- crypto.getRandomValues(tokenBytes);
98
- return (0, _oslojs_encoding.encodeBase32LowerCaseNoPadding)(tokenBytes).toLowerCase();
99
- }
100
- /**
101
- * Creates a new session in the database.
102
- */
103
- async function createSession(token, userId, flags) {
104
- const sessionId = (0, _oslojs_encoding.encodeHexLowerCase)((0, _oslojs_crypto_sha2.sha256)(new TextEncoder().encode(token)));
105
- const [session] = await require_inject.db.insert(require_schema.sessionTable).values({
106
- id: sessionId,
107
- expiresAt: new Date((0, date_fns.addDays)(/* @__PURE__ */ new Date(), 7)),
108
- active_organization_id: flags.activeOrganizationId,
109
- userId
110
- }).returning();
111
- return session;
112
- }
113
- /**
114
- * Signs the user out and redirects to the sign-in page.
115
- */
116
- async function sessionSignOut() {
117
- const { session } = await getCurrentSession();
118
- if (session) {
119
- await invalidateSession(session.id);
120
- await deleteSessionTokenCookie();
121
- }
122
- (0, next_navigation.redirect)("/signin");
123
- }
124
- /**
125
- * Get all active sessions for a user.
126
- */
127
- async function getUserSessions(userId, currentSessionId) {
128
- return (await require_inject.db.select().from(require_schema.sessionTable).where((0, drizzle_orm.eq)(require_schema.sessionTable.userId, userId))).map((session) => ({
129
- id: session.id,
130
- createdAt: session.createdAt,
131
- expiresAt: session.expiresAt,
132
- isCurrent: session.id === currentSessionId
133
- }));
134
- }
135
- /**
136
- * Invalidate all sessions for a user except the specified current one.
137
- */
138
- async function invalidateOtherSessions(userId, currentSessionId) {
139
- await require_inject.db.delete(require_schema.sessionTable).where((0, drizzle_orm.and)((0, drizzle_orm.eq)(require_schema.sessionTable.userId, userId), (0, drizzle_orm.ne)(require_schema.sessionTable.id, currentSessionId)));
140
- }
141
-
142
- //#endregion
143
- exports.createSession = createSession;
144
- exports.deleteSessionTokenCookie = deleteSessionTokenCookie;
145
- exports.generateSessionToken = generateSessionToken;
146
- exports.getCurrentSession = getCurrentSession;
147
- exports.getIPAddress = getIPAddress;
148
- exports.getUserSessions = getUserSessions;
149
- exports.invalidateOtherSessions = invalidateOtherSessions;
150
- exports.invalidateSession = invalidateSession;
151
- exports.invalidateUserSessions = invalidateUserSessions;
152
- exports.sessionSignOut = sessionSignOut;
153
- exports.setSessionTokenCookie = setSessionTokenCookie;
154
- exports.validateSessionToken = validateSessionToken;
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(`./logic.cjs`);let i=require(`drizzle-orm`),a=require(`@oslojs/crypto/sha2`),o=require(`@oslojs/encoding`),s=require(`date-fns`),c=require(`next/headers`),l=require(`next/navigation`);async function u(){return(await(0,c.headers)()).get(`x-forwarded-for`)}async function d(s){let c=(0,o.encodeHexLowerCase)((0,a.sha256)(new TextEncoder().encode(s))),[l]=await e.db.select({session:t.sessionTable,user:t.userTable}).from(t.sessionTable).innerJoin(t.userTable,(0,i.eq)(t.sessionTable.userId,t.userTable.id)).where((0,i.eq)(t.sessionTable.id,c));if(!l||!l.user)return{session:null,user:null};let{session:u,user:d}=l,{password:f,recovery_code:p,...m}=d;if(new Date>u.expiresAt)return await e.db.delete(t.sessionTable).where((0,i.eq)(t.sessionTable.id,u.id)),{session:null,user:null};let h=await r.performFullUserAugmentation(m),g=await n.augmentSession(u);return{session:g?{...g}:null,user:h?{...h}:null}}const f=async()=>{let e=(await(0,c.cookies)()).get(`session`)?.value??null;return e===null?{session:null,user:null}:await d(e)};async function p(n){await e.db.delete(t.sessionTable).where((0,i.eq)(t.sessionTable.id,n))}async function m(n){await e.db.delete(t.sessionTable).where((0,i.eq)(t.sessionTable.userId,n))}async function h(e,t){(await(0,c.cookies)()).set(`session`,e,{httpOnly:!0,path:`/`,secure:process.env.NODE_ENV===`production`,sameSite:`lax`,expires:t})}async function g(){(await(0,c.cookies)()).delete(`session`)}async function _(){let e=new Uint8Array(20);return crypto.getRandomValues(e),(0,o.encodeBase32LowerCaseNoPadding)(e).toLowerCase()}async function v(n,r,i){let c=(0,o.encodeHexLowerCase)((0,a.sha256)(new TextEncoder().encode(n))),[l]=await e.db.insert(t.sessionTable).values({id:c,expiresAt:new Date((0,s.addDays)(new Date,7)),active_organization_id:i.activeOrganizationId,userId:r}).returning();return l}async function y(){let{session:e}=await f();e&&(await p(e.id),await g()),(0,l.redirect)(`/signin`)}async function b(n,r){return(await e.db.select().from(t.sessionTable).where((0,i.eq)(t.sessionTable.userId,n))).map(e=>({id:e.id,createdAt:e.createdAt,expiresAt:e.expiresAt,isCurrent:e.id===r}))}async function x(n,r){await e.db.delete(t.sessionTable).where((0,i.and)((0,i.eq)(t.sessionTable.userId,n),(0,i.ne)(t.sessionTable.id,r)))}exports.createSession=v,exports.deleteSessionTokenCookie=g,exports.generateSessionToken=_,exports.getCurrentSession=f,exports.getIPAddress=u,exports.getUserSessions=b,exports.invalidateOtherSessions=x,exports.invalidateSession=p,exports.invalidateUserSessions=m,exports.sessionSignOut=y,exports.setSessionTokenCookie=h,exports.validateSessionToken=d;