@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.
- package/dist/api-handler-graphql.cjs +1 -49
- package/dist/api-handler-graphql.js +1 -46
- package/dist/api-handler-trpc.cjs +1 -38
- package/dist/api-handler-trpc.js +1 -36
- package/dist/api-handler.cjs +1 -44
- package/dist/api-handler.js +1 -27
- package/dist/bootstrap-HIAV5ZFT.cjs +1 -0
- package/dist/bootstrap-P7QPQYQP.js +1 -0
- package/dist/chunk-2BTRHVT3.cjs +20 -0
- package/dist/chunk-2W4FK6CJ.js +122 -0
- package/dist/chunk-4ORJMSJU.cjs +1 -0
- package/dist/chunk-65G73T7Z.cjs +2 -0
- package/dist/chunk-7N6NKCRT.js +1 -0
- package/dist/chunk-7WOX27LK.js +259 -0
- package/dist/chunk-AE6GXUT7.js +1 -0
- package/dist/chunk-AJAZ7D3W.cjs +259 -0
- package/dist/chunk-ATLSIYRH.cjs +1 -0
- package/dist/chunk-AU6IWTBO.js +2 -0
- package/dist/chunk-CDL7ARXT.js +133 -0
- package/dist/chunk-CUTFS6N2.cjs +1 -0
- package/dist/chunk-CVVW4LXZ.cjs +1 -0
- package/dist/chunk-DGJUBN33.js +1 -0
- package/dist/chunk-DV4LFLPL.cjs +1 -0
- package/dist/chunk-EEWCANFX.js +1 -0
- package/dist/chunk-ELICKLFM.cjs +3 -0
- package/dist/chunk-EQUQJBPP.cjs +2 -0
- package/dist/chunk-ET6NN2V2.cjs +122 -0
- package/dist/chunk-F7P36SLX.cjs +74 -0
- package/dist/chunk-F7SR5IDT.cjs +1 -0
- package/dist/chunk-FO3HLBC7.js +1 -0
- package/dist/chunk-FS7GL2BR.js +73 -0
- package/dist/chunk-G6A7OSIG.js +2 -0
- package/dist/chunk-GFU7AOI3.cjs +1 -0
- package/dist/chunk-GYQMNXXW.cjs +114 -0
- package/dist/chunk-HLSB2MCK.js +1 -0
- package/dist/chunk-HVXO3OFB.cjs +1 -0
- package/dist/chunk-IFJJ44OQ.cjs +133 -0
- package/dist/chunk-ISWMETHJ.cjs +1 -0
- package/dist/chunk-K6WUOU6P.js +1 -0
- package/dist/chunk-KDNYHLD2.js +1 -0
- package/dist/chunk-KIW36TG7.cjs +86 -0
- package/dist/chunk-L6CZYN3L.cjs +20 -0
- package/dist/chunk-LRGAPGG3.js +74 -0
- package/dist/chunk-LZ6YFYQM.js +20 -0
- package/dist/chunk-MIOMMB23.cjs +1 -0
- package/dist/chunk-NGBJKZMT.js +90 -0
- package/dist/chunk-NRLIGDYF.js +1 -0
- package/dist/chunk-NY47CFVP.cjs +1 -0
- package/dist/chunk-NZ35PV5R.js +2 -0
- package/dist/chunk-OG7CNQGU.js +1 -0
- package/dist/chunk-OQD3WG6Z.cjs +1 -0
- package/dist/chunk-P7CESLDJ.js +1 -0
- package/dist/chunk-PP5S2UBV.js +0 -0
- package/dist/chunk-Q3Q7BJVQ.cjs +1 -0
- package/dist/chunk-Q4CSLXCO.cjs +90 -0
- package/dist/chunk-QRXDCV6K.js +0 -0
- package/dist/chunk-R7DVVXXI.cjs +73 -0
- package/dist/chunk-RHCWCG3O.js +114 -0
- package/dist/chunk-SL3LZQCF.js +1 -0
- package/dist/chunk-UBHFUFD4.cjs +1 -0
- package/dist/chunk-UBRYJP2G.js +1 -0
- package/dist/chunk-UDSJGML2.cjs +2 -0
- package/dist/chunk-UHFDH3PG.js +20 -0
- package/dist/chunk-UJNSOOYZ.cjs +1 -0
- package/dist/chunk-URCLFIME.js +86 -0
- package/dist/chunk-UVTS2IWM.js +1 -0
- package/dist/chunk-V65NPSR5.cjs +1 -0
- package/dist/chunk-WIZ6C5QZ.cjs +1 -0
- package/dist/chunk-ZAQOSRP6.js +1 -0
- package/dist/chunk-ZELCS7IC.js +3 -0
- package/dist/cli/index.cjs +35 -405
- package/dist/cli/index.js +35 -402
- package/dist/client.cjs +1 -55
- package/dist/client.js +1 -6
- package/dist/drizzle/index.cjs +1 -50
- package/dist/drizzle/index.d.cts +1 -2
- package/dist/drizzle/index.d.ts +1 -2
- package/dist/drizzle/index.js +1 -9
- package/dist/fields/index.cjs +1 -89
- package/dist/fields/index.js +1 -4
- package/dist/graphql/index.cjs +1 -31
- package/dist/graphql/index.d.cts +1 -1
- package/dist/graphql/index.d.ts +1 -1
- package/dist/graphql/index.js +1 -6
- package/dist/{index-jLs0zlft.d.ts → index-DXr33e0x.d.ts} +1 -1
- package/dist/{index-DHbywDs-.d.cts → index-DuuUzWBq.d.cts} +1 -1
- package/dist/index.cjs +29 -2464
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +29 -1929
- package/dist/integration.cjs +1 -10
- package/dist/integration.js +1 -4
- package/dist/media-NSSMOB7N.cjs +1 -0
- package/dist/media-RNMCZYPZ.js +1 -0
- package/dist/mongo-auth-adapter-JYJ4GBZE.cjs +1 -0
- package/dist/mongo-auth-adapter-XI7EPURZ.js +1 -0
- package/dist/mongodb/index.cjs +1 -29
- package/dist/mongodb/index.d.cts +1 -2
- package/dist/mongodb/index.d.ts +1 -2
- package/dist/mongodb/index.js +1 -8
- package/dist/postgres-auth-adapter-E7OGMDD4.cjs +1 -0
- package/dist/postgres-auth-adapter-F4KLOGAG.js +1 -0
- package/dist/redis-adapter-AQJVABYT.cjs +1 -0
- package/dist/redis-adapter-AUKOV74G.js +1 -0
- package/dist/rest/index.cjs +1 -31
- package/dist/rest/index.d.cts +1 -1
- package/dist/rest/index.d.ts +1 -1
- package/dist/rest/index.js +1 -18
- package/dist/schema-5XNROI7I.js +1 -0
- package/dist/schema-6O4JTJRU.cjs +1 -0
- package/dist/sqlite-adapter-5XFLNJDH.js +1 -0
- package/dist/sqlite-adapter-W53Q32N5.cjs +1 -0
- package/dist/templates/index.cjs +1 -207
- package/dist/templates/index.js +1 -6
- package/dist/trpc/index.cjs +1 -48
- package/dist/trpc/index.js +1 -7
- package/dist/ws/index.cjs +1 -25
- package/dist/ws/index.js +1 -4
- package/package.json +44 -13
- package/dist/api-handler-graphql.cjs.map +0 -1
- package/dist/api-handler-graphql.js.map +0 -1
- package/dist/api-handler-trpc.cjs.map +0 -1
- package/dist/api-handler-trpc.js.map +0 -1
- package/dist/api-handler.cjs.map +0 -1
- package/dist/api-handler.js.map +0 -1
- package/dist/bootstrap-FUAPY2OF.cjs +0 -32
- package/dist/bootstrap-FUAPY2OF.cjs.map +0 -1
- package/dist/bootstrap-OXNVM7FP.js +0 -7
- package/dist/bootstrap-OXNVM7FP.js.map +0 -1
- package/dist/chunk-2HFJUUFZ.js +0 -250
- package/dist/chunk-2HFJUUFZ.js.map +0 -1
- package/dist/chunk-3AKCVYDB.js +0 -162
- package/dist/chunk-3AKCVYDB.js.map +0 -1
- package/dist/chunk-3KTWGODI.cjs +0 -178
- package/dist/chunk-3KTWGODI.cjs.map +0 -1
- package/dist/chunk-3YELQL7Z.cjs +0 -4
- package/dist/chunk-3YELQL7Z.cjs.map +0 -1
- package/dist/chunk-4CV4JOE5.js +0 -24
- package/dist/chunk-4CV4JOE5.js.map +0 -1
- package/dist/chunk-4OCMVGEY.cjs +0 -173
- package/dist/chunk-4OCMVGEY.cjs.map +0 -1
- package/dist/chunk-4PWRCMTQ.cjs +0 -15
- package/dist/chunk-4PWRCMTQ.cjs.map +0 -1
- package/dist/chunk-53NYVYVX.js +0 -3243
- package/dist/chunk-53NYVYVX.js.map +0 -1
- package/dist/chunk-5GFQPHGT.cjs +0 -156
- package/dist/chunk-5GFQPHGT.cjs.map +0 -1
- package/dist/chunk-5RPRLTTN.js +0 -861
- package/dist/chunk-5RPRLTTN.js.map +0 -1
- package/dist/chunk-74YSDAWE.cjs +0 -2749
- package/dist/chunk-74YSDAWE.cjs.map +0 -1
- package/dist/chunk-7OGPN7MP.js +0 -352
- package/dist/chunk-7OGPN7MP.js.map +0 -1
- package/dist/chunk-7OS7TX2Q.cjs +0 -495
- package/dist/chunk-7OS7TX2Q.cjs.map +0 -1
- package/dist/chunk-ADLJSJSN.cjs +0 -13
- package/dist/chunk-ADLJSJSN.cjs.map +0 -1
- package/dist/chunk-B6X3LN25.cjs +0 -6486
- package/dist/chunk-B6X3LN25.cjs.map +0 -1
- package/dist/chunk-BYBMTIMT.js +0 -419
- package/dist/chunk-BYBMTIMT.js.map +0 -1
- package/dist/chunk-CF7OL6HR.js +0 -355
- package/dist/chunk-CF7OL6HR.js.map +0 -1
- package/dist/chunk-CJX74IYK.js +0 -489
- package/dist/chunk-CJX74IYK.js.map +0 -1
- package/dist/chunk-CKVOU6MX.cjs +0 -52
- package/dist/chunk-CKVOU6MX.cjs.map +0 -1
- package/dist/chunk-CZLDE2OZ.cjs +0 -28
- package/dist/chunk-CZLDE2OZ.cjs.map +0 -1
- package/dist/chunk-DPA3KWPY.cjs +0 -205
- package/dist/chunk-DPA3KWPY.cjs.map +0 -1
- package/dist/chunk-EEJUFDMF.cjs +0 -424
- package/dist/chunk-EEJUFDMF.cjs.map +0 -1
- package/dist/chunk-FIAMXNTH.js +0 -220
- package/dist/chunk-FIAMXNTH.js.map +0 -1
- package/dist/chunk-GAOXD3XT.js +0 -175
- package/dist/chunk-GAOXD3XT.js.map +0 -1
- package/dist/chunk-GTGRLD4Y.js +0 -3
- package/dist/chunk-GTGRLD4Y.js.map +0 -1
- package/dist/chunk-GUUB5EAG.cjs +0 -223
- package/dist/chunk-GUUB5EAG.cjs.map +0 -1
- package/dist/chunk-GXFOGU7N.cjs +0 -359
- package/dist/chunk-GXFOGU7N.cjs.map +0 -1
- package/dist/chunk-GZS4LMR7.js +0 -422
- package/dist/chunk-GZS4LMR7.js.map +0 -1
- package/dist/chunk-HY6B7B5A.js +0 -150
- package/dist/chunk-HY6B7B5A.js.map +0 -1
- package/dist/chunk-HZOMOK5Y.js +0 -2728
- package/dist/chunk-HZOMOK5Y.js.map +0 -1
- package/dist/chunk-IDVRRRAK.cjs +0 -824
- package/dist/chunk-IDVRRRAK.cjs.map +0 -1
- package/dist/chunk-KC2GDBLS.cjs +0 -84
- package/dist/chunk-KC2GDBLS.cjs.map +0 -1
- package/dist/chunk-L4EZKIEX.js +0 -185
- package/dist/chunk-L4EZKIEX.js.map +0 -1
- package/dist/chunk-LNTFRAHF.cjs +0 -473
- package/dist/chunk-LNTFRAHF.cjs.map +0 -1
- package/dist/chunk-MTIRYI7F.cjs +0 -4
- package/dist/chunk-MTIRYI7F.cjs.map +0 -1
- package/dist/chunk-N4GN6Q3V.cjs +0 -869
- package/dist/chunk-N4GN6Q3V.cjs.map +0 -1
- package/dist/chunk-N4H37VN4.cjs +0 -259
- package/dist/chunk-N4H37VN4.cjs.map +0 -1
- package/dist/chunk-N5QSHUA6.js +0 -1135
- package/dist/chunk-N5QSHUA6.js.map +0 -1
- package/dist/chunk-NKPKR5BW.cjs +0 -188
- package/dist/chunk-NKPKR5BW.cjs.map +0 -1
- package/dist/chunk-OIRG6ZRV.cjs +0 -1073
- package/dist/chunk-OIRG6ZRV.cjs.map +0 -1
- package/dist/chunk-OJ2AM75W.cjs +0 -253
- package/dist/chunk-OJ2AM75W.cjs.map +0 -1
- package/dist/chunk-OLV7K22H.js +0 -6457
- package/dist/chunk-OLV7K22H.js.map +0 -1
- package/dist/chunk-OX6GOIPH.js +0 -516
- package/dist/chunk-OX6GOIPH.js.map +0 -1
- package/dist/chunk-P2YW545G.js +0 -11
- package/dist/chunk-P2YW545G.js.map +0 -1
- package/dist/chunk-PHJRNPHY.cjs +0 -3291
- package/dist/chunk-PHJRNPHY.cjs.map +0 -1
- package/dist/chunk-Q72BOAPK.js +0 -817
- package/dist/chunk-Q72BOAPK.js.map +0 -1
- package/dist/chunk-QU2RFFH4.js +0 -3
- package/dist/chunk-QU2RFFH4.js.map +0 -1
- package/dist/chunk-RP7VZUEL.js +0 -49
- package/dist/chunk-RP7VZUEL.js.map +0 -1
- package/dist/chunk-SHTTJMLT.cjs +0 -361
- package/dist/chunk-SHTTJMLT.cjs.map +0 -1
- package/dist/chunk-SX76DNOO.js +0 -103
- package/dist/chunk-SX76DNOO.js.map +0 -1
- package/dist/chunk-THBQG64D.cjs +0 -425
- package/dist/chunk-THBQG64D.cjs.map +0 -1
- package/dist/chunk-TQG7G7YI.cjs +0 -526
- package/dist/chunk-TQG7G7YI.cjs.map +0 -1
- package/dist/chunk-U3VVLYXG.cjs +0 -189
- package/dist/chunk-U3VVLYXG.cjs.map +0 -1
- package/dist/chunk-UUDTPZX6.js +0 -193
- package/dist/chunk-UUDTPZX6.js.map +0 -1
- package/dist/chunk-V5AWATUP.js +0 -1059
- package/dist/chunk-V5AWATUP.js.map +0 -1
- package/dist/chunk-VAXLFZCV.cjs +0 -110
- package/dist/chunk-VAXLFZCV.cjs.map +0 -1
- package/dist/chunk-VKREAIBA.cjs +0 -1139
- package/dist/chunk-VKREAIBA.cjs.map +0 -1
- package/dist/chunk-WDTTHKDS.js +0 -458
- package/dist/chunk-WDTTHKDS.js.map +0 -1
- package/dist/chunk-WXVB364T.js +0 -218
- package/dist/chunk-WXVB364T.js.map +0 -1
- package/dist/chunk-X4BPPD6K.js +0 -181
- package/dist/chunk-X4BPPD6K.js.map +0 -1
- package/dist/chunk-XEB7PH2E.js +0 -81
- package/dist/chunk-XEB7PH2E.js.map +0 -1
- package/dist/chunk-YT7HXXVN.js +0 -13
- package/dist/chunk-YT7HXXVN.js.map +0 -1
- package/dist/cli/index.cjs.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/client.cjs.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/drizzle/index.cjs.map +0 -1
- package/dist/drizzle/index.js.map +0 -1
- package/dist/fields/index.cjs.map +0 -1
- package/dist/fields/index.js.map +0 -1
- package/dist/graphql/index.cjs.map +0 -1
- package/dist/graphql/index.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/integration.cjs.map +0 -1
- package/dist/integration.js.map +0 -1
- package/dist/media-7WDX4BDJ.js +0 -4
- package/dist/media-7WDX4BDJ.js.map +0 -1
- package/dist/media-TUSLVRQ6.cjs +0 -17
- package/dist/media-TUSLVRQ6.cjs.map +0 -1
- package/dist/mongo-auth-adapter-GT4S7SCU.cjs +0 -17
- package/dist/mongo-auth-adapter-GT4S7SCU.cjs.map +0 -1
- package/dist/mongo-auth-adapter-M7VV4LNB.js +0 -4
- package/dist/mongo-auth-adapter-M7VV4LNB.js.map +0 -1
- package/dist/mongodb/index.cjs.map +0 -1
- package/dist/mongodb/index.js.map +0 -1
- package/dist/postgres-auth-adapter-AFAPISH7.js +0 -5
- package/dist/postgres-auth-adapter-AFAPISH7.js.map +0 -1
- package/dist/postgres-auth-adapter-SFDTLONT.cjs +0 -14
- package/dist/postgres-auth-adapter-SFDTLONT.cjs.map +0 -1
- package/dist/redis-adapter-UQX4EE3B.cjs +0 -13
- package/dist/redis-adapter-UQX4EE3B.cjs.map +0 -1
- package/dist/redis-adapter-XALOGWY3.js +0 -4
- package/dist/redis-adapter-XALOGWY3.js.map +0 -1
- package/dist/rest/index.cjs.map +0 -1
- package/dist/rest/index.js.map +0 -1
- package/dist/schema-6QL3USNB.cjs +0 -67
- package/dist/schema-6QL3USNB.cjs.map +0 -1
- package/dist/schema-FNNWEAAW.js +0 -6
- package/dist/schema-FNNWEAAW.js.map +0 -1
- package/dist/sqlite-adapter-AQB5TCGV.cjs +0 -13
- package/dist/sqlite-adapter-AQB5TCGV.cjs.map +0 -1
- package/dist/sqlite-adapter-N5H6IM2X.js +0 -4
- package/dist/sqlite-adapter-N5H6IM2X.js.map +0 -1
- package/dist/templates/index.cjs.map +0 -1
- package/dist/templates/index.js.map +0 -1
- package/dist/trpc/index.cjs.map +0 -1
- package/dist/trpc/index.js.map +0 -1
- package/dist/ws/index.cjs.map +0 -1
- package/dist/ws/index.js.map +0 -1
package/dist/chunk-GUUB5EAG.cjs
DELETED
|
@@ -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"]}
|
package/dist/chunk-GXFOGU7N.cjs
DELETED
|
@@ -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
|