@skalfa/skalfa-api-core 1.0.2

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 (249) hide show
  1. package/.github/workflows/publish.yml +40 -0
  2. package/dist/auth/auth.d.ts +19 -0
  3. package/dist/auth/auth.js +227 -0
  4. package/dist/auth/auth.js.map +1 -0
  5. package/dist/auth/index.d.ts +1 -0
  6. package/dist/auth/index.js +2 -0
  7. package/dist/auth/index.js.map +1 -0
  8. package/dist/auth.util.d.ts +19 -0
  9. package/dist/auth.util.js +183 -0
  10. package/dist/auth.util.js.map +1 -0
  11. package/dist/commands/cli.d.ts +1 -0
  12. package/dist/commands/cli.js +78 -0
  13. package/dist/commands/cli.js.map +1 -0
  14. package/dist/commands/make/basic-controller.d.ts +2 -0
  15. package/dist/commands/make/basic-controller.js +40 -0
  16. package/dist/commands/make/basic-controller.js.map +1 -0
  17. package/dist/commands/make/basic-migration.d.ts +5 -0
  18. package/dist/commands/make/basic-migration.js +60 -0
  19. package/dist/commands/make/basic-migration.js.map +1 -0
  20. package/dist/commands/make/basic-model.d.ts +2 -0
  21. package/dist/commands/make/basic-model.js +25 -0
  22. package/dist/commands/make/basic-model.js.map +1 -0
  23. package/dist/commands/make/basic-seeder.d.ts +3 -0
  24. package/dist/commands/make/basic-seeder.js +32 -0
  25. package/dist/commands/make/basic-seeder.js.map +1 -0
  26. package/dist/commands/make/blueprint.d.ts +2 -0
  27. package/dist/commands/make/blueprint.js +29 -0
  28. package/dist/commands/make/blueprint.js.map +1 -0
  29. package/dist/commands/make/da-migration.d.ts +5 -0
  30. package/dist/commands/make/da-migration.js +60 -0
  31. package/dist/commands/make/da-migration.js.map +1 -0
  32. package/dist/commands/make/light-controller.d.ts +3 -0
  33. package/dist/commands/make/light-controller.js +54 -0
  34. package/dist/commands/make/light-controller.js.map +1 -0
  35. package/dist/commands/make/light-model.d.ts +3 -0
  36. package/dist/commands/make/light-model.js +50 -0
  37. package/dist/commands/make/light-model.js.map +1 -0
  38. package/dist/commands/make/mail.d.ts +2 -0
  39. package/dist/commands/make/mail.js +41 -0
  40. package/dist/commands/make/mail.js.map +1 -0
  41. package/dist/commands/make/notification.d.ts +2 -0
  42. package/dist/commands/make/notification.js +33 -0
  43. package/dist/commands/make/notification.js.map +1 -0
  44. package/dist/commands/make/queue.d.ts +2 -0
  45. package/dist/commands/make/queue.js +35 -0
  46. package/dist/commands/make/queue.js.map +1 -0
  47. package/dist/commands/runner/barrels.d.ts +3 -0
  48. package/dist/commands/runner/barrels.js +78 -0
  49. package/dist/commands/runner/barrels.js.map +1 -0
  50. package/dist/commands/runner/blueprint/controller-generation.d.ts +1 -0
  51. package/dist/commands/runner/blueprint/controller-generation.js +147 -0
  52. package/dist/commands/runner/blueprint/controller-generation.js.map +1 -0
  53. package/dist/commands/runner/blueprint/documentation-generation.d.ts +6 -0
  54. package/dist/commands/runner/blueprint/documentation-generation.js +337 -0
  55. package/dist/commands/runner/blueprint/documentation-generation.js.map +1 -0
  56. package/dist/commands/runner/blueprint/migration-generation.d.ts +1 -0
  57. package/dist/commands/runner/blueprint/migration-generation.js +120 -0
  58. package/dist/commands/runner/blueprint/migration-generation.js.map +1 -0
  59. package/dist/commands/runner/blueprint/model-generation.d.ts +1 -0
  60. package/dist/commands/runner/blueprint/model-generation.js +122 -0
  61. package/dist/commands/runner/blueprint/model-generation.js.map +1 -0
  62. package/dist/commands/runner/blueprint/runner.d.ts +23 -0
  63. package/dist/commands/runner/blueprint/runner.js +139 -0
  64. package/dist/commands/runner/blueprint/runner.js.map +1 -0
  65. package/dist/commands/runner/blueprint/seeder-generation.d.ts +1 -0
  66. package/dist/commands/runner/blueprint/seeder-generation.js +40 -0
  67. package/dist/commands/runner/blueprint/seeder-generation.js.map +1 -0
  68. package/dist/commands/runner/da-migration.d.ts +39 -0
  69. package/dist/commands/runner/da-migration.js +262 -0
  70. package/dist/commands/runner/da-migration.js.map +1 -0
  71. package/dist/commands/runner/migration.d.ts +11 -0
  72. package/dist/commands/runner/migration.js +188 -0
  73. package/dist/commands/runner/migration.js.map +1 -0
  74. package/dist/commands/runner/seeder.d.ts +3 -0
  75. package/dist/commands/runner/seeder.js +40 -0
  76. package/dist/commands/runner/seeder.js.map +1 -0
  77. package/dist/commands/stubs/index.d.ts +14 -0
  78. package/dist/commands/stubs/index.js +277 -0
  79. package/dist/commands/stubs/index.js.map +1 -0
  80. package/dist/context/context.d.ts +7 -0
  81. package/dist/context/context.js +11 -0
  82. package/dist/context/context.js.map +1 -0
  83. package/dist/context/index.d.ts +1 -0
  84. package/dist/context/index.js +2 -0
  85. package/dist/context/index.js.map +1 -0
  86. package/dist/context.util.d.ts +7 -0
  87. package/dist/context.util.js +11 -0
  88. package/dist/context.util.js.map +1 -0
  89. package/dist/controller/controller.d.ts +118 -0
  90. package/dist/controller/controller.js +147 -0
  91. package/dist/controller/controller.js.map +1 -0
  92. package/dist/controller/index.d.ts +1 -0
  93. package/dist/controller/index.js +2 -0
  94. package/dist/controller/index.js.map +1 -0
  95. package/dist/controller.util.d.ts +118 -0
  96. package/dist/controller.util.js +144 -0
  97. package/dist/controller.util.js.map +1 -0
  98. package/dist/conversion/conversion.d.ts +8 -0
  99. package/dist/conversion/conversion.js +52 -0
  100. package/dist/conversion/conversion.js.map +1 -0
  101. package/dist/conversion/index.d.ts +1 -0
  102. package/dist/conversion/index.js +2 -0
  103. package/dist/conversion/index.js.map +1 -0
  104. package/dist/conversion.util.d.ts +8 -0
  105. package/dist/conversion.util.js +52 -0
  106. package/dist/conversion.util.js.map +1 -0
  107. package/dist/db/db.d.ts +84 -0
  108. package/dist/db/db.js +177 -0
  109. package/dist/db/db.js.map +1 -0
  110. package/dist/db/index.d.ts +1 -0
  111. package/dist/db/index.js +2 -0
  112. package/dist/db/index.js.map +1 -0
  113. package/dist/db.util.d.ts +84 -0
  114. package/dist/db.util.js +177 -0
  115. package/dist/db.util.js.map +1 -0
  116. package/dist/index.d.ts +21 -0
  117. package/dist/index.js +14 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/logger/index.d.ts +1 -0
  120. package/dist/logger/index.js +2 -0
  121. package/dist/logger/index.js.map +1 -0
  122. package/dist/logger/logger.d.ts +30 -0
  123. package/dist/logger/logger.js +126 -0
  124. package/dist/logger/logger.js.map +1 -0
  125. package/dist/logger.util.d.ts +30 -0
  126. package/dist/logger.util.js +126 -0
  127. package/dist/logger.util.js.map +1 -0
  128. package/dist/mail/index.d.ts +1 -0
  129. package/dist/mail/index.js +2 -0
  130. package/dist/mail/index.js.map +1 -0
  131. package/dist/mail/mail.d.ts +21 -0
  132. package/dist/mail/mail.js +53 -0
  133. package/dist/mail/mail.js.map +1 -0
  134. package/dist/mail.util.d.ts +21 -0
  135. package/dist/mail.util.js +53 -0
  136. package/dist/mail.util.js.map +1 -0
  137. package/dist/middleware/index.d.ts +1 -0
  138. package/dist/middleware/index.js +2 -0
  139. package/dist/middleware/index.js.map +1 -0
  140. package/dist/middleware/middleware.d.ts +263 -0
  141. package/dist/middleware/middleware.js +233 -0
  142. package/dist/middleware/middleware.js.map +1 -0
  143. package/dist/middleware.util.d.ts +263 -0
  144. package/dist/middleware.util.js +233 -0
  145. package/dist/middleware.util.js.map +1 -0
  146. package/dist/model/index.d.ts +3 -0
  147. package/dist/model/index.js +4 -0
  148. package/dist/model/index.js.map +1 -0
  149. package/dist/model/model.d.ts +204 -0
  150. package/dist/model/model.js +1495 -0
  151. package/dist/model/model.js.map +1 -0
  152. package/dist/model.util.d.ts +204 -0
  153. package/dist/model.util.js +1495 -0
  154. package/dist/model.util.js.map +1 -0
  155. package/dist/permission/index.d.ts +1 -0
  156. package/dist/permission/index.js +2 -0
  157. package/dist/permission/index.js.map +1 -0
  158. package/dist/permission/permission.d.ts +38 -0
  159. package/dist/permission/permission.js +91 -0
  160. package/dist/permission/permission.js.map +1 -0
  161. package/dist/permission.util.d.ts +38 -0
  162. package/dist/permission.util.js +91 -0
  163. package/dist/permission.util.js.map +1 -0
  164. package/dist/registry/index.d.ts +1 -0
  165. package/dist/registry/index.js +2 -0
  166. package/dist/registry/index.js.map +1 -0
  167. package/dist/registry/registry.d.ts +28 -0
  168. package/dist/registry/registry.js +19 -0
  169. package/dist/registry/registry.js.map +1 -0
  170. package/dist/registry.util.d.ts +28 -0
  171. package/dist/registry.util.js +19 -0
  172. package/dist/registry.util.js.map +1 -0
  173. package/dist/route/index.d.ts +1 -0
  174. package/dist/route/index.js +2 -0
  175. package/dist/route/index.js.map +1 -0
  176. package/dist/route/route.d.ts +1 -0
  177. package/dist/route/route.js +12 -0
  178. package/dist/route/route.js.map +1 -0
  179. package/dist/route.util.d.ts +1 -0
  180. package/dist/route.util.js +12 -0
  181. package/dist/route.util.js.map +1 -0
  182. package/dist/storage/index.d.ts +1 -0
  183. package/dist/storage/index.js +2 -0
  184. package/dist/storage/index.js.map +1 -0
  185. package/dist/storage/storage.d.ts +56 -0
  186. package/dist/storage/storage.js +86 -0
  187. package/dist/storage/storage.js.map +1 -0
  188. package/dist/storage.util.d.ts +56 -0
  189. package/dist/storage.util.js +82 -0
  190. package/dist/storage.util.js.map +1 -0
  191. package/dist/validation/index.d.ts +1 -0
  192. package/dist/validation/index.js +2 -0
  193. package/dist/validation/index.js.map +1 -0
  194. package/dist/validation/validation.d.ts +7 -0
  195. package/dist/validation/validation.js +245 -0
  196. package/dist/validation/validation.js.map +1 -0
  197. package/dist/validation.util.d.ts +7 -0
  198. package/dist/validation.util.js +237 -0
  199. package/dist/validation.util.js.map +1 -0
  200. package/package.json +34 -0
  201. package/src/auth/auth.ts +282 -0
  202. package/src/auth/index.ts +1 -0
  203. package/src/commands/cli.ts +89 -0
  204. package/src/commands/make/basic-controller.ts +49 -0
  205. package/src/commands/make/basic-migration.ts +89 -0
  206. package/src/commands/make/basic-model.ts +32 -0
  207. package/src/commands/make/basic-seeder.ts +38 -0
  208. package/src/commands/make/blueprint.ts +36 -0
  209. package/src/commands/make/da-migration.ts +90 -0
  210. package/src/commands/make/light-controller.ts +67 -0
  211. package/src/commands/make/light-model.ts +61 -0
  212. package/src/commands/make/mail.ts +51 -0
  213. package/src/commands/make/notification.ts +43 -0
  214. package/src/commands/make/queue.ts +45 -0
  215. package/src/commands/runner/barrels.ts +85 -0
  216. package/src/commands/runner/blueprint/controller-generation.ts +194 -0
  217. package/src/commands/runner/blueprint/documentation-generation.ts +463 -0
  218. package/src/commands/runner/blueprint/migration-generation.ts +153 -0
  219. package/src/commands/runner/blueprint/model-generation.ts +149 -0
  220. package/src/commands/runner/blueprint/runner.ts +181 -0
  221. package/src/commands/runner/blueprint/seeder-generation.ts +55 -0
  222. package/src/commands/runner/da-migration.ts +333 -0
  223. package/src/commands/runner/migration.ts +245 -0
  224. package/src/commands/runner/seeder.ts +44 -0
  225. package/src/commands/stubs/index.ts +289 -0
  226. package/src/context/context.ts +17 -0
  227. package/src/context/index.ts +1 -0
  228. package/src/controller/controller.ts +240 -0
  229. package/src/controller/index.ts +1 -0
  230. package/src/conversion/conversion.ts +65 -0
  231. package/src/conversion/index.ts +1 -0
  232. package/src/index.ts +22 -0
  233. package/src/logger/index.ts +1 -0
  234. package/src/logger/logger.ts +177 -0
  235. package/src/mail/index.ts +1 -0
  236. package/src/mail/mail.ts +86 -0
  237. package/src/middleware/index.ts +1 -0
  238. package/src/middleware/middleware.ts +289 -0
  239. package/src/permission/index.ts +1 -0
  240. package/src/permission/permission.ts +136 -0
  241. package/src/registry/index.ts +1 -0
  242. package/src/registry/registry.ts +37 -0
  243. package/src/route/index.ts +1 -0
  244. package/src/route/route.ts +12 -0
  245. package/src/storage/index.ts +1 -0
  246. package/src/storage/storage.ts +107 -0
  247. package/src/validation/index.ts +1 -0
  248. package/src/validation/validation.ts +346 -0
  249. package/tsconfig.json +23 -0
@@ -0,0 +1,40 @@
1
+ name: Publish to npm
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - master
8
+
9
+ jobs:
10
+ publish:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - name: Checkout repository
14
+ uses: actions/checkout@v4
15
+
16
+ - name: Setup Node.js
17
+ uses: actions/setup-node@v4
18
+ with:
19
+ node-version: 20
20
+ registry-url: https://registry.npmjs.org/
21
+
22
+ - name: Setup Bun
23
+ uses: oven-sh/setup-bun@v1
24
+ with:
25
+ bun-version: latest
26
+
27
+ - name: Publish if version bumped
28
+ run: |
29
+ LOCAL_VER=$(node -p "require('./package.json').version")
30
+ NPM_VER=$(npm view @skalfa/skalfa-api-core version 2>/dev/null || echo "0.0.0")
31
+ if [ "$LOCAL_VER" != "$NPM_VER" ]; then
32
+ echo "Publishing @skalfa/skalfa-api-core $LOCAL_VER (Registry version: $NPM_VER)"
33
+ bun install
34
+ npm run build
35
+ npm publish --access public
36
+ else
37
+ echo "@skalfa/skalfa-api-core is up to date ($LOCAL_VER)"
38
+ fi
39
+ env:
40
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -0,0 +1,19 @@
1
+ export declare const auth: {
2
+ createAccessToken(userId: number, req: Request, permission?: boolean): Promise<{
3
+ token: string;
4
+ tokenId: any;
5
+ }>;
6
+ revokeAccessToken(id: number): Promise<number | undefined>;
7
+ verifyAccessToken(token: string, req?: Request): Promise<any>;
8
+ createUserMailToken(userId: number): Promise<{
9
+ token: string;
10
+ tokenId: any;
11
+ }>;
12
+ verifyUserMailToken(userId: number, token: string): Promise<boolean>;
13
+ listUserSessions(userId: number, currentTokenId?: number): Promise<any[]>;
14
+ revalidateUserPermissions: typeof revalidateUserPermissions;
15
+ revalidateUserPermissionsByRole: typeof revalidateUserPermissionsByRole;
16
+ };
17
+ declare function revalidateUserPermissions(userId: number): Promise<void>;
18
+ declare function revalidateUserPermissionsByRole(roleId: number): Promise<void>;
19
+ export {};
@@ -0,0 +1,227 @@
1
+ import crypto from 'crypto';
2
+ import bcrypt from "bcrypt";
3
+ import { db } from '@skalfa/skalfa-orm';
4
+ import { registry } from '@utils/registry';
5
+ // =====================================>
6
+ // ## Auth: User Access Token
7
+ // =====================================>
8
+ const TOKEN_PLAIN_LENGTH = 20;
9
+ const AUTH_PERMISSION = process.env.AUTH_CACHE === "true";
10
+ const AUTH_CACHE = process.env.AUTH_CACHE === "true";
11
+ const AUTH_CACHE_TTL = Number(process.env.AUTH_CACHE_TTL || 600);
12
+ export const auth = {
13
+ // =====================================>
14
+ // ## Auth: create access token with user id
15
+ // =====================================>
16
+ async createAccessToken(userId, req, permission = true) {
17
+ const plain = crypto.randomBytes(TOKEN_PLAIN_LENGTH).toString("hex");
18
+ const hash = await bcrypt.hash(plain, 10);
19
+ const agent = generateAgentId(req);
20
+ if (!db) {
21
+ // get user from db (fallback / stub for no ORM)
22
+ return {
23
+ token: `1|${plain}`,
24
+ tokenId: 1,
25
+ };
26
+ }
27
+ let permissions = [];
28
+ if (AUTH_PERMISSION && permission) {
29
+ permissions = await getUserPermissions(userId);
30
+ }
31
+ const [row] = await db("user_access_tokens").insert({
32
+ user_id: userId,
33
+ token: hash,
34
+ agent: agent,
35
+ permissions: JSON.stringify(permissions),
36
+ created_at: new Date(),
37
+ }).returning(["id"]);
38
+ return {
39
+ token: `${row.id}|${plain}`,
40
+ tokenId: row.id,
41
+ };
42
+ },
43
+ // =====================================>
44
+ // ## Auth: delete access token with user id
45
+ // =====================================>
46
+ async revokeAccessToken(id) {
47
+ if (!db) {
48
+ // delete user access token from db (stub for no ORM)
49
+ return;
50
+ }
51
+ return db.table('user_access_tokens').where("id", id).delete();
52
+ },
53
+ // =====================================>
54
+ // ## Auth: verify access token
55
+ // =====================================>
56
+ async verifyAccessToken(token, req) {
57
+ if (!token.includes("|"))
58
+ return null;
59
+ const [tokenId, plain] = token.split("|", 2);
60
+ const agent = req ? generateAgentId(req) : "";
61
+ const ip = req ? getRequestIp(req) : "";
62
+ const cacheKey = `auth:token:${tokenId}`;
63
+ if (AUTH_CACHE) {
64
+ const redis = registry.get('redis');
65
+ if (redis) {
66
+ const cached = await redis.get(cacheKey);
67
+ if (cached) {
68
+ const session = JSON.parse(cached);
69
+ if (session.agent !== agent)
70
+ return null;
71
+ return session;
72
+ }
73
+ }
74
+ }
75
+ if (!db) {
76
+ // get user and token from db (stub for no ORM)
77
+ const user = { id: 1, name: "Admin", email: "admin@example.com" };
78
+ const tokenRecord = { id: Number(tokenId), agent, permission: [] };
79
+ return { user, token: tokenRecord, permissions: [] };
80
+ }
81
+ const tokenRecord = await db("user_access_tokens").where("id", tokenId).first();
82
+ if (!tokenRecord)
83
+ return null;
84
+ if (tokenRecord.agent !== agent)
85
+ return null;
86
+ const valid = await bcrypt.compare(plain, tokenRecord.token);
87
+ if (!valid)
88
+ return null;
89
+ await db("user_access_tokens").where("id", tokenRecord.id).update({ last_used_at: new Date(), last_used_ip: ip });
90
+ const user = await db("users").where("id", tokenRecord.user_id).first();
91
+ if (AUTH_CACHE) {
92
+ const redis = registry.get('redis');
93
+ if (redis) {
94
+ await redis.setex(cacheKey, AUTH_CACHE_TTL, JSON.stringify({
95
+ user: user,
96
+ agent: tokenRecord.agent,
97
+ permissions: tokenRecord.permission,
98
+ }));
99
+ }
100
+ }
101
+ return { user, token: tokenRecord, permissions: tokenRecord.permission };
102
+ },
103
+ // =====================================>
104
+ // ## Auth: create user mail token
105
+ // =====================================>
106
+ async createUserMailToken(userId) {
107
+ const token = Math.floor(100000 + Math.random() * 900000).toString();
108
+ if (!db) {
109
+ // create user mail token in db (stub for no ORM)
110
+ return {
111
+ token: token,
112
+ tokenId: 1
113
+ };
114
+ }
115
+ const hash = crypto.createHash('sha256').update(token).digest('hex');
116
+ const trx = await db.transaction();
117
+ await trx.table('user_mail_tokens').insert({
118
+ user_id: userId,
119
+ token: hash,
120
+ created_at: new Date(),
121
+ });
122
+ const record = await trx.table('user_mail_tokens').orderBy('id', 'desc').first();
123
+ await trx.commit();
124
+ return {
125
+ token: token,
126
+ tokenId: record.id
127
+ };
128
+ },
129
+ // =====================================>
130
+ // ## Auth: Verify user mail token
131
+ // =====================================>
132
+ async verifyUserMailToken(userId, token) {
133
+ if (!db) {
134
+ // verify user mail token in db (stub for no ORM)
135
+ return true;
136
+ }
137
+ const hashedToken = crypto.createHash("sha256").update(token).digest("hex");
138
+ const record = await db.table("user_mail_tokens")
139
+ .where("user_id", userId)
140
+ .whereNull("used_at")
141
+ .orderBy("id", "desc")
142
+ .first();
143
+ if (!record)
144
+ return false;
145
+ if (record.token !== hashedToken)
146
+ return false;
147
+ const createdAt = new Date(record.created_at);
148
+ const now = new Date();
149
+ const diffMinutes = (now.getTime() - createdAt.getTime()) / (1000 * 60);
150
+ if (diffMinutes > 10)
151
+ return false;
152
+ return true;
153
+ },
154
+ // =====================================>
155
+ // ## Auth: list user sessions
156
+ // =====================================>
157
+ async listUserSessions(userId, currentTokenId) {
158
+ if (!db) {
159
+ // list user sessions from db (stub for no ORM)
160
+ return [];
161
+ }
162
+ const rows = await db("user_access_tokens").select(["id", "agent", "created_at", "last_used_at", "last_used_ip", "expired_at"]).where("user_id", userId).orderBy("last_used_at", "desc");
163
+ return rows.map((r) => ({
164
+ ...r,
165
+ is_active: r.revoked_at === null,
166
+ is_current: r.id === currentTokenId,
167
+ }));
168
+ },
169
+ // =====================================>
170
+ // ## Auth: revalidate user permission
171
+ // =====================================>
172
+ revalidateUserPermissions: revalidateUserPermissions,
173
+ revalidateUserPermissionsByRole: revalidateUserPermissionsByRole,
174
+ };
175
+ function generateAgentId(req) {
176
+ const ua = req.headers.get("user-agent") ?? "";
177
+ const acc = req.headers.get("accept") ?? "";
178
+ return crypto.createHash("sha256").update(ua + acc).digest("hex");
179
+ }
180
+ function getRequestIp(req) {
181
+ return (req.headers.get("x-forwarded-for")?.split(",")[0]?.trim() || req.headers.get("x-real-ip") || "unknown");
182
+ }
183
+ async function getUserPermissions(userId) {
184
+ if (!db) {
185
+ // get user permissions from db (stub for no ORM)
186
+ return [];
187
+ }
188
+ const roleIds = await db("user_roles").where("user_id", userId).pluck("role_id");
189
+ if (roleIds.length === 0)
190
+ return [];
191
+ const rows = await db("permissions").whereIn("role_id", roleIds).pluck("permissions");
192
+ return Array.from(new Set(rows.flatMap((p) => p ?? [])));
193
+ }
194
+ async function revalidateUserPermissions(userId) {
195
+ if (!db) {
196
+ // revalidate user permissions in db (stub for no ORM)
197
+ return;
198
+ }
199
+ const permissions = await getUserPermissions(userId);
200
+ const tokenIds = await db("user_access_tokens").where("user_id", userId).pluck("id");
201
+ if (tokenIds.length === 0)
202
+ return;
203
+ await db("user_access_tokens").whereIn("id", tokenIds).update({
204
+ permissions: JSON.stringify(permissions),
205
+ updated_at: new Date(),
206
+ });
207
+ if (AUTH_CACHE) {
208
+ const redis = registry.get('redis');
209
+ if (redis) {
210
+ await Promise.all(tokenIds.map((id) => redis.del(`auth:token:${id}`)));
211
+ }
212
+ }
213
+ }
214
+ async function revalidateUserPermissionsByRole(roleId) {
215
+ if (!db) {
216
+ // revalidate user permissions by role in db (stub for no ORM)
217
+ return;
218
+ }
219
+ const userIds = await db("user_roles").where("role_id", roleId).pluck("user_id");
220
+ const queue = registry.get('queue');
221
+ if (queue) {
222
+ for (const userId of userIds) {
223
+ await queue.add("auth:revalidate-permission", { userId });
224
+ }
225
+ }
226
+ }
227
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/auth/auth.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE1C,yCAAyC;AACzC,6BAA6B;AAC7B,yCAAyC;AACzC,MAAM,kBAAkB,GAAK,EAAE,CAAA;AAC/B,MAAM,eAAe,GAAQ,OAAO,CAAC,GAAG,CAAC,UAAU,KAAO,MAAM,CAAA;AAChE,MAAM,UAAU,GAAa,OAAO,CAAC,GAAG,CAAC,UAAU,KAAO,MAAM,CAAA;AAChE,MAAM,cAAc,GAAS,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,CAAA;AAEtE,MAAM,CAAC,MAAM,IAAI,GAAG;IAElB,yCAAyC;IACzC,4CAA4C;IAC5C,yCAAyC;IACzC,KAAK,CAAC,iBAAiB,CAAC,MAAc,EAAE,GAAY,EAAE,aAAsB,IAAI;QAC9E,MAAM,KAAK,GAAK,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACtE,MAAM,IAAI,GAAM,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAC5C,MAAM,KAAK,GAAK,eAAe,CAAC,GAAG,CAAC,CAAA;QAEpC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,gDAAgD;YAChD,OAAO;gBACL,KAAK,EAAE,KAAK,KAAK,EAAE;gBACnB,OAAO,EAAE,CAAC;aACX,CAAA;QACH,CAAC;QAED,IAAI,WAAW,GAAa,EAAE,CAAA;QAC9B,IAAI,eAAe,IAAI,UAAU,EAAE,CAAC;YAClC,WAAW,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAA;QAChD,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC;YAClD,OAAO,EAAS,MAAM;YACtB,KAAK,EAAW,IAAI;YACpB,KAAK,EAAW,KAAK;YACrB,WAAW,EAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YAC3C,UAAU,EAAM,IAAI,IAAI,EAAE;SAC3B,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAEpB,OAAO;YACL,KAAK,EAAO,GAAG,GAAG,CAAC,EAAE,IAAI,KAAK,EAAE;YAChC,OAAO,EAAK,GAAG,CAAC,EAAE;SACnB,CAAA;IACH,CAAC;IAED,yCAAyC;IACzC,4CAA4C;IAC5C,yCAAyC;IACzC,KAAK,CAAC,iBAAiB,CAAC,EAAU;QAChC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,qDAAqD;YACrD,OAAO;QACT,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;IAChE,CAAC;IAED,yCAAyC;IACzC,+BAA+B;IAC/B,yCAAyC;IACzC,KAAK,CAAC,iBAAiB,CAAC,KAAa,EAAE,GAAa;QAClD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QAErC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAK,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAgB,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC1D,MAAM,EAAE,GAAmB,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAEvD,MAAM,QAAQ,GAAG,cAAc,OAAO,EAAE,CAAA;QAExC,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACnC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBACxC,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;oBAClC,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK;wBAAE,OAAO,IAAI,CAAA;oBACxC,OAAO,OAAO,CAAA;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,+CAA+C;YAC/C,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAA;YACjE,MAAM,WAAW,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CAAA;YAClE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;QACtD,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAA;QAE/E,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAA;QAC7B,IAAI,WAAW,CAAC,KAAK,KAAK,KAAK;YAAE,OAAO,IAAI,CAAA;QAE5C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;QAC5D,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QAEvB,MAAM,EAAE,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAA;QAEjH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAA;QAEvE,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACnC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,KAAK,CAAC,KAAK,CACf,QAAQ,EACR,cAAc,EACd,IAAI,CAAC,SAAS,CAAC;oBACb,IAAI,EAAY,IAAI;oBACpB,KAAK,EAAW,WAAW,CAAC,KAAK;oBACjC,WAAW,EAAK,WAAW,CAAC,UAAU;iBACvC,CAAC,CACH,CAAA;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,UAAU,EAAE,CAAA;IAC1E,CAAC;IAED,yCAAyC;IACzC,kCAAkC;IAClC,yCAAyC;IACzC,KAAK,CAAC,mBAAmB,CAAC,MAAc;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;QAEpE,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,iDAAiD;YACjD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,CAAC;aACX,CAAA;QACH,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACpE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,WAAW,EAAE,CAAA;QAElC,MAAM,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC;YACzC,OAAO,EAAO,MAAM;YACpB,KAAK,EAAS,IAAI;YAClB,UAAU,EAAI,IAAI,IAAI,EAAE;SACzB,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,CAAA;QAEhF,MAAM,GAAG,CAAC,MAAM,EAAE,CAAA;QAElB,OAAO;YACL,KAAK,EAAM,KAAK;YAChB,OAAO,EAAI,MAAM,CAAC,EAAE;SACrB,CAAA;IACH,CAAC;IAED,yCAAyC;IACzC,kCAAkC;IAClC,yCAAyC;IACzC,KAAK,CAAC,mBAAmB,CAAC,MAAc,EAAE,KAAa;QACrD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,iDAAiD;YACjD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE5E,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC;aAC9C,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC;aACxB,SAAS,CAAC,SAAS,CAAC;aACpB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;aACrB,KAAK,EAAE,CAAC;QAEX,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QAEzB,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QAE/C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAExE,IAAI,WAAW,GAAG,EAAE;YAAE,OAAO,KAAK,CAAC;QAEnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yCAAyC;IACzC,8BAA8B;IAC9B,yCAAyC;IACzC,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,cAAuB;QAC5D,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,+CAA+C;YAC/C,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;QAEvL,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;YAC3B,GAAG,CAAC;YACJ,SAAS,EAAI,CAAC,CAAC,UAAU,KAAO,IAAI;YACpC,UAAU,EAAG,CAAC,CAAC,EAAE,KAAe,cAAc;SAC/C,CAAC,CAAC,CAAA;IACL,CAAC;IAED,yCAAyC;IACzC,sCAAsC;IACtC,yCAAyC;IACzC,yBAAyB,EAAE,yBAAyB;IACpD,+BAA+B,EAAE,+BAA+B;CACjE,CAAA;AAED,SAAS,eAAe,CAAC,GAAY;IACnC,MAAM,EAAE,GAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAM,EAAE,CAAA;IACnD,MAAM,GAAG,GAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAU,EAAE,CAAA;IAEnD,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACnE,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IAChC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,CAAA;AACjH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,MAAc;IAC9C,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,iDAAiD;QACjD,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAEhF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEnC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;IAErF,OAAO,KAAK,CAAC,IAAI,CACf,IAAI,GAAG,CACL,IAAI,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAClC,CACF,CAAA;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,MAAc;IACrD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,sDAAsD;QACtD,OAAM;IACR,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAEpD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAEpF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAEjC,MAAM,EAAE,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC;QAC5D,WAAW,EAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;QAC3C,UAAU,EAAM,IAAI,IAAI,EAAE;KAC3B,CAAC,CAAA;IAEF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CACzD,CAAA;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,+BAA+B,CAAC,MAAc;IAC3D,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,8DAA8D;QAC9D,OAAM;IACR,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAEhF,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACnC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,CAAC,GAAG,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export * from "./auth";
@@ -0,0 +1,2 @@
1
+ export * from "./auth";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare const auth: {
2
+ createAccessToken(userId: number, req: Request, permission?: boolean): Promise<{
3
+ token: string;
4
+ tokenId: any;
5
+ }>;
6
+ revokeAccessToken(id: number): Promise<number>;
7
+ verifyAccessToken(token: string, req?: Request): Promise<any>;
8
+ createUserMailToken(userId: number): Promise<{
9
+ token: string;
10
+ tokenId: any;
11
+ }>;
12
+ verifyUserMailToken(userId: number, token: string): Promise<boolean>;
13
+ listUserSessions(userId: number, currentTokenId?: number): Promise<any[]>;
14
+ revalidateUserPermissions: typeof revalidateUserPermissions;
15
+ revalidateUserPermissionsByRole: typeof revalidateUserPermissionsByRole;
16
+ };
17
+ declare function revalidateUserPermissions(userId: number): Promise<void>;
18
+ declare function revalidateUserPermissionsByRole(roleId: number): Promise<void>;
19
+ export {};
@@ -0,0 +1,183 @@
1
+ import crypto from 'crypto';
2
+ import bcrypt from "bcrypt";
3
+ import { db } from '@utils';
4
+ import { registry } from './registry.util';
5
+ // =====================================>
6
+ // ## Auth: User Access Token
7
+ // =====================================>
8
+ const TOKEN_PLAIN_LENGTH = 20;
9
+ const AUTH_PERMISSION = process.env.AUTH_CACHE === "true";
10
+ const AUTH_CACHE = process.env.AUTH_CACHE === "true";
11
+ const AUTH_CACHE_TTL = Number(process.env.AUTH_CACHE_TTL || 600);
12
+ export const auth = {
13
+ // =====================================>
14
+ // ## Auth: create access token with user id
15
+ // =====================================>
16
+ async createAccessToken(userId, req, permission = true) {
17
+ const plain = crypto.randomBytes(TOKEN_PLAIN_LENGTH).toString("hex");
18
+ const hash = await bcrypt.hash(plain, 10);
19
+ const agent = generateAgentId(req);
20
+ let permissions = [];
21
+ if (AUTH_PERMISSION && permission) {
22
+ permissions = await getUserPermissions(userId);
23
+ }
24
+ const [row] = await db("user_access_tokens").insert({
25
+ user_id: userId,
26
+ token: hash,
27
+ agent: agent,
28
+ permissions: JSON.stringify(permissions),
29
+ created_at: new Date(),
30
+ }).returning(["id"]);
31
+ return {
32
+ token: `${row.id}|${plain}`,
33
+ tokenId: row.id,
34
+ };
35
+ },
36
+ // =====================================>
37
+ // ## Auth: delete access token with user id
38
+ // =====================================>
39
+ async revokeAccessToken(id) {
40
+ return db.table('user_access_tokens').where("id", id).delete();
41
+ },
42
+ // =====================================>
43
+ // ## Auth: verify access token
44
+ // =====================================>
45
+ async verifyAccessToken(token, req) {
46
+ if (!token.includes("|"))
47
+ return null;
48
+ const [tokenId, plain] = token.split("|", 2);
49
+ const agent = req ? generateAgentId(req) : "";
50
+ const ip = req ? getRequestIp(req) : "";
51
+ const cacheKey = `auth:token:${tokenId}`;
52
+ if (AUTH_CACHE) {
53
+ const redis = registry.get('redis');
54
+ if (redis) {
55
+ const cached = await redis.get(cacheKey);
56
+ if (cached) {
57
+ const session = JSON.parse(cached);
58
+ if (session.agent !== agent)
59
+ return null;
60
+ return session;
61
+ }
62
+ }
63
+ }
64
+ const tokenRecord = await db("user_access_tokens").where("id", tokenId).first();
65
+ if (!tokenRecord)
66
+ return null;
67
+ if (tokenRecord.agent !== agent)
68
+ return null;
69
+ const valid = await bcrypt.compare(plain, tokenRecord.token);
70
+ if (!valid)
71
+ return null;
72
+ await db("user_access_tokens").where("id", tokenRecord.id).update({ last_used_at: new Date(), last_used_ip: ip });
73
+ const user = await db("users").where("id", tokenRecord.user_id).first();
74
+ if (AUTH_CACHE) {
75
+ const redis = registry.get('redis');
76
+ if (redis) {
77
+ await redis.setex(cacheKey, AUTH_CACHE_TTL, JSON.stringify({
78
+ user: user,
79
+ agent: tokenRecord.agent,
80
+ permissions: tokenRecord.permission,
81
+ }));
82
+ }
83
+ }
84
+ return { user, token: tokenRecord, permissions: tokenRecord.permission };
85
+ },
86
+ // =====================================>
87
+ // ## Auth: create user mail token
88
+ // =====================================>
89
+ async createUserMailToken(userId) {
90
+ const token = Math.floor(100000 + Math.random() * 900000).toString();
91
+ const hash = crypto.createHash('sha256').update(token).digest('hex');
92
+ const trx = await db.transaction();
93
+ await trx.table('user_mail_tokens').insert({
94
+ user_id: userId,
95
+ token: hash,
96
+ created_at: new Date(),
97
+ });
98
+ const record = await trx.table('user_mail_tokens').orderBy('id', 'desc').first();
99
+ await trx.commit();
100
+ return {
101
+ token: token,
102
+ tokenId: record.id
103
+ };
104
+ },
105
+ // =====================================>
106
+ // ## Auth: Verify user mail token
107
+ // =====================================>
108
+ async verifyUserMailToken(userId, token) {
109
+ const hashedToken = crypto.createHash("sha256").update(token).digest("hex");
110
+ const record = await db.table("user_mail_tokens")
111
+ .where("user_id", userId)
112
+ .whereNull("used_at")
113
+ .orderBy("id", "desc")
114
+ .first();
115
+ if (!record)
116
+ return false;
117
+ if (record.token !== hashedToken)
118
+ return false;
119
+ const createdAt = new Date(record.created_at);
120
+ const now = new Date();
121
+ const diffMinutes = (now.getTime() - createdAt.getTime()) / (1000 * 60);
122
+ if (diffMinutes > 10)
123
+ return false;
124
+ return true;
125
+ },
126
+ // =====================================>
127
+ // ## Auth: list user sessions
128
+ // =====================================>
129
+ async listUserSessions(userId, currentTokenId) {
130
+ const rows = await db("user_access_tokens").select(["id", "agent", "created_at", "last_used_at", "last_used_ip", "expired_at"]).where("user_id", userId).orderBy("last_used_at", "desc");
131
+ return rows.map(r => ({
132
+ ...r,
133
+ is_active: r.revoked_at === null,
134
+ is_current: r.id === currentTokenId,
135
+ }));
136
+ },
137
+ // =====================================>
138
+ // ## Auth: revalidate user permission
139
+ // =====================================>
140
+ revalidateUserPermissions: revalidateUserPermissions,
141
+ revalidateUserPermissionsByRole: revalidateUserPermissionsByRole,
142
+ };
143
+ function generateAgentId(req) {
144
+ const ua = req.headers.get("user-agent") ?? "";
145
+ const acc = req.headers.get("accept") ?? "";
146
+ return crypto.createHash("sha256").update(ua + acc).digest("hex");
147
+ }
148
+ function getRequestIp(req) {
149
+ return (req.headers.get("x-forwarded-for")?.split(",")[0]?.trim() || req.headers.get("x-real-ip") || "unknown");
150
+ }
151
+ async function getUserPermissions(userId) {
152
+ const roleIds = await db("user_roles").where("user_id", userId).pluck("role_id");
153
+ if (roleIds.length === 0)
154
+ return [];
155
+ const rows = await db("permissions").whereIn("role_id", roleIds).pluck("permissions");
156
+ return Array.from(new Set(rows.flatMap(p => p ?? [])));
157
+ }
158
+ async function revalidateUserPermissions(userId) {
159
+ const permissions = await getUserPermissions(userId);
160
+ const tokenIds = await db("user_access_tokens").where("user_id", userId).pluck("id");
161
+ if (tokenIds.length === 0)
162
+ return;
163
+ await db("user_access_tokens").whereIn("id", tokenIds).update({
164
+ permissions: JSON.stringify(permissions),
165
+ updated_at: new Date(),
166
+ });
167
+ if (AUTH_CACHE) {
168
+ const redis = registry.get('redis');
169
+ if (redis) {
170
+ await Promise.all(tokenIds.map(id => redis.del(`auth:token:${id}`)));
171
+ }
172
+ }
173
+ }
174
+ async function revalidateUserPermissionsByRole(roleId) {
175
+ const userIds = await db("user_roles").where("role_id", roleId).pluck("user_id");
176
+ const queue = registry.get('queue');
177
+ if (queue) {
178
+ for (const userId of userIds) {
179
+ await queue.add("auth:revalidate-permission", { userId });
180
+ }
181
+ }
182
+ }
183
+ //# sourceMappingURL=auth.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.util.js","sourceRoot":"","sources":["../src/auth.util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runCli(): void;
@@ -0,0 +1,78 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { Command } from "commander";
4
+ // Basic commands (always available)
5
+ import { makeControllerCommand } from "./make/basic-controller";
6
+ import { makeLightControllerCommand } from "./make/light-controller";
7
+ import { barrelsCommand, watchBarrelsCommand } from "./runner/barrels";
8
+ // ORM commands (optional)
9
+ import { makeModelCommand } from "./make/basic-model";
10
+ import { makeSeederCommand } from "./make/basic-seeder";
11
+ import { makeMigrationCommand } from "./make/basic-migration";
12
+ import { makeLightModelCommand } from "./make/light-model";
13
+ import { makeBlueprintCommand } from "./make/blueprint";
14
+ import { migrateCommand, migrateFreshCommand } from "./runner/migration";
15
+ import { seederCommand } from "./runner/seeder";
16
+ import { blueprintCommand } from "./runner/blueprint/runner";
17
+ // Extension-specific commands
18
+ import { makeQueueCommand } from "./make/queue";
19
+ import { makeMailCommand } from "./make/mail";
20
+ import { makeNotificationCommand } from "./make/notification";
21
+ import { makeDaMigrationCommand } from "./make/da-migration";
22
+ import { daMigrateCommand, daMigrateFreshCommand } from "./runner/da-migration";
23
+ export function runCli() {
24
+ // Read package.json to dynamically detect installed extensions
25
+ let dependencies = {};
26
+ try {
27
+ const pkgPath = path.join(process.cwd(), "package.json");
28
+ if (fs.existsSync(pkgPath)) {
29
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
30
+ dependencies = pkg.dependencies || {};
31
+ }
32
+ }
33
+ catch { }
34
+ const hasOrm = !!dependencies["@skalfa/skalfa-orm"];
35
+ const hasMail = !!dependencies["@skalfa/mail"] || !!dependencies["skalfa-mail"];
36
+ const hasNotification = !!dependencies["@skalfa/notification"] || !!dependencies["skalfa-notification"];
37
+ const hasQueue = !!dependencies["@skalfa/queue"] || !!dependencies["@skalfa/redis"] || !!dependencies["skalfa-queue"] || !!dependencies["skalfa-redis"];
38
+ const hasDa = !!dependencies["@skalfa/da"] || !!dependencies["skalfa-da"] || !!dependencies["@clickhouse/client"];
39
+ const program = new Command();
40
+ program.name("skalfa").description("Skalfa Local CLI").version("1.0.0");
41
+ // 1. Add Core / Basic commands
42
+ program.addCommand(makeControllerCommand);
43
+ program.addCommand(makeLightControllerCommand);
44
+ program.addCommand(barrelsCommand);
45
+ program.addCommand(watchBarrelsCommand);
46
+ // 2. Add ORM commands if installed
47
+ if (hasOrm) {
48
+ program.addCommand(makeModelCommand);
49
+ program.addCommand(makeMigrationCommand);
50
+ program.addCommand(makeSeederCommand);
51
+ program.addCommand(makeLightModelCommand);
52
+ program.addCommand(makeBlueprintCommand);
53
+ program.addCommand(migrateCommand);
54
+ program.addCommand(migrateFreshCommand);
55
+ program.addCommand(seederCommand);
56
+ program.addCommand(blueprintCommand);
57
+ }
58
+ // 3. Add Mail commands if installed
59
+ if (hasMail) {
60
+ program.addCommand(makeMailCommand);
61
+ }
62
+ // 4. Add Notification commands if installed
63
+ if (hasNotification) {
64
+ program.addCommand(makeNotificationCommand);
65
+ }
66
+ // 5. Add Queue commands if installed
67
+ if (hasQueue) {
68
+ program.addCommand(makeQueueCommand);
69
+ }
70
+ // 6. Add Data Analytics / OLAP commands if installed
71
+ if (hasDa) {
72
+ program.addCommand(makeDaMigrationCommand);
73
+ program.addCommand(daMigrateCommand);
74
+ program.addCommand(daMigrateFreshCommand);
75
+ }
76
+ program.parse(process.argv);
77
+ }
78
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/commands/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const makeControllerCommand: Command;