@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,153 +1,2 @@
1
- "use server";
2
-
3
- import { db } from "../database/inject.mjs";
4
- import { rolesTable, userTable, usersToRolesTable } from "../database/schema.mjs";
5
- import { hashPassword } from "./password.mjs";
6
- import { generateRandomRecoveryCode } from "../../core/auth/utils/encode.mjs";
7
- import { decryptToString, encryptString } from "../../core/auth/utils/encryption.mjs";
8
- import { sendRecoveryCode } from "../emails/index.mjs";
9
- import { and, eq } from "drizzle-orm";
10
-
11
- //#region src/server/auth/user.ts
12
- /**
13
- * Validates the username input.
14
- */
15
- async function verifyUsernameInput(username) {
16
- return username.length > 3 && username.length < 32 && username.trim() === username;
17
- }
18
- /**
19
- * Creates a new user with an initial recovery code and default 'user' role.
20
- */
21
- async function createUser(email, username, password) {
22
- const passwordHash = await hashPassword(password);
23
- const recoveryCode = generateRandomRecoveryCode();
24
- const encryptedRecoveryCode = encryptString(recoveryCode);
25
- return await db.transaction(async (tx) => {
26
- const [row] = await tx.insert(userTable).values({
27
- email,
28
- name: username,
29
- password: passwordHash,
30
- recovery_code: Buffer.from(encryptedRecoveryCode)
31
- }).returning();
32
- if (!row) throw new Error("Failed to create user");
33
- let [role] = await tx.select().from(rolesTable).where(eq(rolesTable.name, "user"));
34
- if (!role) [role] = await tx.insert(rolesTable).values({
35
- name: "user",
36
- description: "Default user role"
37
- }).returning();
38
- await tx.insert(usersToRolesTable).values({
39
- userId: row.id,
40
- roleId: role.id
41
- });
42
- await /* @__PURE__ */ sendRecoveryCode(row.email, recoveryCode);
43
- return row;
44
- });
45
- }
46
- /**
47
- * Creates a new user from an OAuth provider.
48
- */
49
- async function createOAuthUser(email, name, image) {
50
- const encryptedRecoveryCode = encryptString(generateRandomRecoveryCode());
51
- return await db.transaction(async (tx) => {
52
- const [row] = await tx.insert(userTable).values({
53
- email,
54
- name,
55
- image,
56
- emailVerifiedAt: /* @__PURE__ */ new Date(),
57
- recovery_code: Buffer.from(encryptedRecoveryCode)
58
- }).returning();
59
- let [role] = await tx.select().from(rolesTable).where(eq(rolesTable.name, "user"));
60
- if (!role) [role] = await tx.insert(rolesTable).values({
61
- name: "user",
62
- description: "Default user role"
63
- }).returning();
64
- await tx.insert(usersToRolesTable).values({
65
- userId: row.id,
66
- roleId: role.id
67
- });
68
- return row;
69
- });
70
- }
71
- /**
72
- * Returns a user by ID.
73
- */
74
- async function getUserById(userId) {
75
- const [user] = await db.select().from(userTable).where(eq(userTable.id, userId));
76
- if (!user) return null;
77
- const { password, recovery_code, ...safeUser } = user;
78
- return safeUser;
79
- }
80
- /**
81
- * Decrypts and returns the user's recovery code.
82
- */
83
- async function getUserRecoverCode(userId) {
84
- const [user] = await db.select({ recovery_code: userTable.recovery_code }).from(userTable).where(eq(userTable.id, userId));
85
- if (!user || !user.recovery_code) throw new Error("Recovery code not found for user");
86
- return decryptToString(user.recovery_code);
87
- }
88
- /**
89
- * Generates and sets a new recovery code for the user.
90
- */
91
- async function resetUserRecoveryCode(userId) {
92
- const recoveryCode = generateRandomRecoveryCode();
93
- const encrypted = encryptString(recoveryCode);
94
- const [currentUser] = await db.update(userTable).set({ recovery_code: Buffer.from(encrypted) }).where(eq(userTable.id, userId)).returning();
95
- if (!currentUser) throw new Error("User not found");
96
- await /* @__PURE__ */ sendRecoveryCode(currentUser.email, recoveryCode);
97
- return recoveryCode;
98
- }
99
- /**
100
- * Updates the user's password.
101
- */
102
- async function updateUserPassword(userId, password) {
103
- const passwordHash = await hashPassword(password);
104
- await db.update(userTable).set({ password: passwordHash }).where(eq(userTable.id, userId));
105
- }
106
- /**
107
- * Updates the user's name.
108
- */
109
- async function updateUserName(userId, name) {
110
- await db.update(userTable).set({ name }).where(eq(userTable.id, userId));
111
- }
112
- /**
113
- * Updates the user's image.
114
- */
115
- async function updateUserAwatar(userId, image) {
116
- await db.update(userTable).set({ image }).where(eq(userTable.id, userId));
117
- }
118
- /**
119
- * Updates the user's email and marks it as verified.
120
- */
121
- async function updateUserEmailAndSetEmailAsVerified(userId, email) {
122
- await db.update(userTable).set({
123
- email,
124
- emailVerifiedAt: /* @__PURE__ */ new Date()
125
- }).where(eq(userTable.id, userId));
126
- }
127
- /**
128
- * Sets the user as email verified if the provided email matches.
129
- */
130
- async function setUserAsEmailVerifiedIfEmailMatches(userId, email) {
131
- return (await db.update(userTable).set({ emailVerifiedAt: /* @__PURE__ */ new Date() }).where(and(eq(userTable.id, userId), eq(userTable.email, email))).returning({ id: userTable.id })).length > 0;
132
- }
133
- /**
134
- * Returns the user's password hash.
135
- */
136
- async function getUserPasswordHash(userId) {
137
- const [user] = await db.select({ password: userTable.password }).from(userTable).where(eq(userTable.id, userId));
138
- if (!user) throw new Error("User not found");
139
- return user.password;
140
- }
141
- /**
142
- * Returns a user by email.
143
- */
144
- async function getUserFromEmail(email) {
145
- const [user] = await db.select().from(userTable).where(eq(userTable.email, email));
146
- if (!user) return null;
147
- const { password, recovery_code, ...safeUser } = user;
148
- return safeUser;
149
- }
150
-
151
- //#endregion
152
- export { createOAuthUser, createUser, getUserById, getUserFromEmail, getUserPasswordHash, getUserRecoverCode, resetUserRecoveryCode, setUserAsEmailVerifiedIfEmailMatches, updateUserAwatar, updateUserEmailAndSetEmailAsVerified, updateUserName, updateUserPassword, verifyUsernameInput };
1
+ "use server";import{db as e}from"../database/inject.mjs";import{rolesTable as t,userTable as n,usersToRolesTable as r}from"../database/schema.mjs";import{hashPassword as i}from"./password.mjs";import{generateRandomRecoveryCode as a}from"../../core/auth/utils/encode.mjs";import{decryptToString as o,encryptString as s}from"../../core/auth/utils/encryption.mjs";import{sendRecoveryCode as c}from"../emails/index.mjs";import{and as l,eq as u}from"drizzle-orm";async function d(e){return e.length>3&&e.length<32&&e.trim()===e}async function f(o,l,d){let f=await i(d),p=a(),m=s(p);return await e.transaction(async e=>{let[i]=await e.insert(n).values({email:o,name:l,password:f,recovery_code:Buffer.from(m)}).returning();if(!i)throw Error(`Failed to create user`);let[a]=await e.select().from(t).where(u(t.name,`user`));return a||([a]=await e.insert(t).values({name:`user`,description:`Default user role`}).returning()),await e.insert(r).values({userId:i.id,roleId:a.id}),await c(i.email,p),i})}async function p(i,o,c){let l=s(a());return await e.transaction(async e=>{let[a]=await e.insert(n).values({email:i,name:o,image:c,emailVerifiedAt:new Date,recovery_code:Buffer.from(l)}).returning(),[s]=await e.select().from(t).where(u(t.name,`user`));return s||([s]=await e.insert(t).values({name:`user`,description:`Default user role`}).returning()),await e.insert(r).values({userId:a.id,roleId:s.id}),a})}async function m(t){let[r]=await e.select().from(n).where(u(n.id,t));if(!r)return null;let{password:i,recovery_code:a,...o}=r;return o}async function h(t){let[r]=await e.select({recovery_code:n.recovery_code}).from(n).where(u(n.id,t));if(!r||!r.recovery_code)throw Error(`Recovery code not found for user`);return o(r.recovery_code)}async function g(t){let r=a(),i=s(r),[o]=await e.update(n).set({recovery_code:Buffer.from(i)}).where(u(n.id,t)).returning();if(!o)throw Error(`User not found`);return await c(o.email,r),r}async function _(t,r){let a=await i(r);await e.update(n).set({password:a}).where(u(n.id,t))}async function v(t,r){await e.update(n).set({name:r}).where(u(n.id,t))}async function y(t,r){await e.update(n).set({image:r}).where(u(n.id,t))}async function b(t,r){await e.update(n).set({email:r,emailVerifiedAt:new Date}).where(u(n.id,t))}async function x(t,r){return(await e.update(n).set({emailVerifiedAt:new Date}).where(l(u(n.id,t),u(n.email,r))).returning({id:n.id})).length>0}async function S(t){let[r]=await e.select({password:n.password}).from(n).where(u(n.id,t));if(!r)throw Error(`User not found`);return r.password}async function C(t){let[r]=await e.select().from(n).where(u(n.email,t));if(!r)return null;let{password:i,recovery_code:a,...o}=r;return o}export{p as createOAuthUser,f as createUser,m as getUserById,C as getUserFromEmail,S as getUserPasswordHash,h as getUserRecoverCode,g as resetUserRecoveryCode,x as setUserAsEmailVerifiedIfEmailMatches,y as updateUserAwatar,b as updateUserEmailAndSetEmailAsVerified,v as updateUserName,_ as updateUserPassword,d as verifyUsernameInput};
153
2
  //# sourceMappingURL=user.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"user.mjs","names":[],"sources":["../../../src/server/auth/user.ts"],"sourcesContent":["\"use server\";\n\nimport { and, eq } from \"drizzle-orm\";\nimport type { User } from \"../../core/auth/types\";\nimport { generateRandomRecoveryCode } from \"../../core/auth/utils/encode\";\nimport {\n decryptToString,\n encryptString,\n} from \"../../core/auth/utils/encryption\";\nimport { db } from \"../database/inject\";\nimport { rolesTable, usersToRolesTable, userTable } from \"../database/schema\";\nimport { sendRecoveryCode } from \"../emails\";\nimport { hashPassword } from \"./password\";\n\n/**\n * Validates the username input.\n */\nexport async function verifyUsernameInput(username: string): Promise<boolean> {\n return (\n username.length > 3 && username.length < 32 && username.trim() === username\n );\n}\n\n/**\n * Creates a new user with an initial recovery code and default 'user' role.\n */\nexport async function createUser(\n email: string,\n username: string,\n password: string,\n): Promise<User> {\n const passwordHash = await hashPassword(password);\n const recoveryCode = generateRandomRecoveryCode();\n const encryptedRecoveryCode = encryptString(recoveryCode);\n\n return await db.transaction(async (tx) => {\n const [row] = await tx\n .insert(userTable)\n .values({\n email: email,\n name: username,\n password: passwordHash,\n recovery_code: Buffer.from(encryptedRecoveryCode),\n })\n .returning();\n\n if (!row) {\n throw new Error(\"Failed to create user\");\n }\n\n // Assign default 'user' role\n let [role] = await tx\n .select()\n .from(rolesTable)\n .where(eq(rolesTable.name, \"user\"));\n\n if (!role) {\n [role] = await tx\n .insert(rolesTable)\n .values({ name: \"user\", description: \"Default user role\" })\n .returning();\n }\n\n await tx.insert(usersToRolesTable).values({\n userId: row.id,\n roleId: role.id,\n });\n\n await sendRecoveryCode(row.email, recoveryCode);\n\n return row;\n });\n}\n\n/**\n * Creates a new user from an OAuth provider.\n */\nexport async function createOAuthUser(\n email: string,\n name: string,\n image?: string,\n): Promise<User> {\n const recoveryCode = generateRandomRecoveryCode();\n const encryptedRecoveryCode = encryptString(recoveryCode);\n\n return await db.transaction(async (tx) => {\n const [row] = await tx\n .insert(userTable)\n .values({\n email: email,\n name: name,\n image: image,\n emailVerifiedAt: new Date(),\n recovery_code: Buffer.from(encryptedRecoveryCode),\n })\n .returning();\n\n // Assign default 'user' role\n let [role] = await tx\n .select()\n .from(rolesTable)\n .where(eq(rolesTable.name, \"user\"));\n\n if (!role) {\n [role] = await tx\n .insert(rolesTable)\n .values({ name: \"user\", description: \"Default user role\" })\n .returning();\n }\n\n await tx.insert(usersToRolesTable).values({\n userId: row.id,\n roleId: role.id,\n });\n\n return row;\n });\n}\n\n/**\n * Returns a user by ID.\n */\nexport async function getUserById(userId: string): Promise<User | null> {\n const [user] = await db\n .select()\n .from(userTable)\n .where(eq(userTable.id, userId));\n\n if (!user) return null;\n const { password, recovery_code, ...safeUser } = user;\n return safeUser as User;\n}\n\n/**\n * Decrypts and returns the user's recovery code.\n */\nexport async function getUserRecoverCode(userId: string): Promise<string> {\n const [user] = await db\n .select({\n recovery_code: userTable.recovery_code,\n })\n .from(userTable)\n .where(eq(userTable.id, userId));\n\n if (!user || !user.recovery_code) {\n throw new Error(\"Recovery code not found for user\");\n }\n\n return decryptToString(user.recovery_code);\n}\n\n/**\n * Generates and sets a new recovery code for the user.\n */\nexport async function resetUserRecoveryCode(userId: string): Promise<string> {\n const recoveryCode = generateRandomRecoveryCode();\n const encrypted = encryptString(recoveryCode);\n const [currentUser] = await db\n .update(userTable)\n .set({\n recovery_code: Buffer.from(encrypted),\n })\n .where(eq(userTable.id, userId))\n .returning();\n\n if (!currentUser) {\n throw new Error(\"User not found\");\n }\n\n await sendRecoveryCode(currentUser.email, recoveryCode);\n\n return recoveryCode;\n}\n\n/**\n * Updates the user's password.\n */\nexport async function updateUserPassword(\n userId: string,\n password: string,\n): Promise<void> {\n const passwordHash = await hashPassword(password);\n\n await db\n .update(userTable)\n .set({\n password: passwordHash,\n })\n .where(eq(userTable.id, userId));\n}\n\n/**\n * Updates the user's name.\n */\nexport async function updateUserName(\n userId: string,\n name: string,\n): Promise<void> {\n await db\n .update(userTable)\n .set({\n name: name,\n })\n .where(eq(userTable.id, userId));\n}\n/**\n * Updates the user's image.\n */\nexport async function updateUserAwatar(\n userId: string,\n image: string,\n): Promise<void> {\n await db\n .update(userTable)\n .set({\n image,\n })\n .where(eq(userTable.id, userId));\n}\n\n/**\n * Updates the user's email and marks it as verified.\n */\nexport async function updateUserEmailAndSetEmailAsVerified(\n userId: string,\n email: string,\n): Promise<void> {\n await db\n .update(userTable)\n .set({\n email: email,\n emailVerifiedAt: new Date(),\n })\n .where(eq(userTable.id, userId));\n}\n\n/**\n * Sets the user as email verified if the provided email matches.\n */\nexport async function setUserAsEmailVerifiedIfEmailMatches(\n userId: string,\n email: string,\n): Promise<boolean> {\n const result = await db\n .update(userTable)\n .set({\n emailVerifiedAt: new Date(),\n })\n .where(and(eq(userTable.id, userId), eq(userTable.email, email)))\n .returning({ id: userTable.id });\n\n return result.length > 0;\n}\n\n/**\n * Returns the user's password hash.\n */\nexport async function getUserPasswordHash(\n userId: string,\n): Promise<string | null> {\n const [user] = await db\n .select({\n password: userTable.password,\n })\n .from(userTable)\n .where(eq(userTable.id, userId));\n\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n return user.password;\n}\n\n/**\n * Returns a user by email.\n */\nexport async function getUserFromEmail(email: string): Promise<User | null> {\n const [user] = await db\n .select()\n .from(userTable)\n .where(eq(userTable.email, email));\n\n if (!user) return null;\n const { password, recovery_code, ...safeUser } = user;\n return safeUser as User;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"user.mjs","names":[],"sources":["../../../src/server/auth/user.ts"],"sourcesContent":["\"use server\";\n\nimport { and, eq } from \"drizzle-orm\";\nimport type { User } from \"../../core/auth/types.js\";\nimport { generateRandomRecoveryCode } from \"../../core/auth/utils/encode.js\";\nimport {\n decryptToString,\n encryptString,\n} from \"../../core/auth/utils/encryption.js\";\nimport { db } from \"../database/inject.js\";\nimport { rolesTable, usersToRolesTable, userTable } from \"../database/schema.js\";\nimport { sendRecoveryCode } from \"../emails/index.js\";\nimport { hashPassword } from \"./password.js\";\n\n/**\n * Validates the username input.\n */\nexport async function verifyUsernameInput(username: string): Promise<boolean> {\n return (\n username.length > 3 && username.length < 32 && username.trim() === username\n );\n}\n\n/**\n * Creates a new user with an initial recovery code and default 'user' role.\n */\nexport async function createUser(\n email: string,\n username: string,\n password: string,\n): Promise<User> {\n const passwordHash = await hashPassword(password);\n const recoveryCode = generateRandomRecoveryCode();\n const encryptedRecoveryCode = encryptString(recoveryCode);\n\n return await db.transaction(async (tx) => {\n const [row] = await tx\n .insert(userTable)\n .values({\n email: email,\n name: username,\n password: passwordHash,\n recovery_code: Buffer.from(encryptedRecoveryCode),\n })\n .returning();\n\n if (!row) {\n throw new Error(\"Failed to create user\");\n }\n\n // Assign default 'user' role\n let [role] = await tx\n .select()\n .from(rolesTable)\n .where(eq(rolesTable.name, \"user\"));\n\n if (!role) {\n [role] = await tx\n .insert(rolesTable)\n .values({ name: \"user\", description: \"Default user role\" })\n .returning();\n }\n\n await tx.insert(usersToRolesTable).values({\n userId: row.id,\n roleId: role.id,\n });\n\n await sendRecoveryCode(row.email, recoveryCode);\n\n return row;\n });\n}\n\n/**\n * Creates a new user from an OAuth provider.\n */\nexport async function createOAuthUser(\n email: string,\n name: string,\n image?: string,\n): Promise<User> {\n const recoveryCode = generateRandomRecoveryCode();\n const encryptedRecoveryCode = encryptString(recoveryCode);\n\n return await db.transaction(async (tx) => {\n const [row] = await tx\n .insert(userTable)\n .values({\n email: email,\n name: name,\n image: image,\n emailVerifiedAt: new Date(),\n recovery_code: Buffer.from(encryptedRecoveryCode),\n })\n .returning();\n\n // Assign default 'user' role\n let [role] = await tx\n .select()\n .from(rolesTable)\n .where(eq(rolesTable.name, \"user\"));\n\n if (!role) {\n [role] = await tx\n .insert(rolesTable)\n .values({ name: \"user\", description: \"Default user role\" })\n .returning();\n }\n\n await tx.insert(usersToRolesTable).values({\n userId: row.id,\n roleId: role.id,\n });\n\n return row;\n });\n}\n\n/**\n * Returns a user by ID.\n */\nexport async function getUserById(userId: string): Promise<User | null> {\n const [user] = await db\n .select()\n .from(userTable)\n .where(eq(userTable.id, userId));\n\n if (!user) return null;\n const { password, recovery_code, ...safeUser } = user;\n return safeUser as User;\n}\n\n/**\n * Decrypts and returns the user's recovery code.\n */\nexport async function getUserRecoverCode(userId: string): Promise<string> {\n const [user] = await db\n .select({\n recovery_code: userTable.recovery_code,\n })\n .from(userTable)\n .where(eq(userTable.id, userId));\n\n if (!user || !user.recovery_code) {\n throw new Error(\"Recovery code not found for user\");\n }\n\n return decryptToString(user.recovery_code);\n}\n\n/**\n * Generates and sets a new recovery code for the user.\n */\nexport async function resetUserRecoveryCode(userId: string): Promise<string> {\n const recoveryCode = generateRandomRecoveryCode();\n const encrypted = encryptString(recoveryCode);\n const [currentUser] = await db\n .update(userTable)\n .set({\n recovery_code: Buffer.from(encrypted),\n })\n .where(eq(userTable.id, userId))\n .returning();\n\n if (!currentUser) {\n throw new Error(\"User not found\");\n }\n\n await sendRecoveryCode(currentUser.email, recoveryCode);\n\n return recoveryCode;\n}\n\n/**\n * Updates the user's password.\n */\nexport async function updateUserPassword(\n userId: string,\n password: string,\n): Promise<void> {\n const passwordHash = await hashPassword(password);\n\n await db\n .update(userTable)\n .set({\n password: passwordHash,\n })\n .where(eq(userTable.id, userId));\n}\n\n/**\n * Updates the user's name.\n */\nexport async function updateUserName(\n userId: string,\n name: string,\n): Promise<void> {\n await db\n .update(userTable)\n .set({\n name: name,\n })\n .where(eq(userTable.id, userId));\n}\n/**\n * Updates the user's image.\n */\nexport async function updateUserAwatar(\n userId: string,\n image: string,\n): Promise<void> {\n await db\n .update(userTable)\n .set({\n image,\n })\n .where(eq(userTable.id, userId));\n}\n\n/**\n * Updates the user's email and marks it as verified.\n */\nexport async function updateUserEmailAndSetEmailAsVerified(\n userId: string,\n email: string,\n): Promise<void> {\n await db\n .update(userTable)\n .set({\n email: email,\n emailVerifiedAt: new Date(),\n })\n .where(eq(userTable.id, userId));\n}\n\n/**\n * Sets the user as email verified if the provided email matches.\n */\nexport async function setUserAsEmailVerifiedIfEmailMatches(\n userId: string,\n email: string,\n): Promise<boolean> {\n const result = await db\n .update(userTable)\n .set({\n emailVerifiedAt: new Date(),\n })\n .where(and(eq(userTable.id, userId), eq(userTable.email, email)))\n .returning({ id: userTable.id });\n\n return result.length > 0;\n}\n\n/**\n * Returns the user's password hash.\n */\nexport async function getUserPasswordHash(\n userId: string,\n): Promise<string | null> {\n const [user] = await db\n .select({\n password: userTable.password,\n })\n .from(userTable)\n .where(eq(userTable.id, userId));\n\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n return user.password;\n}\n\n/**\n * Returns a user by email.\n */\nexport async function getUserFromEmail(email: string): Promise<User | null> {\n const [user] = await db\n .select()\n .from(userTable)\n .where(eq(userTable.email, email));\n\n if (!user) return null;\n const { password, recovery_code, ...safeUser } = user;\n return safeUser as User;\n}\n"],"mappings":"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"}
@@ -1,24 +1 @@
1
-
2
- //#region src/server/database/inject.ts
3
- const globalForDb = globalThis;
4
- function injectDb(db) {
5
- if (globalForDb.__KRYO_DB__) return;
6
- console.log("[Kryo:Core] >>> DATABASE INJECTED <<<");
7
- globalForDb.__KRYO_DB__ = db;
8
- }
9
- /**
10
- * Shared 'db' proxy.
11
- * Resolves to globalThis.__KRYO_DB__ on every property access.
12
- * Safe to import statically at top-level.
13
- */
14
- const db = new Proxy({}, { get(_, prop) {
15
- if (prop === "then") return void 0;
16
- if (typeof prop === "symbol" || prop === "inspect" || prop === "toString") return globalForDb.__KRYO_DB__?.[prop];
17
- const database = globalForDb.__KRYO_DB__;
18
- if (!database) throw new Error(`[Kryo:Core] Database access error: tried to use "db.${String(prop)}" but database is not injected yet. Ensure you call "ensureSystemInitialized()" before using the database.`);
19
- return database[prop];
20
- } });
21
-
22
- //#endregion
23
- exports.db = db;
24
- exports.injectDb = injectDb;
1
+ const e=globalThis;function t(t){e.__KRYO_DB__||=(console.log(`[Kryo:Core] >>> DATABASE INJECTED <<<`),t)}const n=new Proxy({},{get(t,n){if(n===`then`)return;if(typeof n==`symbol`||n===`inspect`||n===`toString`)return e.__KRYO_DB__?.[n];let r=e.__KRYO_DB__;if(!r)throw Error(`[Kryo:Core] Database access error: tried to use "db.${String(n)}" but database is not injected yet. Ensure you call "ensureSystemInitialized()" before using the database.`);return r[n]}});exports.db=n,exports.injectDb=t;
@@ -1,23 +1,2 @@
1
- //#region src/server/database/inject.ts
2
- const globalForDb = globalThis;
3
- function injectDb(db) {
4
- if (globalForDb.__KRYO_DB__) return;
5
- console.log("[Kryo:Core] >>> DATABASE INJECTED <<<");
6
- globalForDb.__KRYO_DB__ = db;
7
- }
8
- /**
9
- * Shared 'db' proxy.
10
- * Resolves to globalThis.__KRYO_DB__ on every property access.
11
- * Safe to import statically at top-level.
12
- */
13
- const db = new Proxy({}, { get(_, prop) {
14
- if (prop === "then") return void 0;
15
- if (typeof prop === "symbol" || prop === "inspect" || prop === "toString") return globalForDb.__KRYO_DB__?.[prop];
16
- const database = globalForDb.__KRYO_DB__;
17
- if (!database) throw new Error(`[Kryo:Core] Database access error: tried to use "db.${String(prop)}" but database is not injected yet. Ensure you call "ensureSystemInitialized()" before using the database.`);
18
- return database[prop];
19
- } });
20
-
21
- //#endregion
22
- export { db, injectDb };
1
+ const e=globalThis;function t(t){e.__KRYO_DB__||=(console.log(`[Kryo:Core] >>> DATABASE INJECTED <<<`),t)}const n=new Proxy({},{get(t,n){if(n===`then`)return;if(typeof n==`symbol`||n===`inspect`||n===`toString`)return e.__KRYO_DB__?.[n];let r=e.__KRYO_DB__;if(!r)throw Error(`[Kryo:Core] Database access error: tried to use "db.${String(n)}" but database is not injected yet. Ensure you call "ensureSystemInitialized()" before using the database.`);return r[n]}});export{n as db,t as injectDb};
23
2
  //# sourceMappingURL=inject.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"inject.mjs","names":[],"sources":["../../../src/server/database/inject.ts"],"sourcesContent":["import type { NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport type * as schema from \"./schema\";\n\nexport type KryoDatabase = NodePgDatabase<typeof schema>;\n\n// Use globalThis to persist the DB across multiple bundles/instances\nconst globalForDb = globalThis as any;\n\nexport function injectDb(db: KryoDatabase) {\n if (globalForDb.__KRYO_DB__) return;\n console.log(\"[Kryo:Core] >>> DATABASE INJECTED <<<\");\n globalForDb.__KRYO_DB__ = db;\n}\n\n/**\n * Shared 'db' proxy.\n * Resolves to globalThis.__KRYO_DB__ on every property access.\n * Safe to import statically at top-level.\n */\nexport const db = new Proxy({} as KryoDatabase, {\n get(_, prop) {\n if (prop === \"then\") return undefined;\n\n // Internal Drizzle/Node/Debug checks\n if (typeof prop === \"symbol\" || prop === \"inspect\" || prop === \"toString\") {\n return (globalForDb.__KRYO_DB__ as any)?.[prop];\n }\n\n const database = globalForDb.__KRYO_DB__;\n\n if (!database) {\n throw new Error(\n `[Kryo:Core] Database access error: tried to use \"db.${String(prop)}\" but database is not injected yet. Ensure you call \"ensureSystemInitialized()\" before using the database.`,\n );\n }\n\n return (database as any)[prop];\n },\n});\n"],"mappings":";AAMA,MAAM,cAAc;AAEpB,SAAgB,SAAS,IAAkB;AACzC,KAAI,YAAY,YAAa;AAC7B,SAAQ,IAAI,wCAAwC;AACpD,aAAY,cAAc;;;;;;;AAQ5B,MAAa,KAAK,IAAI,MAAM,EAAE,EAAkB,EAC9C,IAAI,GAAG,MAAM;AACX,KAAI,SAAS,OAAQ,QAAO;AAG5B,KAAI,OAAO,SAAS,YAAY,SAAS,aAAa,SAAS,WAC7D,QAAQ,YAAY,cAAsB;CAG5C,MAAM,WAAW,YAAY;AAE7B,KAAI,CAAC,SACH,OAAM,IAAI,MACR,uDAAuD,OAAO,KAAK,CAAC,4GACrE;AAGH,QAAQ,SAAiB;GAE5B,CAAC"}
1
+ {"version":3,"file":"inject.mjs","names":[],"sources":["../../../src/server/database/inject.ts"],"sourcesContent":["import type { NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport type * as schema from \"./schema.js\";\n\nexport type KryoDatabase = NodePgDatabase<typeof schema>;\n\n// Use globalThis to persist the DB across multiple bundles/instances\nconst globalForDb = globalThis as any;\n\nexport function injectDb(db: KryoDatabase) {\n if (globalForDb.__KRYO_DB__) return;\n console.log(\"[Kryo:Core] >>> DATABASE INJECTED <<<\");\n globalForDb.__KRYO_DB__ = db;\n}\n\n/**\n * Shared 'db' proxy.\n * Resolves to globalThis.__KRYO_DB__ on every property access.\n * Safe to import statically at top-level.\n */\nexport const db = new Proxy({} as KryoDatabase, {\n get(_, prop) {\n if (prop === \"then\") return undefined;\n\n // Internal Drizzle/Node/Debug checks\n if (typeof prop === \"symbol\" || prop === \"inspect\" || prop === \"toString\") {\n return (globalForDb.__KRYO_DB__ as any)?.[prop];\n }\n\n const database = globalForDb.__KRYO_DB__;\n\n if (!database) {\n throw new Error(\n `[Kryo:Core] Database access error: tried to use \"db.${String(prop)}\" but database is not injected yet. Ensure you call \"ensureSystemInitialized()\" before using the database.`,\n );\n }\n\n return (database as any)[prop];\n },\n});\n"],"mappings":"AAMA,MAAM,EAAc,WAEpB,SAAgB,EAAS,EAAkB,CACrC,AAEJ,EAAY,eADZ,QAAQ,IAAI,wCAAwC,CAC1B,GAQ5B,MAAa,EAAK,IAAI,MAAM,EAAE,CAAkB,CAC9C,IAAI,EAAG,EAAM,CACX,GAAI,IAAS,OAAQ,OAGrB,GAAI,OAAO,GAAS,UAAY,IAAS,WAAa,IAAS,WAC7D,OAAQ,EAAY,cAAsB,GAG5C,IAAM,EAAW,EAAY,YAE7B,GAAI,CAAC,EACH,MAAU,MACR,uDAAuD,OAAO,EAAK,CAAC,4GACrE,CAGH,OAAQ,EAAiB,IAE5B,CAAC"}
@@ -1,163 +1 @@
1
- const require_runtime = require('../../_virtual/_rolldown/runtime.cjs');
2
- let drizzle_orm = require("drizzle-orm");
3
- let drizzle_orm_pg_core = require("drizzle-orm/pg-core");
4
-
5
- //#region src/server/database/schema.ts
6
- const userTable = (0, drizzle_orm_pg_core.pgTable)("users", {
7
- id: (0, drizzle_orm_pg_core.text)("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
8
- email: (0, drizzle_orm_pg_core.text)("email").notNull().unique(),
9
- name: (0, drizzle_orm_pg_core.text)("name").notNull(),
10
- password: (0, drizzle_orm_pg_core.text)("password"),
11
- image: (0, drizzle_orm_pg_core.text)("image"),
12
- recovery_code: (0, drizzle_orm_pg_core.bytea)("recovery_code").notNull(),
13
- emailVerifiedAt: (0, drizzle_orm_pg_core.timestamp)("email_verified_at", { precision: 3 }),
14
- createdAt: (0, drizzle_orm_pg_core.timestamp)("created_at", { precision: 3 }).notNull().defaultNow(),
15
- updatedAt: (0, drizzle_orm_pg_core.timestamp)("updated_at", { precision: 3 })
16
- });
17
- const rolesTable = (0, drizzle_orm_pg_core.pgTable)("roles", {
18
- id: (0, drizzle_orm_pg_core.text)("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
19
- name: (0, drizzle_orm_pg_core.text)("name").notNull().unique(),
20
- description: (0, drizzle_orm_pg_core.text)("description")
21
- });
22
- const permissionsTable = (0, drizzle_orm_pg_core.pgTable)("permissions", {
23
- id: (0, drizzle_orm_pg_core.text)("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
24
- name: (0, drizzle_orm_pg_core.text)("name").notNull().unique(),
25
- description: (0, drizzle_orm_pg_core.text)("description")
26
- });
27
- const usersToRolesTable = (0, drizzle_orm_pg_core.pgTable)("users_to_roles", {
28
- userId: (0, drizzle_orm_pg_core.text)("user_id").notNull().references(() => userTable.id, { onDelete: "cascade" }),
29
- roleId: (0, drizzle_orm_pg_core.text)("role_id").notNull().references(() => rolesTable.id, { onDelete: "cascade" })
30
- }, (t) => [{ pk: drizzle_orm.sql`PRIMARY KEY (${t.userId}, ${t.roleId})` }]);
31
- const usersToPermissionsTable = (0, drizzle_orm_pg_core.pgTable)("users_to_permissions", {
32
- userId: (0, drizzle_orm_pg_core.text)("user_id").notNull().references(() => userTable.id, { onDelete: "cascade" }),
33
- permissionId: (0, drizzle_orm_pg_core.text)("permission_id").notNull().references(() => permissionsTable.id, { onDelete: "cascade" })
34
- }, (t) => [{ pk: drizzle_orm.sql`PRIMARY KEY (${t.userId}, ${t.permissionId})` }]);
35
- const rolesToPermissionsTable = (0, drizzle_orm_pg_core.pgTable)("roles_to_permissions", {
36
- roleId: (0, drizzle_orm_pg_core.text)("role_id").notNull().references(() => rolesTable.id, { onDelete: "cascade" }),
37
- permissionId: (0, drizzle_orm_pg_core.text)("permission_id").notNull().references(() => permissionsTable.id, { onDelete: "cascade" })
38
- }, (t) => [{ pk: drizzle_orm.sql`PRIMARY KEY (${t.roleId}, ${t.permissionId})` }]);
39
- const sessionTable = (0, drizzle_orm_pg_core.pgTable)("sessions", {
40
- id: (0, drizzle_orm_pg_core.text)("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
41
- active_organization_id: (0, drizzle_orm_pg_core.text)("active_organization_id"),
42
- userId: (0, drizzle_orm_pg_core.text)("user_id").notNull().references(() => userTable.id, {
43
- onDelete: "cascade",
44
- onUpdate: "cascade"
45
- }),
46
- expiresAt: (0, drizzle_orm_pg_core.timestamp)("expires_at", { precision: 3 }).notNull(),
47
- createdAt: (0, drizzle_orm_pg_core.timestamp)("created_at", { precision: 3 }).notNull().defaultNow(),
48
- updatedAt: (0, drizzle_orm_pg_core.timestamp)("updated_at", { precision: 3 })
49
- });
50
- const emailVerificationTable = (0, drizzle_orm_pg_core.pgTable)("email_verification_requests", {
51
- id: (0, drizzle_orm_pg_core.text)("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
52
- email: (0, drizzle_orm_pg_core.text)("email").notNull(),
53
- code: (0, drizzle_orm_pg_core.text)("code").notNull(),
54
- userId: (0, drizzle_orm_pg_core.text)("user_id").notNull().references(() => userTable.id, {
55
- onDelete: "cascade",
56
- onUpdate: "cascade"
57
- }),
58
- expiresAt: (0, drizzle_orm_pg_core.timestamp)("expires_at", { precision: 3 }).notNull(),
59
- createdAt: (0, drizzle_orm_pg_core.timestamp)("created_at", { precision: 3 }).notNull().defaultNow(),
60
- updatedAt: (0, drizzle_orm_pg_core.timestamp)("updated_at", { precision: 3 })
61
- });
62
- const passwordResetSessionTable = (0, drizzle_orm_pg_core.pgTable)("password_reset_sessions", {
63
- id: (0, drizzle_orm_pg_core.text)("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
64
- email: (0, drizzle_orm_pg_core.text)("email").notNull(),
65
- code: (0, drizzle_orm_pg_core.text)("code").notNull(),
66
- emailVerified: (0, drizzle_orm_pg_core.boolean)("emailVerified").default(false),
67
- userId: (0, drizzle_orm_pg_core.text)("user_id").notNull().references(() => userTable.id, {
68
- onDelete: "cascade",
69
- onUpdate: "cascade"
70
- }),
71
- expiresAt: (0, drizzle_orm_pg_core.timestamp)("expires_at", { precision: 3 }).notNull(),
72
- createdAt: (0, drizzle_orm_pg_core.timestamp)("created_at", { precision: 3 }).notNull().defaultNow(),
73
- updatedAt: (0, drizzle_orm_pg_core.timestamp)("updated_at", { precision: 3 })
74
- });
75
- const notificationTable = (0, drizzle_orm_pg_core.pgTable)("notification", {
76
- id: (0, drizzle_orm_pg_core.text)("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
77
- title: (0, drizzle_orm_pg_core.text)("title").notNull(),
78
- content: (0, drizzle_orm_pg_core.text)("content"),
79
- target: (0, drizzle_orm_pg_core.text)("target"),
80
- type: (0, drizzle_orm_pg_core.text)("type"),
81
- isRead: (0, drizzle_orm_pg_core.boolean)("isRead").notNull(),
82
- resourceId: (0, drizzle_orm_pg_core.text)("resource_id"),
83
- resourceType: (0, drizzle_orm_pg_core.text)("resource_type"),
84
- userId: (0, drizzle_orm_pg_core.text)("user_id").notNull().references(() => userTable.id, {
85
- onDelete: "cascade",
86
- onUpdate: "cascade"
87
- }),
88
- createdAt: (0, drizzle_orm_pg_core.timestamp)("created_at", { precision: 3 }).notNull().defaultNow(),
89
- updatedAt: (0, drizzle_orm_pg_core.timestamp)("updated_at", { precision: 3 })
90
- });
91
- const systemModulesTable = (0, drizzle_orm_pg_core.pgTable)("system_modules", {
92
- id: (0, drizzle_orm_pg_core.text)("id").notNull().primaryKey(),
93
- enabled: (0, drizzle_orm_pg_core.boolean)("enabled").notNull().default(false),
94
- installed: (0, drizzle_orm_pg_core.boolean)("installed").notNull().default(false),
95
- deleted: (0, drizzle_orm_pg_core.boolean)("deleted").notNull().default(false),
96
- system: (0, drizzle_orm_pg_core.boolean)("system").notNull().default(false),
97
- config: (0, drizzle_orm_pg_core.text)("config"),
98
- lastStep: (0, drizzle_orm_pg_core.text)("last_step"),
99
- updatedAt: (0, drizzle_orm_pg_core.timestamp)("updated_at", { precision: 3 }).defaultNow()
100
- });
101
- const relations = (0, drizzle_orm.defineRelations)({
102
- user: userTable,
103
- emailVerification: emailVerificationTable,
104
- passwordResetSession: passwordResetSessionTable,
105
- session: sessionTable,
106
- notification: notificationTable,
107
- systemModulesTable
108
- }, (r) => ({
109
- user: {
110
- sessions: r.many.session({
111
- from: r.user.id,
112
- to: r.session.userId
113
- }),
114
- emailVerification: r.many.emailVerification({
115
- from: r.user.id,
116
- to: r.emailVerification.userId
117
- }),
118
- passwordResetSession: r.many.passwordResetSession({
119
- from: r.user.id,
120
- to: r.passwordResetSession.userId
121
- })
122
- },
123
- session: { user: r.one.user({
124
- from: r.session.userId,
125
- to: r.user.id
126
- }) },
127
- emailVerification: { user: r.one.user({
128
- from: r.emailVerification.userId,
129
- to: r.user.id
130
- }) },
131
- passwordResetSession: { user: r.one.user({
132
- from: r.passwordResetSession.userId,
133
- to: r.user.id
134
- }) }
135
- }));
136
- const coreSchema = {
137
- userTable,
138
- rolesTable,
139
- permissionsTable,
140
- usersToRolesTable,
141
- usersToPermissionsTable,
142
- rolesToPermissionsTable,
143
- sessionTable,
144
- emailVerificationTable,
145
- passwordResetSessionTable,
146
- notificationTable,
147
- systemModulesTable
148
- };
149
-
150
- //#endregion
151
- exports.coreSchema = coreSchema;
152
- exports.emailVerificationTable = emailVerificationTable;
153
- exports.notificationTable = notificationTable;
154
- exports.passwordResetSessionTable = passwordResetSessionTable;
155
- exports.permissionsTable = permissionsTable;
156
- exports.relations = relations;
157
- exports.rolesTable = rolesTable;
158
- exports.rolesToPermissionsTable = rolesToPermissionsTable;
159
- exports.sessionTable = sessionTable;
160
- exports.systemModulesTable = systemModulesTable;
161
- exports.userTable = userTable;
162
- exports.usersToPermissionsTable = usersToPermissionsTable;
163
- exports.usersToRolesTable = usersToRolesTable;
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);let e=require(`drizzle-orm`),t=require(`drizzle-orm/pg-core`);const n=(0,t.pgTable)(`users`,{id:(0,t.text)(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),email:(0,t.text)(`email`).notNull().unique(),name:(0,t.text)(`name`).notNull(),password:(0,t.text)(`password`),image:(0,t.text)(`image`),recovery_code:(0,t.bytea)(`recovery_code`).notNull(),emailVerifiedAt:(0,t.timestamp)(`email_verified_at`,{precision:3}),createdAt:(0,t.timestamp)(`created_at`,{precision:3}).notNull().defaultNow(),updatedAt:(0,t.timestamp)(`updated_at`,{precision:3})}),r=(0,t.pgTable)(`roles`,{id:(0,t.text)(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),name:(0,t.text)(`name`).notNull().unique(),description:(0,t.text)(`description`)}),i=(0,t.pgTable)(`permissions`,{id:(0,t.text)(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),name:(0,t.text)(`name`).notNull().unique(),description:(0,t.text)(`description`)}),a=(0,t.pgTable)(`users_to_roles`,{userId:(0,t.text)(`user_id`).notNull().references(()=>n.id,{onDelete:`cascade`}),roleId:(0,t.text)(`role_id`).notNull().references(()=>r.id,{onDelete:`cascade`})},t=>[{pk:e.sql`PRIMARY KEY (${t.userId}, ${t.roleId})`}]),o=(0,t.pgTable)(`users_to_permissions`,{userId:(0,t.text)(`user_id`).notNull().references(()=>n.id,{onDelete:`cascade`}),permissionId:(0,t.text)(`permission_id`).notNull().references(()=>i.id,{onDelete:`cascade`})},t=>[{pk:e.sql`PRIMARY KEY (${t.userId}, ${t.permissionId})`}]),s=(0,t.pgTable)(`roles_to_permissions`,{roleId:(0,t.text)(`role_id`).notNull().references(()=>r.id,{onDelete:`cascade`}),permissionId:(0,t.text)(`permission_id`).notNull().references(()=>i.id,{onDelete:`cascade`})},t=>[{pk:e.sql`PRIMARY KEY (${t.roleId}, ${t.permissionId})`}]),c=(0,t.pgTable)(`sessions`,{id:(0,t.text)(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),active_organization_id:(0,t.text)(`active_organization_id`),userId:(0,t.text)(`user_id`).notNull().references(()=>n.id,{onDelete:`cascade`,onUpdate:`cascade`}),expiresAt:(0,t.timestamp)(`expires_at`,{precision:3}).notNull(),createdAt:(0,t.timestamp)(`created_at`,{precision:3}).notNull().defaultNow(),updatedAt:(0,t.timestamp)(`updated_at`,{precision:3})}),l=(0,t.pgTable)(`email_verification_requests`,{id:(0,t.text)(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),email:(0,t.text)(`email`).notNull(),code:(0,t.text)(`code`).notNull(),userId:(0,t.text)(`user_id`).notNull().references(()=>n.id,{onDelete:`cascade`,onUpdate:`cascade`}),expiresAt:(0,t.timestamp)(`expires_at`,{precision:3}).notNull(),createdAt:(0,t.timestamp)(`created_at`,{precision:3}).notNull().defaultNow(),updatedAt:(0,t.timestamp)(`updated_at`,{precision:3})}),u=(0,t.pgTable)(`password_reset_sessions`,{id:(0,t.text)(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),email:(0,t.text)(`email`).notNull(),code:(0,t.text)(`code`).notNull(),emailVerified:(0,t.boolean)(`emailVerified`).default(!1),userId:(0,t.text)(`user_id`).notNull().references(()=>n.id,{onDelete:`cascade`,onUpdate:`cascade`}),expiresAt:(0,t.timestamp)(`expires_at`,{precision:3}).notNull(),createdAt:(0,t.timestamp)(`created_at`,{precision:3}).notNull().defaultNow(),updatedAt:(0,t.timestamp)(`updated_at`,{precision:3})}),d=(0,t.pgTable)(`notification`,{id:(0,t.text)(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),title:(0,t.text)(`title`).notNull(),content:(0,t.text)(`content`),target:(0,t.text)(`target`),type:(0,t.text)(`type`),isRead:(0,t.boolean)(`isRead`).notNull(),resourceId:(0,t.text)(`resource_id`),resourceType:(0,t.text)(`resource_type`),userId:(0,t.text)(`user_id`).notNull().references(()=>n.id,{onDelete:`cascade`,onUpdate:`cascade`}),createdAt:(0,t.timestamp)(`created_at`,{precision:3}).notNull().defaultNow(),updatedAt:(0,t.timestamp)(`updated_at`,{precision:3})}),f=(0,t.pgTable)(`system_modules`,{id:(0,t.text)(`id`).notNull().primaryKey(),enabled:(0,t.boolean)(`enabled`).notNull().default(!1),installed:(0,t.boolean)(`installed`).notNull().default(!1),deleted:(0,t.boolean)(`deleted`).notNull().default(!1),system:(0,t.boolean)(`system`).notNull().default(!1),config:(0,t.text)(`config`),lastStep:(0,t.text)(`last_step`),updatedAt:(0,t.timestamp)(`updated_at`,{precision:3}).defaultNow()}),p=(0,e.defineRelations)({user:n,emailVerification:l,passwordResetSession:u,session:c,notification:d,systemModulesTable:f},e=>({user:{sessions:e.many.session({from:e.user.id,to:e.session.userId}),emailVerification:e.many.emailVerification({from:e.user.id,to:e.emailVerification.userId}),passwordResetSession:e.many.passwordResetSession({from:e.user.id,to:e.passwordResetSession.userId})},session:{user:e.one.user({from:e.session.userId,to:e.user.id})},emailVerification:{user:e.one.user({from:e.emailVerification.userId,to:e.user.id})},passwordResetSession:{user:e.one.user({from:e.passwordResetSession.userId,to:e.user.id})}})),m={userTable:n,rolesTable:r,permissionsTable:i,usersToRolesTable:a,usersToPermissionsTable:o,rolesToPermissionsTable:s,sessionTable:c,emailVerificationTable:l,passwordResetSessionTable:u,notificationTable:d,systemModulesTable:f};exports.coreSchema=m,exports.emailVerificationTable=l,exports.notificationTable=d,exports.passwordResetSessionTable=u,exports.permissionsTable=i,exports.relations=p,exports.rolesTable=r,exports.rolesToPermissionsTable=s,exports.sessionTable=c,exports.systemModulesTable=f,exports.userTable=n,exports.usersToPermissionsTable=o,exports.usersToRolesTable=a;
@@ -1,151 +1,2 @@
1
- import { defineRelations, sql } from "drizzle-orm";
2
- import { boolean, bytea, pgTable, text, timestamp } from "drizzle-orm/pg-core";
3
-
4
- //#region src/server/database/schema.ts
5
- const userTable = pgTable("users", {
6
- id: text("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
7
- email: text("email").notNull().unique(),
8
- name: text("name").notNull(),
9
- password: text("password"),
10
- image: text("image"),
11
- recovery_code: bytea("recovery_code").notNull(),
12
- emailVerifiedAt: timestamp("email_verified_at", { precision: 3 }),
13
- createdAt: timestamp("created_at", { precision: 3 }).notNull().defaultNow(),
14
- updatedAt: timestamp("updated_at", { precision: 3 })
15
- });
16
- const rolesTable = pgTable("roles", {
17
- id: text("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
18
- name: text("name").notNull().unique(),
19
- description: text("description")
20
- });
21
- const permissionsTable = pgTable("permissions", {
22
- id: text("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
23
- name: text("name").notNull().unique(),
24
- description: text("description")
25
- });
26
- const usersToRolesTable = pgTable("users_to_roles", {
27
- userId: text("user_id").notNull().references(() => userTable.id, { onDelete: "cascade" }),
28
- roleId: text("role_id").notNull().references(() => rolesTable.id, { onDelete: "cascade" })
29
- }, (t) => [{ pk: sql`PRIMARY KEY (${t.userId}, ${t.roleId})` }]);
30
- const usersToPermissionsTable = pgTable("users_to_permissions", {
31
- userId: text("user_id").notNull().references(() => userTable.id, { onDelete: "cascade" }),
32
- permissionId: text("permission_id").notNull().references(() => permissionsTable.id, { onDelete: "cascade" })
33
- }, (t) => [{ pk: sql`PRIMARY KEY (${t.userId}, ${t.permissionId})` }]);
34
- const rolesToPermissionsTable = pgTable("roles_to_permissions", {
35
- roleId: text("role_id").notNull().references(() => rolesTable.id, { onDelete: "cascade" }),
36
- permissionId: text("permission_id").notNull().references(() => permissionsTable.id, { onDelete: "cascade" })
37
- }, (t) => [{ pk: sql`PRIMARY KEY (${t.roleId}, ${t.permissionId})` }]);
38
- const sessionTable = pgTable("sessions", {
39
- id: text("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
40
- active_organization_id: text("active_organization_id"),
41
- userId: text("user_id").notNull().references(() => userTable.id, {
42
- onDelete: "cascade",
43
- onUpdate: "cascade"
44
- }),
45
- expiresAt: timestamp("expires_at", { precision: 3 }).notNull(),
46
- createdAt: timestamp("created_at", { precision: 3 }).notNull().defaultNow(),
47
- updatedAt: timestamp("updated_at", { precision: 3 })
48
- });
49
- const emailVerificationTable = pgTable("email_verification_requests", {
50
- id: text("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
51
- email: text("email").notNull(),
52
- code: text("code").notNull(),
53
- userId: text("user_id").notNull().references(() => userTable.id, {
54
- onDelete: "cascade",
55
- onUpdate: "cascade"
56
- }),
57
- expiresAt: timestamp("expires_at", { precision: 3 }).notNull(),
58
- createdAt: timestamp("created_at", { precision: 3 }).notNull().defaultNow(),
59
- updatedAt: timestamp("updated_at", { precision: 3 })
60
- });
61
- const passwordResetSessionTable = pgTable("password_reset_sessions", {
62
- id: text("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
63
- email: text("email").notNull(),
64
- code: text("code").notNull(),
65
- emailVerified: boolean("emailVerified").default(false),
66
- userId: text("user_id").notNull().references(() => userTable.id, {
67
- onDelete: "cascade",
68
- onUpdate: "cascade"
69
- }),
70
- expiresAt: timestamp("expires_at", { precision: 3 }).notNull(),
71
- createdAt: timestamp("created_at", { precision: 3 }).notNull().defaultNow(),
72
- updatedAt: timestamp("updated_at", { precision: 3 })
73
- });
74
- const notificationTable = pgTable("notification", {
75
- id: text("id").$defaultFn(() => crypto.randomUUID()).notNull().primaryKey(),
76
- title: text("title").notNull(),
77
- content: text("content"),
78
- target: text("target"),
79
- type: text("type"),
80
- isRead: boolean("isRead").notNull(),
81
- resourceId: text("resource_id"),
82
- resourceType: text("resource_type"),
83
- userId: text("user_id").notNull().references(() => userTable.id, {
84
- onDelete: "cascade",
85
- onUpdate: "cascade"
86
- }),
87
- createdAt: timestamp("created_at", { precision: 3 }).notNull().defaultNow(),
88
- updatedAt: timestamp("updated_at", { precision: 3 })
89
- });
90
- const systemModulesTable = pgTable("system_modules", {
91
- id: text("id").notNull().primaryKey(),
92
- enabled: boolean("enabled").notNull().default(false),
93
- installed: boolean("installed").notNull().default(false),
94
- deleted: boolean("deleted").notNull().default(false),
95
- system: boolean("system").notNull().default(false),
96
- config: text("config"),
97
- lastStep: text("last_step"),
98
- updatedAt: timestamp("updated_at", { precision: 3 }).defaultNow()
99
- });
100
- const relations = defineRelations({
101
- user: userTable,
102
- emailVerification: emailVerificationTable,
103
- passwordResetSession: passwordResetSessionTable,
104
- session: sessionTable,
105
- notification: notificationTable,
106
- systemModulesTable
107
- }, (r) => ({
108
- user: {
109
- sessions: r.many.session({
110
- from: r.user.id,
111
- to: r.session.userId
112
- }),
113
- emailVerification: r.many.emailVerification({
114
- from: r.user.id,
115
- to: r.emailVerification.userId
116
- }),
117
- passwordResetSession: r.many.passwordResetSession({
118
- from: r.user.id,
119
- to: r.passwordResetSession.userId
120
- })
121
- },
122
- session: { user: r.one.user({
123
- from: r.session.userId,
124
- to: r.user.id
125
- }) },
126
- emailVerification: { user: r.one.user({
127
- from: r.emailVerification.userId,
128
- to: r.user.id
129
- }) },
130
- passwordResetSession: { user: r.one.user({
131
- from: r.passwordResetSession.userId,
132
- to: r.user.id
133
- }) }
134
- }));
135
- const coreSchema = {
136
- userTable,
137
- rolesTable,
138
- permissionsTable,
139
- usersToRolesTable,
140
- usersToPermissionsTable,
141
- rolesToPermissionsTable,
142
- sessionTable,
143
- emailVerificationTable,
144
- passwordResetSessionTable,
145
- notificationTable,
146
- systemModulesTable
147
- };
148
-
149
- //#endregion
150
- export { coreSchema, emailVerificationTable, notificationTable, passwordResetSessionTable, permissionsTable, relations, rolesTable, rolesToPermissionsTable, sessionTable, systemModulesTable, userTable, usersToPermissionsTable, usersToRolesTable };
1
+ import{defineRelations as e,sql as t}from"drizzle-orm";import{boolean as n,bytea as r,pgTable as i,text as a,timestamp as o}from"drizzle-orm/pg-core";const s=i(`users`,{id:a(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),email:a(`email`).notNull().unique(),name:a(`name`).notNull(),password:a(`password`),image:a(`image`),recovery_code:r(`recovery_code`).notNull(),emailVerifiedAt:o(`email_verified_at`,{precision:3}),createdAt:o(`created_at`,{precision:3}).notNull().defaultNow(),updatedAt:o(`updated_at`,{precision:3})}),c=i(`roles`,{id:a(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),name:a(`name`).notNull().unique(),description:a(`description`)}),l=i(`permissions`,{id:a(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),name:a(`name`).notNull().unique(),description:a(`description`)}),u=i(`users_to_roles`,{userId:a(`user_id`).notNull().references(()=>s.id,{onDelete:`cascade`}),roleId:a(`role_id`).notNull().references(()=>c.id,{onDelete:`cascade`})},e=>[{pk:t`PRIMARY KEY (${e.userId}, ${e.roleId})`}]),d=i(`users_to_permissions`,{userId:a(`user_id`).notNull().references(()=>s.id,{onDelete:`cascade`}),permissionId:a(`permission_id`).notNull().references(()=>l.id,{onDelete:`cascade`})},e=>[{pk:t`PRIMARY KEY (${e.userId}, ${e.permissionId})`}]),f=i(`roles_to_permissions`,{roleId:a(`role_id`).notNull().references(()=>c.id,{onDelete:`cascade`}),permissionId:a(`permission_id`).notNull().references(()=>l.id,{onDelete:`cascade`})},e=>[{pk:t`PRIMARY KEY (${e.roleId}, ${e.permissionId})`}]),p=i(`sessions`,{id:a(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),active_organization_id:a(`active_organization_id`),userId:a(`user_id`).notNull().references(()=>s.id,{onDelete:`cascade`,onUpdate:`cascade`}),expiresAt:o(`expires_at`,{precision:3}).notNull(),createdAt:o(`created_at`,{precision:3}).notNull().defaultNow(),updatedAt:o(`updated_at`,{precision:3})}),m=i(`email_verification_requests`,{id:a(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),email:a(`email`).notNull(),code:a(`code`).notNull(),userId:a(`user_id`).notNull().references(()=>s.id,{onDelete:`cascade`,onUpdate:`cascade`}),expiresAt:o(`expires_at`,{precision:3}).notNull(),createdAt:o(`created_at`,{precision:3}).notNull().defaultNow(),updatedAt:o(`updated_at`,{precision:3})}),h=i(`password_reset_sessions`,{id:a(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),email:a(`email`).notNull(),code:a(`code`).notNull(),emailVerified:n(`emailVerified`).default(!1),userId:a(`user_id`).notNull().references(()=>s.id,{onDelete:`cascade`,onUpdate:`cascade`}),expiresAt:o(`expires_at`,{precision:3}).notNull(),createdAt:o(`created_at`,{precision:3}).notNull().defaultNow(),updatedAt:o(`updated_at`,{precision:3})}),g=i(`notification`,{id:a(`id`).$defaultFn(()=>crypto.randomUUID()).notNull().primaryKey(),title:a(`title`).notNull(),content:a(`content`),target:a(`target`),type:a(`type`),isRead:n(`isRead`).notNull(),resourceId:a(`resource_id`),resourceType:a(`resource_type`),userId:a(`user_id`).notNull().references(()=>s.id,{onDelete:`cascade`,onUpdate:`cascade`}),createdAt:o(`created_at`,{precision:3}).notNull().defaultNow(),updatedAt:o(`updated_at`,{precision:3})}),_=i(`system_modules`,{id:a(`id`).notNull().primaryKey(),enabled:n(`enabled`).notNull().default(!1),installed:n(`installed`).notNull().default(!1),deleted:n(`deleted`).notNull().default(!1),system:n(`system`).notNull().default(!1),config:a(`config`),lastStep:a(`last_step`),updatedAt:o(`updated_at`,{precision:3}).defaultNow()}),v=e({user:s,emailVerification:m,passwordResetSession:h,session:p,notification:g,systemModulesTable:_},e=>({user:{sessions:e.many.session({from:e.user.id,to:e.session.userId}),emailVerification:e.many.emailVerification({from:e.user.id,to:e.emailVerification.userId}),passwordResetSession:e.many.passwordResetSession({from:e.user.id,to:e.passwordResetSession.userId})},session:{user:e.one.user({from:e.session.userId,to:e.user.id})},emailVerification:{user:e.one.user({from:e.emailVerification.userId,to:e.user.id})},passwordResetSession:{user:e.one.user({from:e.passwordResetSession.userId,to:e.user.id})}})),y={userTable:s,rolesTable:c,permissionsTable:l,usersToRolesTable:u,usersToPermissionsTable:d,rolesToPermissionsTable:f,sessionTable:p,emailVerificationTable:m,passwordResetSessionTable:h,notificationTable:g,systemModulesTable:_};export{y as coreSchema,m as emailVerificationTable,g as notificationTable,h as passwordResetSessionTable,l as permissionsTable,v as relations,c as rolesTable,f as rolesToPermissionsTable,p as sessionTable,_ as systemModulesTable,s as userTable,d as usersToPermissionsTable,u as usersToRolesTable};
151
2
  //# sourceMappingURL=schema.mjs.map