@kyro-cms/core 0.10.4 → 0.10.6

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 (301) hide show
  1. package/dist/api-handler-graphql.cjs +1 -49
  2. package/dist/api-handler-graphql.js +1 -46
  3. package/dist/api-handler-trpc.cjs +1 -38
  4. package/dist/api-handler-trpc.js +1 -36
  5. package/dist/api-handler.cjs +1 -44
  6. package/dist/api-handler.js +1 -27
  7. package/dist/bootstrap-HIAV5ZFT.cjs +1 -0
  8. package/dist/bootstrap-P7QPQYQP.js +1 -0
  9. package/dist/chunk-2BTRHVT3.cjs +20 -0
  10. package/dist/chunk-2W4FK6CJ.js +122 -0
  11. package/dist/chunk-4ORJMSJU.cjs +1 -0
  12. package/dist/chunk-65G73T7Z.cjs +2 -0
  13. package/dist/chunk-7N6NKCRT.js +1 -0
  14. package/dist/chunk-7WOX27LK.js +259 -0
  15. package/dist/chunk-AE6GXUT7.js +1 -0
  16. package/dist/chunk-AJAZ7D3W.cjs +259 -0
  17. package/dist/chunk-ATLSIYRH.cjs +1 -0
  18. package/dist/chunk-AU6IWTBO.js +2 -0
  19. package/dist/chunk-CDL7ARXT.js +133 -0
  20. package/dist/chunk-CUTFS6N2.cjs +1 -0
  21. package/dist/chunk-CVVW4LXZ.cjs +1 -0
  22. package/dist/chunk-DGJUBN33.js +1 -0
  23. package/dist/chunk-DV4LFLPL.cjs +1 -0
  24. package/dist/chunk-EEWCANFX.js +1 -0
  25. package/dist/chunk-ELICKLFM.cjs +3 -0
  26. package/dist/chunk-EQUQJBPP.cjs +2 -0
  27. package/dist/chunk-ET6NN2V2.cjs +122 -0
  28. package/dist/chunk-F7P36SLX.cjs +74 -0
  29. package/dist/chunk-F7SR5IDT.cjs +1 -0
  30. package/dist/chunk-FO3HLBC7.js +1 -0
  31. package/dist/chunk-FS7GL2BR.js +73 -0
  32. package/dist/chunk-G6A7OSIG.js +2 -0
  33. package/dist/chunk-GFU7AOI3.cjs +1 -0
  34. package/dist/chunk-GYQMNXXW.cjs +114 -0
  35. package/dist/chunk-HLSB2MCK.js +1 -0
  36. package/dist/chunk-HVXO3OFB.cjs +1 -0
  37. package/dist/chunk-IFJJ44OQ.cjs +133 -0
  38. package/dist/chunk-ISWMETHJ.cjs +1 -0
  39. package/dist/chunk-K6WUOU6P.js +1 -0
  40. package/dist/chunk-KDNYHLD2.js +1 -0
  41. package/dist/chunk-KIW36TG7.cjs +86 -0
  42. package/dist/chunk-L6CZYN3L.cjs +20 -0
  43. package/dist/chunk-LRGAPGG3.js +74 -0
  44. package/dist/chunk-LZ6YFYQM.js +20 -0
  45. package/dist/chunk-MIOMMB23.cjs +1 -0
  46. package/dist/chunk-NGBJKZMT.js +90 -0
  47. package/dist/chunk-NRLIGDYF.js +1 -0
  48. package/dist/chunk-NY47CFVP.cjs +1 -0
  49. package/dist/chunk-NZ35PV5R.js +2 -0
  50. package/dist/chunk-OG7CNQGU.js +1 -0
  51. package/dist/chunk-OQD3WG6Z.cjs +1 -0
  52. package/dist/chunk-P7CESLDJ.js +1 -0
  53. package/dist/chunk-PP5S2UBV.js +0 -0
  54. package/dist/chunk-Q3Q7BJVQ.cjs +1 -0
  55. package/dist/chunk-Q4CSLXCO.cjs +90 -0
  56. package/dist/chunk-QRXDCV6K.js +0 -0
  57. package/dist/chunk-R7DVVXXI.cjs +73 -0
  58. package/dist/chunk-RHCWCG3O.js +114 -0
  59. package/dist/chunk-SL3LZQCF.js +1 -0
  60. package/dist/chunk-UBHFUFD4.cjs +1 -0
  61. package/dist/chunk-UBRYJP2G.js +1 -0
  62. package/dist/chunk-UDSJGML2.cjs +2 -0
  63. package/dist/chunk-UHFDH3PG.js +20 -0
  64. package/dist/chunk-UJNSOOYZ.cjs +1 -0
  65. package/dist/chunk-URCLFIME.js +86 -0
  66. package/dist/chunk-UVTS2IWM.js +1 -0
  67. package/dist/chunk-V65NPSR5.cjs +1 -0
  68. package/dist/chunk-WIZ6C5QZ.cjs +1 -0
  69. package/dist/chunk-ZAQOSRP6.js +1 -0
  70. package/dist/chunk-ZELCS7IC.js +3 -0
  71. package/dist/cli/index.cjs +35 -405
  72. package/dist/cli/index.js +35 -402
  73. package/dist/client.cjs +1 -55
  74. package/dist/client.js +1 -6
  75. package/dist/drizzle/index.cjs +1 -50
  76. package/dist/drizzle/index.d.cts +1 -2
  77. package/dist/drizzle/index.d.ts +1 -2
  78. package/dist/drizzle/index.js +1 -9
  79. package/dist/fields/index.cjs +1 -89
  80. package/dist/fields/index.js +1 -4
  81. package/dist/graphql/index.cjs +1 -31
  82. package/dist/graphql/index.d.cts +1 -1
  83. package/dist/graphql/index.d.ts +1 -1
  84. package/dist/graphql/index.js +1 -6
  85. package/dist/{index-jLs0zlft.d.ts → index-DXr33e0x.d.ts} +1 -1
  86. package/dist/{index-DHbywDs-.d.cts → index-DuuUzWBq.d.cts} +1 -1
  87. package/dist/index.cjs +29 -2464
  88. package/dist/index.d.cts +2 -2
  89. package/dist/index.d.ts +2 -2
  90. package/dist/index.js +29 -1929
  91. package/dist/integration.cjs +1 -10
  92. package/dist/integration.js +1 -4
  93. package/dist/media-NSSMOB7N.cjs +1 -0
  94. package/dist/media-RNMCZYPZ.js +1 -0
  95. package/dist/mongo-auth-adapter-JYJ4GBZE.cjs +1 -0
  96. package/dist/mongo-auth-adapter-XI7EPURZ.js +1 -0
  97. package/dist/mongodb/index.cjs +1 -29
  98. package/dist/mongodb/index.d.cts +1 -2
  99. package/dist/mongodb/index.d.ts +1 -2
  100. package/dist/mongodb/index.js +1 -8
  101. package/dist/postgres-auth-adapter-E7OGMDD4.cjs +1 -0
  102. package/dist/postgres-auth-adapter-F4KLOGAG.js +1 -0
  103. package/dist/redis-adapter-AQJVABYT.cjs +1 -0
  104. package/dist/redis-adapter-AUKOV74G.js +1 -0
  105. package/dist/rest/index.cjs +1 -31
  106. package/dist/rest/index.d.cts +1 -1
  107. package/dist/rest/index.d.ts +1 -1
  108. package/dist/rest/index.js +1 -18
  109. package/dist/schema-5XNROI7I.js +1 -0
  110. package/dist/schema-6O4JTJRU.cjs +1 -0
  111. package/dist/sqlite-adapter-5XFLNJDH.js +1 -0
  112. package/dist/sqlite-adapter-W53Q32N5.cjs +1 -0
  113. package/dist/templates/index.cjs +1 -207
  114. package/dist/templates/index.js +1 -6
  115. package/dist/trpc/index.cjs +1 -48
  116. package/dist/trpc/index.js +1 -7
  117. package/dist/ws/index.cjs +1 -25
  118. package/dist/ws/index.js +1 -4
  119. package/package.json +44 -13
  120. package/dist/api-handler-graphql.cjs.map +0 -1
  121. package/dist/api-handler-graphql.js.map +0 -1
  122. package/dist/api-handler-trpc.cjs.map +0 -1
  123. package/dist/api-handler-trpc.js.map +0 -1
  124. package/dist/api-handler.cjs.map +0 -1
  125. package/dist/api-handler.js.map +0 -1
  126. package/dist/bootstrap-FUAPY2OF.cjs +0 -32
  127. package/dist/bootstrap-FUAPY2OF.cjs.map +0 -1
  128. package/dist/bootstrap-OXNVM7FP.js +0 -7
  129. package/dist/bootstrap-OXNVM7FP.js.map +0 -1
  130. package/dist/chunk-2HFJUUFZ.js +0 -250
  131. package/dist/chunk-2HFJUUFZ.js.map +0 -1
  132. package/dist/chunk-3AKCVYDB.js +0 -162
  133. package/dist/chunk-3AKCVYDB.js.map +0 -1
  134. package/dist/chunk-3KTWGODI.cjs +0 -178
  135. package/dist/chunk-3KTWGODI.cjs.map +0 -1
  136. package/dist/chunk-3YELQL7Z.cjs +0 -4
  137. package/dist/chunk-3YELQL7Z.cjs.map +0 -1
  138. package/dist/chunk-4CV4JOE5.js +0 -24
  139. package/dist/chunk-4CV4JOE5.js.map +0 -1
  140. package/dist/chunk-4OCMVGEY.cjs +0 -173
  141. package/dist/chunk-4OCMVGEY.cjs.map +0 -1
  142. package/dist/chunk-4PWRCMTQ.cjs +0 -15
  143. package/dist/chunk-4PWRCMTQ.cjs.map +0 -1
  144. package/dist/chunk-53NYVYVX.js +0 -3243
  145. package/dist/chunk-53NYVYVX.js.map +0 -1
  146. package/dist/chunk-5GFQPHGT.cjs +0 -156
  147. package/dist/chunk-5GFQPHGT.cjs.map +0 -1
  148. package/dist/chunk-5RPRLTTN.js +0 -861
  149. package/dist/chunk-5RPRLTTN.js.map +0 -1
  150. package/dist/chunk-74YSDAWE.cjs +0 -2749
  151. package/dist/chunk-74YSDAWE.cjs.map +0 -1
  152. package/dist/chunk-7OGPN7MP.js +0 -352
  153. package/dist/chunk-7OGPN7MP.js.map +0 -1
  154. package/dist/chunk-7OS7TX2Q.cjs +0 -495
  155. package/dist/chunk-7OS7TX2Q.cjs.map +0 -1
  156. package/dist/chunk-ADLJSJSN.cjs +0 -13
  157. package/dist/chunk-ADLJSJSN.cjs.map +0 -1
  158. package/dist/chunk-B6X3LN25.cjs +0 -6486
  159. package/dist/chunk-B6X3LN25.cjs.map +0 -1
  160. package/dist/chunk-BYBMTIMT.js +0 -419
  161. package/dist/chunk-BYBMTIMT.js.map +0 -1
  162. package/dist/chunk-CF7OL6HR.js +0 -355
  163. package/dist/chunk-CF7OL6HR.js.map +0 -1
  164. package/dist/chunk-CJX74IYK.js +0 -489
  165. package/dist/chunk-CJX74IYK.js.map +0 -1
  166. package/dist/chunk-CKVOU6MX.cjs +0 -52
  167. package/dist/chunk-CKVOU6MX.cjs.map +0 -1
  168. package/dist/chunk-CZLDE2OZ.cjs +0 -28
  169. package/dist/chunk-CZLDE2OZ.cjs.map +0 -1
  170. package/dist/chunk-DPA3KWPY.cjs +0 -205
  171. package/dist/chunk-DPA3KWPY.cjs.map +0 -1
  172. package/dist/chunk-EEJUFDMF.cjs +0 -424
  173. package/dist/chunk-EEJUFDMF.cjs.map +0 -1
  174. package/dist/chunk-FIAMXNTH.js +0 -220
  175. package/dist/chunk-FIAMXNTH.js.map +0 -1
  176. package/dist/chunk-GAOXD3XT.js +0 -175
  177. package/dist/chunk-GAOXD3XT.js.map +0 -1
  178. package/dist/chunk-GTGRLD4Y.js +0 -3
  179. package/dist/chunk-GTGRLD4Y.js.map +0 -1
  180. package/dist/chunk-GUUB5EAG.cjs +0 -223
  181. package/dist/chunk-GUUB5EAG.cjs.map +0 -1
  182. package/dist/chunk-GXFOGU7N.cjs +0 -359
  183. package/dist/chunk-GXFOGU7N.cjs.map +0 -1
  184. package/dist/chunk-GZS4LMR7.js +0 -422
  185. package/dist/chunk-GZS4LMR7.js.map +0 -1
  186. package/dist/chunk-HY6B7B5A.js +0 -150
  187. package/dist/chunk-HY6B7B5A.js.map +0 -1
  188. package/dist/chunk-HZOMOK5Y.js +0 -2728
  189. package/dist/chunk-HZOMOK5Y.js.map +0 -1
  190. package/dist/chunk-IDVRRRAK.cjs +0 -824
  191. package/dist/chunk-IDVRRRAK.cjs.map +0 -1
  192. package/dist/chunk-KC2GDBLS.cjs +0 -84
  193. package/dist/chunk-KC2GDBLS.cjs.map +0 -1
  194. package/dist/chunk-L4EZKIEX.js +0 -185
  195. package/dist/chunk-L4EZKIEX.js.map +0 -1
  196. package/dist/chunk-LNTFRAHF.cjs +0 -473
  197. package/dist/chunk-LNTFRAHF.cjs.map +0 -1
  198. package/dist/chunk-MTIRYI7F.cjs +0 -4
  199. package/dist/chunk-MTIRYI7F.cjs.map +0 -1
  200. package/dist/chunk-N4GN6Q3V.cjs +0 -869
  201. package/dist/chunk-N4GN6Q3V.cjs.map +0 -1
  202. package/dist/chunk-N4H37VN4.cjs +0 -259
  203. package/dist/chunk-N4H37VN4.cjs.map +0 -1
  204. package/dist/chunk-N5QSHUA6.js +0 -1135
  205. package/dist/chunk-N5QSHUA6.js.map +0 -1
  206. package/dist/chunk-NKPKR5BW.cjs +0 -188
  207. package/dist/chunk-NKPKR5BW.cjs.map +0 -1
  208. package/dist/chunk-OIRG6ZRV.cjs +0 -1073
  209. package/dist/chunk-OIRG6ZRV.cjs.map +0 -1
  210. package/dist/chunk-OJ2AM75W.cjs +0 -253
  211. package/dist/chunk-OJ2AM75W.cjs.map +0 -1
  212. package/dist/chunk-OLV7K22H.js +0 -6457
  213. package/dist/chunk-OLV7K22H.js.map +0 -1
  214. package/dist/chunk-OX6GOIPH.js +0 -516
  215. package/dist/chunk-OX6GOIPH.js.map +0 -1
  216. package/dist/chunk-P2YW545G.js +0 -11
  217. package/dist/chunk-P2YW545G.js.map +0 -1
  218. package/dist/chunk-PHJRNPHY.cjs +0 -3291
  219. package/dist/chunk-PHJRNPHY.cjs.map +0 -1
  220. package/dist/chunk-Q72BOAPK.js +0 -817
  221. package/dist/chunk-Q72BOAPK.js.map +0 -1
  222. package/dist/chunk-QU2RFFH4.js +0 -3
  223. package/dist/chunk-QU2RFFH4.js.map +0 -1
  224. package/dist/chunk-RP7VZUEL.js +0 -49
  225. package/dist/chunk-RP7VZUEL.js.map +0 -1
  226. package/dist/chunk-SHTTJMLT.cjs +0 -361
  227. package/dist/chunk-SHTTJMLT.cjs.map +0 -1
  228. package/dist/chunk-SX76DNOO.js +0 -103
  229. package/dist/chunk-SX76DNOO.js.map +0 -1
  230. package/dist/chunk-THBQG64D.cjs +0 -425
  231. package/dist/chunk-THBQG64D.cjs.map +0 -1
  232. package/dist/chunk-TQG7G7YI.cjs +0 -526
  233. package/dist/chunk-TQG7G7YI.cjs.map +0 -1
  234. package/dist/chunk-U3VVLYXG.cjs +0 -189
  235. package/dist/chunk-U3VVLYXG.cjs.map +0 -1
  236. package/dist/chunk-UUDTPZX6.js +0 -193
  237. package/dist/chunk-UUDTPZX6.js.map +0 -1
  238. package/dist/chunk-V5AWATUP.js +0 -1059
  239. package/dist/chunk-V5AWATUP.js.map +0 -1
  240. package/dist/chunk-VAXLFZCV.cjs +0 -110
  241. package/dist/chunk-VAXLFZCV.cjs.map +0 -1
  242. package/dist/chunk-VKREAIBA.cjs +0 -1139
  243. package/dist/chunk-VKREAIBA.cjs.map +0 -1
  244. package/dist/chunk-WDTTHKDS.js +0 -458
  245. package/dist/chunk-WDTTHKDS.js.map +0 -1
  246. package/dist/chunk-WXVB364T.js +0 -218
  247. package/dist/chunk-WXVB364T.js.map +0 -1
  248. package/dist/chunk-X4BPPD6K.js +0 -181
  249. package/dist/chunk-X4BPPD6K.js.map +0 -1
  250. package/dist/chunk-XEB7PH2E.js +0 -81
  251. package/dist/chunk-XEB7PH2E.js.map +0 -1
  252. package/dist/chunk-YT7HXXVN.js +0 -13
  253. package/dist/chunk-YT7HXXVN.js.map +0 -1
  254. package/dist/cli/index.cjs.map +0 -1
  255. package/dist/cli/index.js.map +0 -1
  256. package/dist/client.cjs.map +0 -1
  257. package/dist/client.js.map +0 -1
  258. package/dist/drizzle/index.cjs.map +0 -1
  259. package/dist/drizzle/index.js.map +0 -1
  260. package/dist/fields/index.cjs.map +0 -1
  261. package/dist/fields/index.js.map +0 -1
  262. package/dist/graphql/index.cjs.map +0 -1
  263. package/dist/graphql/index.js.map +0 -1
  264. package/dist/index.cjs.map +0 -1
  265. package/dist/index.js.map +0 -1
  266. package/dist/integration.cjs.map +0 -1
  267. package/dist/integration.js.map +0 -1
  268. package/dist/media-7WDX4BDJ.js +0 -4
  269. package/dist/media-7WDX4BDJ.js.map +0 -1
  270. package/dist/media-TUSLVRQ6.cjs +0 -17
  271. package/dist/media-TUSLVRQ6.cjs.map +0 -1
  272. package/dist/mongo-auth-adapter-GT4S7SCU.cjs +0 -17
  273. package/dist/mongo-auth-adapter-GT4S7SCU.cjs.map +0 -1
  274. package/dist/mongo-auth-adapter-M7VV4LNB.js +0 -4
  275. package/dist/mongo-auth-adapter-M7VV4LNB.js.map +0 -1
  276. package/dist/mongodb/index.cjs.map +0 -1
  277. package/dist/mongodb/index.js.map +0 -1
  278. package/dist/postgres-auth-adapter-AFAPISH7.js +0 -5
  279. package/dist/postgres-auth-adapter-AFAPISH7.js.map +0 -1
  280. package/dist/postgres-auth-adapter-SFDTLONT.cjs +0 -14
  281. package/dist/postgres-auth-adapter-SFDTLONT.cjs.map +0 -1
  282. package/dist/redis-adapter-UQX4EE3B.cjs +0 -13
  283. package/dist/redis-adapter-UQX4EE3B.cjs.map +0 -1
  284. package/dist/redis-adapter-XALOGWY3.js +0 -4
  285. package/dist/redis-adapter-XALOGWY3.js.map +0 -1
  286. package/dist/rest/index.cjs.map +0 -1
  287. package/dist/rest/index.js.map +0 -1
  288. package/dist/schema-6QL3USNB.cjs +0 -67
  289. package/dist/schema-6QL3USNB.cjs.map +0 -1
  290. package/dist/schema-FNNWEAAW.js +0 -6
  291. package/dist/schema-FNNWEAAW.js.map +0 -1
  292. package/dist/sqlite-adapter-AQB5TCGV.cjs +0 -13
  293. package/dist/sqlite-adapter-AQB5TCGV.cjs.map +0 -1
  294. package/dist/sqlite-adapter-N5H6IM2X.js +0 -4
  295. package/dist/sqlite-adapter-N5H6IM2X.js.map +0 -1
  296. package/dist/templates/index.cjs.map +0 -1
  297. package/dist/templates/index.js.map +0 -1
  298. package/dist/trpc/index.cjs.map +0 -1
  299. package/dist/trpc/index.js.map +0 -1
  300. package/dist/ws/index.cjs.map +0 -1
  301. package/dist/ws/index.js.map +0 -1
@@ -1,223 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkNKPKR5BW_cjs = require('./chunk-NKPKR5BW.cjs');
4
-
5
- // src/database/base.ts
6
- var AbstractBaseAdapter = class {
7
- collections = /* @__PURE__ */ new Map();
8
- globals = /* @__PURE__ */ new Map();
9
- connected = false;
10
- tenantContext;
11
- setTenantContext(context) {
12
- this.tenantContext = context;
13
- }
14
- getTenantContext() {
15
- return this.tenantContext;
16
- }
17
- async init(collections, globals = []) {
18
- for (const config of collections) {
19
- this.collections.set(config.slug, config);
20
- }
21
- for (const config of globals) {
22
- this.globals.set(config.slug, config);
23
- }
24
- await this.connect();
25
- }
26
- // ========================================================================
27
- // Utility Methods
28
- // ========================================================================
29
- getCollection(slug) {
30
- const collection = this.collections.get(slug);
31
- if (!collection) {
32
- throw new Error(`Collection "${slug}" not found in adapter`);
33
- }
34
- return collection;
35
- }
36
- applyTenantFilter(where = {}, tenantID) {
37
- if (tenantID) {
38
- return {
39
- ...where,
40
- tenantID: { equals: tenantID }
41
- };
42
- }
43
- return where;
44
- }
45
- getTableName(slug) {
46
- return slug.replace(/-/g, "_");
47
- }
48
- prepareData(data, collection) {
49
- const prepared = { ...data };
50
- if (collection.timestamps) {
51
- prepared.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
52
- if (!prepared.createdAt) {
53
- prepared.createdAt = (/* @__PURE__ */ new Date()).toISOString();
54
- }
55
- }
56
- if (collection.auth && prepared.password) ;
57
- return prepared;
58
- }
59
- processRelationships(data, fields, depth) {
60
- return data;
61
- }
62
- parseSort(sort) {
63
- if (!sort) return { field: "createdAt", direction: "desc" };
64
- if (sort.startsWith("-")) {
65
- return { field: sort.slice(1), direction: "desc" };
66
- }
67
- return { field: sort, direction: "asc" };
68
- }
69
- calculatePagination(page, limit, totalDocs) {
70
- const totalPages = Math.ceil(totalDocs / limit);
71
- return {
72
- totalDocs,
73
- limit,
74
- totalPages,
75
- page,
76
- pagingCounter: (page - 1) * limit + 1,
77
- hasPrevPage: page > 1,
78
- hasNextPage: page < totalPages,
79
- prevPage: page > 1 ? page - 1 : null,
80
- nextPage: page < totalPages ? page + 1 : null
81
- };
82
- }
83
- selectFields(data, select) {
84
- if (!select || select.length === 0) return data;
85
- const result = {};
86
- for (const field of select) {
87
- if (field in data) {
88
- result[field] = data[field];
89
- }
90
- }
91
- result["id"] = data.id;
92
- return result;
93
- }
94
- isRelationshipField(field) {
95
- return field.type === "relationship";
96
- }
97
- isUploadField(field) {
98
- return field.type === "upload";
99
- }
100
- getRelationshipFields(fields) {
101
- const result = [];
102
- for (const field of fields) {
103
- if (field.type === "relationship") {
104
- result.push(field);
105
- } else if ("fields" in field && field.fields) {
106
- result.push(...this.getRelationshipFields(field.fields));
107
- }
108
- }
109
- return result;
110
- }
111
- getUploadFields(fields) {
112
- const result = [];
113
- for (const field of fields) {
114
- if (field.type === "upload") {
115
- result.push(field);
116
- } else if ("fields" in field && field.fields) {
117
- result.push(...this.getUploadFields(field.fields));
118
- }
119
- }
120
- return result;
121
- }
122
- };
123
-
124
- // src/auth/rls/tenant.ts
125
- var DEFAULT_RLS_CONFIG = {
126
- tenantEnabled: true,
127
- tenantField: "tenantId",
128
- ownershipRules: {
129
- posts: {
130
- ownerField: "authorId",
131
- bypassRoles: ["super_admin", "admin", "editor"]
132
- },
133
- pages: {
134
- ownerField: "authorId",
135
- bypassRoles: ["super_admin", "admin", "editor"]
136
- },
137
- media: {
138
- ownerField: "uploadedBy",
139
- bypassRoles: ["super_admin", "admin", "editor"]
140
- },
141
- orders: {
142
- ownerField: "customerId",
143
- bypassRoles: ["super_admin", "admin", "editor"]
144
- },
145
- customers: { ownerField: "id", bypassRoles: ["super_admin", "admin"] },
146
- navigation: { ownerField: "id", bypassRoles: ["super_admin", "admin"] }
147
- }
148
- };
149
- function addTenantFilter(query, context, config = DEFAULT_RLS_CONFIG) {
150
- if (!config.tenantEnabled || context.isSuperAdmin) {
151
- return query;
152
- }
153
- return {
154
- ...query,
155
- where: {
156
- ...query.where,
157
- [config.tenantField]: context.tenantId
158
- }
159
- };
160
- }
161
- function applyOwnershipRule(query, collection, context, config = DEFAULT_RLS_CONFIG) {
162
- const rule = config.ownershipRules[collection];
163
- if (!rule) {
164
- return query;
165
- }
166
- if (rule.bypassRoles && chunkNKPKR5BW_cjs.hasAnyRole({ role: context.role }, rule.bypassRoles)) {
167
- return query;
168
- }
169
- if (rule.ownerField === "id" && context.userId) {
170
- return {
171
- ...query,
172
- where: {
173
- ...query.where,
174
- id: context.userId
175
- }
176
- };
177
- }
178
- if (rule.ownerField && context.userId) {
179
- return {
180
- ...query,
181
- where: {
182
- ...query.where,
183
- [rule.ownerField]: context.userId
184
- }
185
- };
186
- }
187
- return query;
188
- }
189
- function applyRLS(query, collection, context, config = DEFAULT_RLS_CONFIG) {
190
- let result = query;
191
- result = addTenantFilter(result, context, config);
192
- result = applyOwnershipRule(result, collection, context, config);
193
- return result;
194
- }
195
- function canAccessDocument(doc, collection, context, config = DEFAULT_RLS_CONFIG) {
196
- if (context.isSuperAdmin) {
197
- return true;
198
- }
199
- if (config.tenantEnabled && doc[config.tenantField] !== context.tenantId) {
200
- return false;
201
- }
202
- const rule = config.ownershipRules[collection];
203
- if (!rule) {
204
- return true;
205
- }
206
- if (rule.bypassRoles && chunkNKPKR5BW_cjs.hasAnyRole({ role: context.role }, rule.bypassRoles)) {
207
- return true;
208
- }
209
- if (rule.ownerField === "id") {
210
- return doc.id === context.userId;
211
- }
212
- if (rule.ownerField) {
213
- return doc[rule.ownerField] === context.userId;
214
- }
215
- return true;
216
- }
217
-
218
- exports.AbstractBaseAdapter = AbstractBaseAdapter;
219
- exports.DEFAULT_RLS_CONFIG = DEFAULT_RLS_CONFIG;
220
- exports.applyRLS = applyRLS;
221
- exports.canAccessDocument = canAccessDocument;
222
- //# sourceMappingURL=chunk-GUUB5EAG.cjs.map
223
- //# sourceMappingURL=chunk-GUUB5EAG.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/database/base.ts","../src/auth/rls/tenant.ts"],"names":["hasAnyRole"],"mappings":"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","file":"chunk-GUUB5EAG.cjs","sourcesContent":["import type {\n BaseAdapter,\n CollectionConfig,\n GlobalConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n VersionRecord,\n CreateVersionArgs,\n FindVersionsArgs,\n} from '../registry/types.js';\nimport type { Field, RelationshipField, UploadField } from '../fields/types.js';\nimport type { TenantContext } from '../auth/rls/tenant.js';\n\n// ============================================================================\n// Abstract Base Adapter\n// ============================================================================\n\nexport abstract class AbstractBaseAdapter implements BaseAdapter {\n protected collections: Map<string, CollectionConfig> = new Map();\n protected globals: Map<string, GlobalConfig> = new Map();\n protected connected = false;\n protected tenantContext?: TenantContext;\n\n abstract connect(): Promise<void>;\n abstract disconnect(): Promise<void>;\n\n setTenantContext(context: TenantContext | undefined): void {\n this.tenantContext = context;\n }\n\n getTenantContext(): TenantContext | undefined {\n return this.tenantContext;\n }\n\n async init(collections: CollectionConfig[], globals: GlobalConfig[] = []): Promise<void> {\n for (const config of collections) {\n this.collections.set(config.slug, config);\n }\n for (const config of globals) {\n this.globals.set(config.slug, config);\n }\n await this.connect();\n }\n\n abstract find<T>(args: FindArgs): Promise<FindResult<T>>;\n abstract findByID<T>(args: FindByIDArgs): Promise<T | null>;\n abstract create<T>(args: CreateArgs): Promise<T>;\n abstract update<T>(args: UpdateArgs): Promise<T>;\n abstract delete<T>(args: DeleteArgs): Promise<T>;\n abstract count(args: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number>;\n\n abstract findOne(args: { collection: string; where: Record<string, any>; tenantID?: string; draft?: boolean }): Promise<any>;\n\n abstract findVersions(args: FindVersionsArgs): Promise<FindResult<VersionRecord>>;\n abstract findVersionByID(args: { collection: string; versionId: string; tenantID?: string }): Promise<VersionRecord | null>;\n abstract createVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>>;\n abstract updateLatestVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>>;\n abstract deleteVersions(args: { collection: string; documentId: string; keepLatest?: number; tenantID?: string }): Promise<void>;\n\n async migrate?(): Promise<void>;\n async rollback?(): Promise<void>;\n async transaction?<T>(fn: (tx: any) => Promise<T>): Promise<T>;\n\n // ========================================================================\n // Utility Methods\n // ========================================================================\n\n protected getCollection(slug: string): CollectionConfig {\n const collection = this.collections.get(slug);\n if (!collection) {\n throw new Error(`Collection \"${slug}\" not found in adapter`);\n }\n return collection;\n }\n\n protected applyTenantFilter(where: Record<string, any> = {}, tenantID?: string): Record<string, any> {\n if (tenantID) {\n return {\n ...where,\n tenantID: { equals: tenantID },\n };\n }\n return where;\n }\n\n protected getTableName(slug: string): string {\n return slug.replace(/-/g, '_');\n }\n\n protected prepareData(data: Record<string, any>, collection: CollectionConfig): Record<string, any> {\n const prepared: Record<string, any> = { ...data };\n \n if (collection.timestamps) {\n prepared.updatedAt = new Date().toISOString();\n if (!prepared.createdAt) {\n prepared.createdAt = new Date().toISOString();\n }\n }\n\n // Handle password hashing\n if (collection.auth && prepared.password) {\n // Password should be hashed before this point via hooks\n }\n\n return prepared;\n }\n\n protected processRelationships(\n data: Record<string, any>,\n fields: Field[],\n depth: number\n ): Record<string, any> {\n // This is a base implementation - specific adapters override\n return data;\n }\n\n protected parseSort(sort?: string): { field: string; direction: 'asc' | 'desc' } {\n if (!sort) return { field: 'createdAt', direction: 'desc' };\n if (sort.startsWith('-')) {\n return { field: sort.slice(1), direction: 'desc' };\n }\n return { field: sort, direction: 'asc' };\n }\n\n protected calculatePagination(page: number, limit: number, totalDocs: number) {\n const totalPages = Math.ceil(totalDocs / limit);\n return {\n totalDocs,\n limit,\n totalPages,\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < totalPages,\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < totalPages ? page + 1 : null,\n };\n }\n\n protected selectFields(data: Record<string, any>, select?: string[]): Record<string, any> {\n if (!select || select.length === 0) return data;\n const result: Record<string, any> = {};\n for (const field of select) {\n if (field in data) {\n result[field] = data[field];\n }\n }\n result['id'] = data.id;\n return result;\n }\n\n protected isRelationshipField(field: Field): field is RelationshipField {\n return field.type === 'relationship';\n }\n\n protected isUploadField(field: Field): field is UploadField {\n return field.type === 'upload';\n }\n\n protected getRelationshipFields(fields: Field[]): RelationshipField[] {\n const result: RelationshipField[] = [];\n for (const field of fields) {\n if (field.type === 'relationship') {\n result.push(field);\n } else if ('fields' in field && field.fields) {\n result.push(...this.getRelationshipFields(field.fields));\n }\n }\n return result;\n }\n\n protected getUploadFields(fields: Field[]): UploadField[] {\n const result: UploadField[] = [];\n for (const field of fields) {\n if (field.type === 'upload') {\n result.push(field);\n } else if ('fields' in field && field.fields) {\n result.push(...this.getUploadFields(field.fields));\n }\n }\n return result;\n }\n}\n","import type { AuthUser } from \"../types.js\";\nimport { hasAnyRole } from \"../rbac/checker.js\";\n\nexport interface TenantContext {\n tenantId: string;\n userId: string;\n role?: string;\n roles?: string[];\n permissions?: string[];\n isSuperAdmin?: boolean;\n}\n\nexport interface OwnershipRule {\n ownerField: string;\n bypassRoles?: string[];\n}\n\nexport interface RLSConfig {\n tenantEnabled: boolean;\n tenantField: string;\n ownershipRules: Record<string, OwnershipRule>;\n}\n\nexport const DEFAULT_RLS_CONFIG: RLSConfig = {\n tenantEnabled: true,\n tenantField: \"tenantId\",\n ownershipRules: {\n posts: {\n ownerField: \"authorId\",\n bypassRoles: [\"super_admin\", \"admin\", \"editor\"],\n },\n pages: {\n ownerField: \"authorId\",\n bypassRoles: [\"super_admin\", \"admin\", \"editor\"],\n },\n media: {\n ownerField: \"uploadedBy\",\n bypassRoles: [\"super_admin\", \"admin\", \"editor\"],\n },\n orders: {\n ownerField: \"customerId\",\n bypassRoles: [\"super_admin\", \"admin\", \"editor\"],\n },\n customers: { ownerField: \"id\", bypassRoles: [\"super_admin\", \"admin\"] },\n navigation: { ownerField: \"id\", bypassRoles: [\"super_admin\", \"admin\"] },\n },\n};\n\nexport function createTenantContext(user: AuthUser | undefined): TenantContext {\n if (!user) {\n return {\n tenantId: \"public\",\n userId: \"anonymous\",\n role: \"guest\",\n roles: [\"guest\"],\n permissions: [],\n isSuperAdmin: false,\n };\n }\n\n const isSuperAdmin = user.role === \"super_admin\";\n\n return {\n tenantId: user.tenantId || \"default\",\n userId: user.id,\n role: user.role,\n roles: [user.role],\n permissions: [],\n isSuperAdmin,\n };\n}\n\nexport function addTenantFilter<T extends Record<string, any>>(\n query: T,\n context: TenantContext,\n config: RLSConfig = DEFAULT_RLS_CONFIG,\n): T {\n if (!config.tenantEnabled || context.isSuperAdmin) {\n return query;\n }\n\n return {\n ...query,\n where: {\n ...query.where,\n [config.tenantField]: context.tenantId,\n },\n };\n}\n\nexport function applyOwnershipRule(\n query: Record<string, any>,\n collection: string,\n context: TenantContext,\n config: RLSConfig = DEFAULT_RLS_CONFIG,\n): Record<string, any> {\n const rule = config.ownershipRules[collection];\n\n if (!rule) {\n return query;\n }\n\n if (\n rule.bypassRoles &&\n hasAnyRole({ role: context.role } as AuthUser, rule.bypassRoles)\n ) {\n return query;\n }\n\n if (rule.ownerField === \"id\" && context.userId) {\n return {\n ...query,\n where: {\n ...query.where,\n id: context.userId,\n },\n };\n }\n\n if (rule.ownerField && context.userId) {\n return {\n ...query,\n where: {\n ...query.where,\n [rule.ownerField]: context.userId,\n },\n };\n }\n\n return query;\n}\n\nexport function applyRLS<T extends Record<string, any>>(\n query: T,\n collection: string,\n context: TenantContext,\n config: RLSConfig = DEFAULT_RLS_CONFIG,\n): T {\n let result = query;\n\n result = addTenantFilter(result, context, config) as T;\n\n result = applyOwnershipRule(result, collection, context, config) as T;\n\n return result;\n}\n\nexport function canAccessDocument(\n doc: Record<string, any>,\n collection: string,\n context: TenantContext,\n config: RLSConfig = DEFAULT_RLS_CONFIG,\n): boolean {\n if (context.isSuperAdmin) {\n return true;\n }\n\n if (config.tenantEnabled && doc[config.tenantField] !== context.tenantId) {\n return false;\n }\n\n const rule = config.ownershipRules[collection];\n\n if (!rule) {\n return true;\n }\n\n if (\n rule.bypassRoles &&\n hasAnyRole({ role: context.role } as AuthUser, rule.bypassRoles)\n ) {\n return true;\n }\n\n if (rule.ownerField === \"id\") {\n return doc.id === context.userId;\n }\n\n if (rule.ownerField) {\n return doc[rule.ownerField] === context.userId;\n }\n\n return true;\n}\n\nexport function filterDocumentsByRLS(\n docs: Record<string, any>[],\n collection: string,\n context: TenantContext,\n config: RLSConfig = DEFAULT_RLS_CONFIG,\n): Record<string, any>[] {\n if (context.isSuperAdmin) {\n return docs;\n }\n\n return docs.filter((doc) =>\n canAccessDocument(doc, collection, context, config),\n );\n}\n\nexport function sanitizeDocumentByRLS(\n doc: Record<string, any>,\n collection: string,\n context: TenantContext,\n config: RLSConfig = DEFAULT_RLS_CONFIG,\n): Record<string, any> | null {\n if (!canAccessDocument(doc, collection, context, config)) {\n return null;\n }\n\n if (config.tenantEnabled && !context.isSuperAdmin) {\n const { [config.tenantField]: _, ...rest } = doc;\n return rest;\n }\n\n return doc;\n}\n\nexport class RLSPolicy {\n private config: RLSConfig;\n\n constructor(config: RLSConfig = DEFAULT_RLS_CONFIG) {\n this.config = config;\n }\n\n setConfig(config: RLSConfig): void {\n this.config = config;\n }\n\n getConfig(): RLSConfig {\n return this.config;\n }\n\n addOwnershipRule(collection: string, rule: OwnershipRule): void {\n this.config.ownershipRules[collection] = rule;\n }\n\n removeOwnershipRule(collection: string): void {\n delete this.config.ownershipRules[collection];\n }\n\n createContext(user: AuthUser | undefined): TenantContext {\n return createTenantContext(user);\n }\n\n apply<T extends Record<string, any>>(\n query: T,\n collection: string,\n context: TenantContext,\n ): T {\n return applyRLS(query, collection, context, this.config);\n }\n\n canAccess(\n doc: Record<string, any>,\n collection: string,\n context: TenantContext,\n ): boolean {\n return canAccessDocument(doc, collection, context, this.config);\n }\n\n filter(\n docs: Record<string, any>[],\n collection: string,\n context: TenantContext,\n ): Record<string, any>[] {\n return filterDocumentsByRLS(docs, collection, context, this.config);\n }\n\n sanitize(\n doc: Record<string, any>,\n collection: string,\n context: TenantContext,\n ): Record<string, any> | null {\n return sanitizeDocumentByRLS(doc, collection, context, this.config);\n }\n}\n"]}
@@ -1,359 +0,0 @@
1
- 'use strict';
2
-
3
- var bcrypt = require('bcryptjs');
4
- var crypto = require('crypto');
5
-
6
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
-
8
- var bcrypt__default = /*#__PURE__*/_interopDefault(bcrypt);
9
-
10
- // src/database/mongodb/mongo-auth-adapter.ts
11
- var MongoDBAuthAdapter = class {
12
- db;
13
- prefix;
14
- sessionTTL;
15
- refreshTokenTTL;
16
- indexesEnsured = false;
17
- constructor(options) {
18
- this.db = options.db;
19
- this.prefix = options.collectionPrefix || "";
20
- this.sessionTTL = options.sessionTTL || 86400;
21
- this.refreshTokenTTL = options.refreshTokenTTL || 604800;
22
- }
23
- col(name) {
24
- return this.db.collection(`${this.prefix}${name}`);
25
- }
26
- async connect() {
27
- if (!this.indexesEnsured) {
28
- await this.ensureIndexes();
29
- }
30
- }
31
- async disconnect() {
32
- }
33
- async ensureIndexes() {
34
- await this.col("users").createIndex({ email: 1 }, { unique: true });
35
- await this.col("users").createIndex({ tenantId: 1 });
36
- await this.col("users").createIndex({ role: 1 });
37
- await this.col("sessions").createIndex({ token: 1 }, { unique: true });
38
- await this.col("sessions").createIndex({ refreshToken: 1 });
39
- await this.col("sessions").createIndex({ userId: 1 });
40
- await this.col("sessions").createIndex({ expiresAt: 1 }, { expireAfterSeconds: 0 });
41
- await this.col("audit_logs").createIndex({ timestamp: -1 });
42
- await this.col("audit_logs").createIndex({ userId: 1 });
43
- await this.col("audit_logs").createIndex({ action: 1 });
44
- await this.col("audit_logs").createIndex({ resource: 1 });
45
- await this.col("password_history").createIndex({ userId: 1, createdAt: -1 });
46
- await this.col("lockouts").createIndex({ userId: 1 }, { unique: true });
47
- await this.col("lockouts").createIndex({ lockedUntil: 1 });
48
- this.indexesEnsured = true;
49
- }
50
- async createUser(data) {
51
- const id = crypto.randomUUID();
52
- const now = /* @__PURE__ */ new Date();
53
- const passwordHash = await this.hashPassword(data.password);
54
- const user = {
55
- _id: id,
56
- name: data.name || null,
57
- email: data.email.toLowerCase(),
58
- passwordHash,
59
- role: data.role || "customer",
60
- avatar: data.avatar || null,
61
- tenantId: data.tenantId || null,
62
- emailVerified: false,
63
- locked: false,
64
- lastLogin: null,
65
- failedLoginAttempts: 0,
66
- createdAt: now,
67
- updatedAt: now
68
- };
69
- await this.col("users").insertOne(user);
70
- return this.docToAuthUser(user);
71
- }
72
- async findUserByEmail(email) {
73
- const doc = await this.col("users").findOne({ email: email.toLowerCase() });
74
- return doc ? this.docToAuthUser(doc) : null;
75
- }
76
- async findUserById(id) {
77
- const doc = await this.col("users").findOne({ _id: id });
78
- return doc ? this.docToAuthUser(doc) : null;
79
- }
80
- async updateUser(id, data) {
81
- const setData = { updatedAt: /* @__PURE__ */ new Date() };
82
- if (data.name !== void 0) setData.name = data.name;
83
- if (data.email !== void 0) setData.email = data.email;
84
- if (data.passwordHash !== void 0) setData.passwordHash = data.passwordHash;
85
- if (data.role !== void 0) setData.role = data.role;
86
- if (data.avatar !== void 0) setData.avatar = data.avatar;
87
- if (data.tenantId !== void 0) setData.tenantId = data.tenantId;
88
- if (data.emailVerified !== void 0) setData.emailVerified = data.emailVerified;
89
- if (data.locked !== void 0) setData.locked = data.locked;
90
- if (data.lastLogin !== void 0) setData.lastLogin = data.lastLogin ? new Date(data.lastLogin) : null;
91
- if (data.failedLoginAttempts !== void 0) setData.failedLoginAttempts = data.failedLoginAttempts;
92
- const result = await this.col("users").findOneAndUpdate(
93
- { _id: id },
94
- { $set: setData },
95
- { returnDocument: "after" }
96
- );
97
- return result ? this.docToAuthUser(result) : null;
98
- }
99
- async deleteUser(id) {
100
- const result = await this.col("users").deleteOne({ _id: id });
101
- return result.deletedCount > 0;
102
- }
103
- async verifyPassword(email, password) {
104
- const user = await this.findUserByEmail(email);
105
- if (!user) return null;
106
- const doc = await this.col("users").findOne(
107
- { email: email.toLowerCase() },
108
- { projection: { passwordHash: 1 } }
109
- );
110
- if (!doc?.passwordHash) return null;
111
- const valid = await bcrypt__default.default.compare(password, doc.passwordHash);
112
- return valid ? user : null;
113
- }
114
- async hashPassword(password) {
115
- return bcrypt__default.default.hash(password, 12);
116
- }
117
- async createSession(userId, data) {
118
- const id = crypto.randomUUID();
119
- const token = crypto.randomBytes(32).toString("base64url");
120
- const refreshToken = crypto.randomBytes(32).toString("base64url");
121
- const now = /* @__PURE__ */ new Date();
122
- const expiresAt = new Date(now.getTime() + this.sessionTTL * 1e3);
123
- const session = {
124
- _id: id,
125
- userId,
126
- token,
127
- refreshToken,
128
- ipAddress: data?.ipAddress || null,
129
- userAgent: data?.userAgent || null,
130
- expiresAt,
131
- createdAt: now
132
- };
133
- await this.col("sessions").insertOne(session);
134
- return this.docToSession(session);
135
- }
136
- async findSessionByToken(token) {
137
- const doc = await this.col("sessions").findOne({
138
- token,
139
- expiresAt: { $gt: /* @__PURE__ */ new Date() }
140
- });
141
- return doc ? this.docToSession(doc) : null;
142
- }
143
- async findSessionByRefreshToken(refreshToken) {
144
- const doc = await this.col("sessions").findOne({
145
- refreshToken,
146
- expiresAt: { $gt: /* @__PURE__ */ new Date() }
147
- });
148
- return doc ? this.docToSession(doc) : null;
149
- }
150
- async deleteSession(sessionId) {
151
- const result = await this.col("sessions").deleteOne({ _id: sessionId });
152
- return result.deletedCount > 0;
153
- }
154
- async deleteUserSessions(userId) {
155
- const result = await this.col("sessions").deleteMany({ userId });
156
- return result.deletedCount;
157
- }
158
- async hasAnyUsers() {
159
- const count = await this.col("users").countDocuments();
160
- return count > 0;
161
- }
162
- async addPasswordToHistory(userId, passwordHash) {
163
- await this.col("password_history").insertOne({
164
- userId,
165
- passwordHash,
166
- createdAt: /* @__PURE__ */ new Date()
167
- });
168
- }
169
- async getPasswordHistory(userId, count = 5) {
170
- const docs = await this.col("password_history").find({ userId }).sort({ createdAt: -1 }).limit(count).toArray();
171
- return docs.map((d) => d.passwordHash);
172
- }
173
- async isPasswordInHistory(password, userId, historyCount = 5) {
174
- const history = await this.getPasswordHistory(userId, historyCount);
175
- for (const hash of history) {
176
- if (await bcrypt__default.default.compare(password, hash)) {
177
- return true;
178
- }
179
- }
180
- return false;
181
- }
182
- async findAuditLogs(filter) {
183
- const {
184
- limit = 50,
185
- offset = 0,
186
- userId,
187
- action,
188
- resource,
189
- resourceId,
190
- success,
191
- startDate,
192
- endDate
193
- } = filter;
194
- const query = {};
195
- if (userId) query.userId = userId;
196
- if (action) {
197
- if (Array.isArray(action)) {
198
- query.action = { $in: action };
199
- } else {
200
- query.action = action;
201
- }
202
- }
203
- if (resource) query.resource = resource;
204
- if (resourceId) query.resourceId = resourceId;
205
- if (success !== void 0) query.success = success;
206
- if (startDate || endDate) {
207
- query.timestamp = {};
208
- if (startDate) query.timestamp.$gte = startDate;
209
- if (endDate) query.timestamp.$lte = endDate;
210
- }
211
- const total = await this.col("audit_logs").countDocuments(query);
212
- const docs = await this.col("audit_logs").find(query).sort({ timestamp: -1 }).skip(offset).limit(limit).toArray();
213
- return {
214
- logs: docs.map((doc) => ({
215
- id: doc._id,
216
- timestamp: doc.timestamp,
217
- action: doc.action,
218
- userId: doc.userId || void 0,
219
- userEmail: doc.userEmail || void 0,
220
- role: doc.role || void 0,
221
- resource: doc.resource,
222
- resourceId: doc.resourceId || void 0,
223
- changes: doc.changes || void 0,
224
- ipAddress: doc.ipAddress || void 0,
225
- userAgent: doc.userAgent || void 0,
226
- success: doc.success,
227
- error: doc.error || void 0,
228
- metadata: doc.metadata || void 0
229
- })),
230
- total
231
- };
232
- }
233
- async createAuditLog(data) {
234
- const id = crypto.randomUUID();
235
- const timestamp = /* @__PURE__ */ new Date();
236
- await this.col("audit_logs").insertOne({
237
- _id: id,
238
- action: data.action,
239
- userId: data.userId || null,
240
- userEmail: data.userEmail || null,
241
- role: data.role || null,
242
- resource: data.resource,
243
- resourceId: data.resourceId || null,
244
- changes: data.changes || null,
245
- ipAddress: data.ipAddress || null,
246
- userAgent: data.userAgent || null,
247
- success: data.success,
248
- error: data.error || null,
249
- metadata: data.metadata || null,
250
- timestamp
251
- });
252
- return {
253
- ...data,
254
- id,
255
- timestamp
256
- };
257
- }
258
- docToAuthUser(doc) {
259
- return {
260
- id: doc._id,
261
- name: doc.name || void 0,
262
- email: doc.email,
263
- passwordHash: doc.passwordHash || void 0,
264
- role: doc.role,
265
- tenantId: doc.tenantId || void 0,
266
- avatar: doc.avatar || void 0,
267
- emailVerified: doc.emailVerified || false,
268
- locked: doc.locked || false,
269
- lastLogin: doc.lastLogin?.toISOString?.() || doc.lastLogin || void 0,
270
- failedLoginAttempts: doc.failedLoginAttempts || 0,
271
- createdAt: doc.createdAt?.toISOString?.() || doc.createdAt,
272
- updatedAt: doc.updatedAt?.toISOString?.() || doc.updatedAt
273
- };
274
- }
275
- docToSession(doc) {
276
- return {
277
- id: doc._id,
278
- userId: doc.userId,
279
- token: doc.token,
280
- refreshToken: doc.refreshToken || void 0,
281
- expiresAt: doc.expiresAt?.toISOString?.() || doc.expiresAt,
282
- createdAt: doc.createdAt?.toISOString?.() || doc.createdAt,
283
- ipAddress: doc.ipAddress || void 0,
284
- userAgent: doc.userAgent || void 0
285
- };
286
- }
287
- async createEmailVerificationToken(userId) {
288
- const token = crypto.randomBytes(32).toString("hex");
289
- const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1e3);
290
- await this.db.collection("email_verifications").insertOne({
291
- userId: new (await import('mongodb')).ObjectId(userId),
292
- token,
293
- expiresAt,
294
- createdAt: /* @__PURE__ */ new Date()
295
- });
296
- return { token, expiresAt };
297
- }
298
- async verifyEmailToken(token) {
299
- const verification = await this.db.collection("email_verifications").findOne({ token });
300
- if (!verification) {
301
- return { success: false, error: "Invalid verification token" };
302
- }
303
- if (verification.expiresAt < /* @__PURE__ */ new Date()) {
304
- return { success: false, error: "Verification token has expired" };
305
- }
306
- await this.db.collection("users").updateOne(
307
- { _id: verification.userId },
308
- { $set: { emailVerified: true } }
309
- );
310
- await this.db.collection("email_verifications").deleteOne({ _id: verification._id });
311
- return { success: true, userId: verification.userId.toString() };
312
- }
313
- async createPasswordResetToken(email) {
314
- const user = await this.findUserByEmail(email);
315
- if (!user) {
316
- return { token: "", expiresAt: /* @__PURE__ */ new Date(), error: "User not found" };
317
- }
318
- const token = crypto.randomBytes(32).toString("hex");
319
- const expiresAt = new Date(Date.now() + 60 * 60 * 1e3);
320
- await this.db.collection("password_resets").insertOne({
321
- userId: new (await import('mongodb')).ObjectId(user.id),
322
- token,
323
- expiresAt,
324
- createdAt: /* @__PURE__ */ new Date()
325
- });
326
- return { token, expiresAt };
327
- }
328
- async resetPasswordWithToken(token, newPassword) {
329
- const reset = await this.db.collection("password_resets").findOne({ token });
330
- if (!reset) {
331
- return { success: false, error: "Invalid reset token" };
332
- }
333
- if (reset.expiresAt < /* @__PURE__ */ new Date()) {
334
- return { success: false, error: "Reset token has expired" };
335
- }
336
- if (reset.usedAt) {
337
- return { success: false, error: "Reset token has already been used" };
338
- }
339
- const passwordHash = await this.hashPassword(newPassword);
340
- await this.db.collection("users").updateOne(
341
- { _id: reset.userId },
342
- { $set: { passwordHash, updatedAt: /* @__PURE__ */ new Date() } }
343
- );
344
- await this.db.collection("password_resets").updateOne(
345
- { _id: reset._id },
346
- { $set: { usedAt: /* @__PURE__ */ new Date() } }
347
- );
348
- await this.db.collection("sessions").deleteMany({ userId: reset.userId });
349
- return { success: true };
350
- }
351
- };
352
- function createMongoDBAuthAdapter(options) {
353
- return new MongoDBAuthAdapter(options);
354
- }
355
-
356
- exports.MongoDBAuthAdapter = MongoDBAuthAdapter;
357
- exports.createMongoDBAuthAdapter = createMongoDBAuthAdapter;
358
- //# sourceMappingURL=chunk-GXFOGU7N.cjs.map
359
- //# sourceMappingURL=chunk-GXFOGU7N.cjs.map