@kyro-cms/core 0.3.2 → 0.3.4
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/{WebhookService-BznDc2AT.d.ts → WebhookService-BCpW2dyL.d.ts} +1 -1
- package/dist/{WebhookService-mZZ75syh.d.cts → WebhookService-DxYSFvNg.d.cts} +1 -1
- package/dist/api-handler.cjs +52 -0
- package/dist/api-handler.cjs.map +1 -0
- package/dist/api-handler.d.cts +9 -0
- package/dist/api-handler.d.ts +9 -0
- package/dist/api-handler.js +46 -0
- package/dist/api-handler.js.map +1 -0
- package/dist/{base-Hu6ij8sZ.d.ts → base-DvvNqnM-.d.cts} +16 -5
- package/dist/{base-Db9LkB1N.d.cts → base-eVegJ_Pr.d.ts} +16 -5
- package/dist/bootstrap-DGJ3N7SO.js +6 -0
- package/dist/{bootstrap-LL6O7PWO.js.map → bootstrap-DGJ3N7SO.js.map} +1 -1
- package/dist/bootstrap-O5UGUTYU.cjs +31 -0
- package/dist/{bootstrap-BMWVB2T6.cjs.map → bootstrap-O5UGUTYU.cjs.map} +1 -1
- package/dist/{chunk-QKOFKITP.js → chunk-2HFJUUFZ.js} +3 -11
- package/dist/chunk-2HFJUUFZ.js.map +1 -0
- package/dist/chunk-2SJATAN4.js +5514 -0
- package/dist/chunk-2SJATAN4.js.map +1 -0
- package/dist/{chunk-DIC236EW.js → chunk-342BJNBI.js} +167 -24
- package/dist/chunk-342BJNBI.js.map +1 -0
- package/dist/{chunk-OUGKLCYF.js → chunk-3AJE4SEG.js} +4 -3
- package/dist/chunk-3AJE4SEG.js.map +1 -0
- package/dist/chunk-6LPNEC6D.js +617 -0
- package/dist/chunk-6LPNEC6D.js.map +1 -0
- package/dist/{chunk-BXMWDUED.js → chunk-A4USRVTQ.js} +2 -2
- package/dist/chunk-A4USRVTQ.js.map +1 -0
- package/dist/chunk-ADLJSJSN.cjs +13 -0
- package/dist/chunk-ADLJSJSN.cjs.map +1 -0
- package/dist/chunk-ATBOUGQP.cjs +513 -0
- package/dist/chunk-ATBOUGQP.cjs.map +1 -0
- package/dist/{chunk-KB6QF4HO.js → chunk-B76I67F3.js} +246 -141
- package/dist/chunk-B76I67F3.js.map +1 -0
- package/dist/chunk-BQ2T4WRS.js +140 -0
- package/dist/chunk-BQ2T4WRS.js.map +1 -0
- package/dist/chunk-CZ3HWX2X.cjs +622 -0
- package/dist/chunk-CZ3HWX2X.cjs.map +1 -0
- package/dist/{chunk-PNBZZ76A.cjs → chunk-DAIBBBOL.cjs} +246 -140
- package/dist/chunk-DAIBBBOL.cjs.map +1 -0
- package/dist/{chunk-U74F3YZU.js → chunk-DBUYB32X.js} +15 -3
- package/dist/chunk-DBUYB32X.js.map +1 -0
- package/dist/chunk-DLHUQO25.cjs +1746 -0
- package/dist/chunk-DLHUQO25.cjs.map +1 -0
- package/dist/{chunk-GE5DMB44.js → chunk-E3BZLMX6.js} +55 -49
- package/dist/chunk-E3BZLMX6.js.map +1 -0
- package/dist/{chunk-44BF6ALS.cjs → chunk-H4XCAPA6.cjs} +55 -49
- package/dist/chunk-H4XCAPA6.cjs.map +1 -0
- package/dist/{chunk-VIONYQ2K.cjs → chunk-IBG6V56E.cjs} +16 -32
- package/dist/chunk-IBG6V56E.cjs.map +1 -0
- package/dist/{chunk-LIJVWQKU.cjs → chunk-IX3ABYKZ.cjs} +43 -31
- package/dist/chunk-IX3ABYKZ.cjs.map +1 -0
- package/dist/chunk-JYGIFBBS.cjs +146 -0
- package/dist/chunk-JYGIFBBS.cjs.map +1 -0
- package/dist/{chunk-42JPONZU.cjs → chunk-K7JPTH3G.cjs} +17 -16
- package/dist/chunk-K7JPTH3G.cjs.map +1 -0
- package/dist/{chunk-RLTG4YZM.cjs → chunk-KOCTZKPV.cjs} +2 -2
- package/dist/chunk-KOCTZKPV.cjs.map +1 -0
- package/dist/chunk-MMYAIYHJ.cjs +5538 -0
- package/dist/chunk-MMYAIYHJ.cjs.map +1 -0
- package/dist/{chunk-EWP5AT6A.cjs → chunk-N4H37VN4.cjs} +2 -11
- package/dist/chunk-N4H37VN4.cjs.map +1 -0
- package/dist/chunk-P2YW545G.js +11 -0
- package/dist/chunk-P2YW545G.js.map +1 -0
- package/dist/chunk-Q23JB3KL.js +488 -0
- package/dist/chunk-Q23JB3KL.js.map +1 -0
- package/dist/{chunk-E5X75WNB.js → chunk-QXIQWPAP.js} +14 -30
- package/dist/chunk-QXIQWPAP.js.map +1 -0
- package/dist/chunk-R3XIBBAW.cjs +34 -0
- package/dist/chunk-R3XIBBAW.cjs.map +1 -0
- package/dist/{chunk-KWGNR4HM.js → chunk-REK7AYOC.js} +82 -9
- package/dist/chunk-REK7AYOC.js.map +1 -0
- package/dist/chunk-RGIQKTZ7.js +68 -0
- package/dist/chunk-RGIQKTZ7.js.map +1 -0
- package/dist/chunk-RYDGMBIG.js +1737 -0
- package/dist/chunk-RYDGMBIG.js.map +1 -0
- package/dist/chunk-SDMNUYVU.js +30 -0
- package/dist/chunk-SDMNUYVU.js.map +1 -0
- package/dist/chunk-VEI5KQVC.cjs +1246 -0
- package/dist/chunk-VEI5KQVC.cjs.map +1 -0
- package/dist/{chunk-FTSSDDZQ.cjs → chunk-VJT6P4N6.cjs} +82 -9
- package/dist/chunk-VJT6P4N6.cjs.map +1 -0
- package/dist/{chunk-HT6VE4NW.cjs → chunk-W3KPQX7V.cjs} +168 -25
- package/dist/chunk-W3KPQX7V.cjs.map +1 -0
- package/dist/{chunk-LTRCYJAG.js → chunk-WOWUL7ZY.js} +3 -2
- package/dist/chunk-WOWUL7ZY.js.map +1 -0
- package/dist/{chunk-7YITG2US.cjs → chunk-WQBRWOQT.cjs} +3 -2
- package/dist/chunk-WQBRWOQT.cjs.map +1 -0
- package/dist/chunk-X3CU27OO.cjs +78 -0
- package/dist/chunk-X3CU27OO.cjs.map +1 -0
- package/dist/chunk-XIXGJGQW.js +1228 -0
- package/dist/chunk-XIXGJGQW.js.map +1 -0
- package/dist/cli/index.cjs +2 -2
- package/dist/cli/index.js +2 -2
- package/dist/client.cjs +23 -13
- package/dist/client.d.cts +4 -2
- package/dist/client.d.ts +4 -2
- package/dist/client.js +3 -1
- package/dist/drizzle/index.cjs +20 -19
- package/dist/drizzle/index.d.cts +28 -7
- package/dist/drizzle/index.d.ts +28 -7
- package/dist/drizzle/index.js +5 -4
- package/dist/fields/index.cjs +105 -0
- package/dist/fields/index.cjs.map +1 -0
- package/dist/fields/index.d.cts +27 -0
- package/dist/fields/index.d.ts +27 -0
- package/dist/fields/index.js +4 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/graphql/index.cjs +4 -3
- package/dist/graphql/index.d.cts +3 -2
- package/dist/graphql/index.d.ts +3 -2
- package/dist/graphql/index.js +2 -1
- package/dist/{index-Ci6r4xnN.d.ts → index-CLp-DRKA.d.ts} +2 -1
- package/dist/{index-11MDNKce.d.cts → index-DfO7G4kN.d.cts} +2 -1
- package/dist/index.cjs +2621 -6672
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +136 -47
- package/dist/index.d.ts +136 -47
- package/dist/index.js +2333 -6546
- package/dist/index.js.map +1 -1
- package/dist/integration.cjs +68 -0
- package/dist/integration.cjs.map +1 -0
- package/dist/integration.d.cts +27 -0
- package/dist/integration.d.ts +27 -0
- package/dist/integration.js +61 -0
- package/dist/integration.js.map +1 -0
- package/dist/mongodb/index.cjs +4 -4
- package/dist/mongodb/index.d.cts +20 -6
- package/dist/mongodb/index.d.ts +20 -6
- package/dist/mongodb/index.js +2 -2
- package/dist/postgres-auth-adapter-7F3ECO7I.js +5 -0
- package/dist/{postgres-auth-adapter-OTRWSTT5.js.map → postgres-auth-adapter-7F3ECO7I.js.map} +1 -1
- package/dist/postgres-auth-adapter-Z463NYJZ.cjs +14 -0
- package/dist/{postgres-auth-adapter-EVRPO7BQ.cjs.map → postgres-auth-adapter-Z463NYJZ.cjs.map} +1 -1
- package/dist/redis-adapter-LPUWLE4Y.cjs +13 -0
- package/dist/{redis-adapter-E7PMN5HW.cjs.map → redis-adapter-LPUWLE4Y.cjs.map} +1 -1
- package/dist/redis-adapter-THYDCGQR.js +4 -0
- package/dist/{redis-adapter-HOO67RBQ.js.map → redis-adapter-THYDCGQR.js.map} +1 -1
- package/dist/rest/index.cjs +8 -5
- package/dist/rest/index.d.cts +6 -3
- package/dist/rest/index.d.ts +6 -3
- package/dist/rest/index.js +6 -3
- package/dist/{schema-CNB2DDTX.js → schema-6Q4W6AE6.js} +3 -3
- package/dist/{schema-CNB2DDTX.js.map → schema-6Q4W6AE6.js.map} +1 -1
- package/dist/{schema-Y777CQQS.cjs → schema-TIYTCIKX.cjs} +14 -14
- package/dist/{schema-Y777CQQS.cjs.map → schema-TIYTCIKX.cjs.map} +1 -1
- package/dist/templates/index.cjs +27 -23
- package/dist/templates/index.d.cts +8 -2
- package/dist/templates/index.d.ts +8 -2
- package/dist/templates/index.js +1 -1
- package/dist/trpc/index.cjs +12 -11
- package/dist/trpc/index.d.cts +3 -2
- package/dist/trpc/index.d.ts +3 -2
- package/dist/trpc/index.js +3 -2
- package/dist/{types-kGfsGdos.d.cts → types-Bs1up4yP.d.ts} +76 -244
- package/dist/{types-1u353OHN.d.ts → types-Da83JLDk.d.cts} +6 -2
- package/dist/{types-1u353OHN.d.cts → types-Da83JLDk.d.ts} +6 -2
- package/dist/{types-kGfsGdos.d.ts → types-J3R9nVsZ.d.cts} +76 -244
- package/dist/types-VtjUxIMp.d.cts +246 -0
- package/dist/types-VtjUxIMp.d.ts +246 -0
- package/package.json +16 -9
- package/dist/bootstrap-BMWVB2T6.cjs +0 -31
- package/dist/bootstrap-LL6O7PWO.js +0 -6
- package/dist/chunk-42JPONZU.cjs.map +0 -1
- package/dist/chunk-44BF6ALS.cjs.map +0 -1
- package/dist/chunk-4M5PHMUE.cjs +0 -947
- package/dist/chunk-4M5PHMUE.cjs.map +0 -1
- package/dist/chunk-6MSSF46R.js +0 -941
- package/dist/chunk-6MSSF46R.js.map +0 -1
- package/dist/chunk-7YITG2US.cjs.map +0 -1
- package/dist/chunk-BTOE3VUK.js +0 -330
- package/dist/chunk-BTOE3VUK.js.map +0 -1
- package/dist/chunk-BXMWDUED.js.map +0 -1
- package/dist/chunk-DIC236EW.js.map +0 -1
- package/dist/chunk-E5X75WNB.js.map +0 -1
- package/dist/chunk-E63IF3MD.cjs +0 -951
- package/dist/chunk-E63IF3MD.cjs.map +0 -1
- package/dist/chunk-EWP5AT6A.cjs.map +0 -1
- package/dist/chunk-FTSSDDZQ.cjs.map +0 -1
- package/dist/chunk-GE5DMB44.js.map +0 -1
- package/dist/chunk-GVFB5C6O.cjs +0 -345
- package/dist/chunk-GVFB5C6O.cjs.map +0 -1
- package/dist/chunk-HT6VE4NW.cjs.map +0 -1
- package/dist/chunk-HVSQDZZJ.cjs +0 -765
- package/dist/chunk-HVSQDZZJ.cjs.map +0 -1
- package/dist/chunk-HYC4GNHX.js +0 -758
- package/dist/chunk-HYC4GNHX.js.map +0 -1
- package/dist/chunk-KB6QF4HO.js.map +0 -1
- package/dist/chunk-KWGNR4HM.js.map +0 -1
- package/dist/chunk-LIJVWQKU.cjs.map +0 -1
- package/dist/chunk-LTRCYJAG.js.map +0 -1
- package/dist/chunk-OUGKLCYF.js.map +0 -1
- package/dist/chunk-PNBZZ76A.cjs.map +0 -1
- package/dist/chunk-QKOFKITP.js.map +0 -1
- package/dist/chunk-RLTG4YZM.cjs.map +0 -1
- package/dist/chunk-RRYXQMZG.js +0 -935
- package/dist/chunk-RRYXQMZG.js.map +0 -1
- package/dist/chunk-U74F3YZU.js.map +0 -1
- package/dist/chunk-VIONYQ2K.cjs.map +0 -1
- package/dist/postgres-auth-adapter-EVRPO7BQ.cjs +0 -14
- package/dist/postgres-auth-adapter-OTRWSTT5.js +0 -5
- package/dist/redis-adapter-E7PMN5HW.cjs +0 -13
- package/dist/redis-adapter-HOO67RBQ.js +0 -4
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { AbstractBaseAdapter } from './chunk-
|
|
1
|
+
import { AbstractBaseAdapter } from './chunk-A4USRVTQ.js';
|
|
2
|
+
import { randomBytes } from 'crypto';
|
|
2
3
|
|
|
3
|
-
// src/database/mongodb/adapter.ts
|
|
4
4
|
var MongoDBAdapter = class extends AbstractBaseAdapter {
|
|
5
5
|
client;
|
|
6
6
|
db;
|
|
7
7
|
database;
|
|
8
|
+
draftsCollectionName = "kyro_drafts";
|
|
8
9
|
constructor(options) {
|
|
9
10
|
super();
|
|
10
11
|
this.client = options.client;
|
|
@@ -29,10 +30,13 @@ var MongoDBAdapter = class extends AbstractBaseAdapter {
|
|
|
29
30
|
return this.db.collection(slug);
|
|
30
31
|
}
|
|
31
32
|
async find(args) {
|
|
32
|
-
const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select } = args;
|
|
33
|
+
const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select, draft } = args;
|
|
33
34
|
const config = this.getCollectionConfig(slug);
|
|
34
35
|
const col = this.getMongoCollection(slug);
|
|
35
36
|
const filter = this.buildFilter(where, tenantID);
|
|
37
|
+
if (!draft) {
|
|
38
|
+
filter._status = "published";
|
|
39
|
+
}
|
|
36
40
|
const sortOption = this.parseSort(sort);
|
|
37
41
|
const sortObj = {
|
|
38
42
|
[sortOption.field]: sortOption.direction === "asc" ? 1 : -1
|
|
@@ -42,23 +46,54 @@ var MongoDBAdapter = class extends AbstractBaseAdapter {
|
|
|
42
46
|
col.find(filter).sort(sortObj).skip(skip).limit(limit).project(this.buildProjection(select)).toArray(),
|
|
43
47
|
col.countDocuments(filter)
|
|
44
48
|
]);
|
|
45
|
-
|
|
49
|
+
let processedDocs = docs.map((doc) => this.processResult(doc, config));
|
|
50
|
+
if (draft) {
|
|
51
|
+
processedDocs = await Promise.all(processedDocs.map(async (doc) => {
|
|
52
|
+
if (doc._has_draft) {
|
|
53
|
+
const versions = await this.findVersions({
|
|
54
|
+
collection: slug,
|
|
55
|
+
documentId: doc.id,
|
|
56
|
+
limit: 1,
|
|
57
|
+
sort: "-createdAt"
|
|
58
|
+
});
|
|
59
|
+
if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
|
|
60
|
+
return { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return doc;
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
46
66
|
return {
|
|
47
67
|
docs: processedDocs,
|
|
48
68
|
...this.calculatePagination(page, limit, totalDocs)
|
|
49
69
|
};
|
|
50
70
|
}
|
|
51
71
|
async findByID(args) {
|
|
52
|
-
const { collection: slug, id, tenantID } = args;
|
|
72
|
+
const { collection: slug, id, tenantID, draft } = args;
|
|
53
73
|
const config = this.getCollectionConfig(slug);
|
|
54
74
|
const col = this.getMongoCollection(slug);
|
|
55
75
|
const filter = { _id: id };
|
|
56
76
|
if (tenantID) {
|
|
57
77
|
filter.tenantId = tenantID;
|
|
58
78
|
}
|
|
79
|
+
if (!draft) {
|
|
80
|
+
filter._status = "published";
|
|
81
|
+
}
|
|
59
82
|
const doc = await col.findOne(filter);
|
|
60
83
|
if (!doc) return null;
|
|
61
|
-
|
|
84
|
+
let processedDoc = this.processResult(doc, config);
|
|
85
|
+
if (draft && processedDoc._has_draft) {
|
|
86
|
+
const versions = await this.findVersions({
|
|
87
|
+
collection: slug,
|
|
88
|
+
documentId: processedDoc.id,
|
|
89
|
+
limit: 1,
|
|
90
|
+
sort: "-createdAt"
|
|
91
|
+
});
|
|
92
|
+
if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
|
|
93
|
+
processedDoc = { ...processedDoc, ...versions.docs[0].data, _has_draft: true, _status: processedDoc._status };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return processedDoc;
|
|
62
97
|
}
|
|
63
98
|
async create(args) {
|
|
64
99
|
const { collection: slug, data, tenantID } = args;
|
|
@@ -114,18 +149,34 @@ var MongoDBAdapter = class extends AbstractBaseAdapter {
|
|
|
114
149
|
return col.countDocuments(filter);
|
|
115
150
|
}
|
|
116
151
|
async findOne(args) {
|
|
117
|
-
const { collection: slug, where = {}, tenantID } = args;
|
|
152
|
+
const { collection: slug, where = {}, tenantID, draft } = args;
|
|
118
153
|
const config = this.getCollectionConfig(slug);
|
|
119
154
|
const col = this.getMongoCollection(slug);
|
|
120
155
|
const filter = this.buildFilter(where, tenantID);
|
|
156
|
+
if (!draft) {
|
|
157
|
+
filter._status = "published";
|
|
158
|
+
}
|
|
121
159
|
const doc = await col.findOne(filter);
|
|
122
160
|
if (!doc) return null;
|
|
123
|
-
|
|
161
|
+
let processedDoc = this.processResult(doc, config);
|
|
162
|
+
if (draft && processedDoc._has_draft) {
|
|
163
|
+
const versions = await this.findVersions({
|
|
164
|
+
collection: slug,
|
|
165
|
+
documentId: processedDoc.id,
|
|
166
|
+
limit: 1,
|
|
167
|
+
sort: "-createdAt"
|
|
168
|
+
});
|
|
169
|
+
if (versions.docs.length > 0 && versions.docs[0].status === "draft") {
|
|
170
|
+
processedDoc = { ...processedDoc, ...versions.docs[0].data, _has_draft: true, _status: processedDoc._status };
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return processedDoc;
|
|
124
174
|
}
|
|
125
175
|
async findVersions(args) {
|
|
126
|
-
const { collection: slug,
|
|
176
|
+
const { collection: slug, documentId, sort, limit = 10, page = 1, tenantID } = args;
|
|
127
177
|
const versionCollection = this.getMongoCollection(`${slug}_versions`);
|
|
128
|
-
const filter =
|
|
178
|
+
const filter = { document_id: documentId };
|
|
179
|
+
if (tenantID) filter.tenant_id = tenantID;
|
|
129
180
|
const skip = (page - 1) * limit;
|
|
130
181
|
const sortOption = this.parseSort(sort);
|
|
131
182
|
const sortObj = {
|
|
@@ -141,25 +192,100 @@ var MongoDBAdapter = class extends AbstractBaseAdapter {
|
|
|
141
192
|
};
|
|
142
193
|
}
|
|
143
194
|
async findVersionByID(args) {
|
|
144
|
-
const { collection: slug,
|
|
195
|
+
const { collection: slug, versionId, tenantID } = args;
|
|
145
196
|
const versionCollection = this.getMongoCollection(`${slug}_versions`);
|
|
146
|
-
|
|
197
|
+
const filter = { _id: versionId };
|
|
198
|
+
if (tenantID) filter.tenant_id = tenantID;
|
|
199
|
+
const doc = await versionCollection.findOne(filter);
|
|
200
|
+
return doc ? this.processResult(doc, {}) : null;
|
|
147
201
|
}
|
|
148
202
|
async createVersion(args) {
|
|
149
|
-
const { collection: slug, data } = args;
|
|
203
|
+
const { collection: slug, documentId, data, status, createdBy, changeDescription, tenantID } = args;
|
|
150
204
|
const versionCollection = this.getMongoCollection(`${slug}_versions`);
|
|
151
|
-
const
|
|
152
|
-
...data,
|
|
205
|
+
const versionDoc = {
|
|
153
206
|
_id: this.generateId(),
|
|
154
|
-
|
|
207
|
+
document_id: documentId,
|
|
208
|
+
collection_slug: slug,
|
|
209
|
+
tenant_id: tenantID,
|
|
210
|
+
data,
|
|
211
|
+
status,
|
|
212
|
+
created_by: createdBy,
|
|
213
|
+
change_description: changeDescription,
|
|
214
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
215
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
155
216
|
};
|
|
156
|
-
await versionCollection.insertOne(
|
|
157
|
-
|
|
217
|
+
await versionCollection.insertOne(versionDoc);
|
|
218
|
+
const config = this.getCollectionConfig(slug);
|
|
219
|
+
if (config.versions?.maxPerDoc) {
|
|
220
|
+
await this.deleteVersions({
|
|
221
|
+
collection: slug,
|
|
222
|
+
documentId,
|
|
223
|
+
keepLatest: config.versions.maxPerDoc,
|
|
224
|
+
tenantID
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
return this.processResult(versionDoc, {});
|
|
158
228
|
}
|
|
159
229
|
async deleteVersions(args) {
|
|
160
|
-
const { collection: slug,
|
|
230
|
+
const { collection: slug, documentId, keepLatest, tenantID } = args;
|
|
161
231
|
const versionCollection = this.getMongoCollection(`${slug}_versions`);
|
|
162
|
-
|
|
232
|
+
if (keepLatest) {
|
|
233
|
+
const filter = { document_id: documentId };
|
|
234
|
+
if (tenantID) filter.tenant_id = tenantID;
|
|
235
|
+
const toKeep = await versionCollection.find(filter).sort({ createdAt: -1 }).limit(keepLatest).project({ _id: 1 }).toArray();
|
|
236
|
+
const keepIds = toKeep.map((doc) => doc._id);
|
|
237
|
+
if (keepIds.length > 0) {
|
|
238
|
+
await versionCollection.deleteMany({
|
|
239
|
+
document_id: documentId,
|
|
240
|
+
_id: { $nin: keepIds },
|
|
241
|
+
...tenantID ? { tenant_id: tenantID } : {}
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
} else {
|
|
245
|
+
const filter = { document_id: documentId };
|
|
246
|
+
if (tenantID) filter.tenant_id = tenantID;
|
|
247
|
+
await versionCollection.deleteMany(filter);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async findDraft(args) {
|
|
251
|
+
const draft = await this.getMongoCollection(this.draftsCollectionName).findOne({
|
|
252
|
+
_id: this.getDraftId(args.collection, args.documentId, args.tenantID)
|
|
253
|
+
});
|
|
254
|
+
return draft ? this.docToDraft(draft) : null;
|
|
255
|
+
}
|
|
256
|
+
async upsertDraft(args) {
|
|
257
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
258
|
+
const draftUpdatedAt = args.draftUpdatedAt || now;
|
|
259
|
+
const _id = this.getDraftId(args.collection, args.documentId, args.tenantID);
|
|
260
|
+
const existing = await this.getMongoCollection(this.draftsCollectionName).findOne({ _id });
|
|
261
|
+
await this.getMongoCollection(this.draftsCollectionName).updateOne(
|
|
262
|
+
{ _id },
|
|
263
|
+
{
|
|
264
|
+
$set: {
|
|
265
|
+
collectionSlug: args.collection,
|
|
266
|
+
documentId: args.documentId,
|
|
267
|
+
tenantId: args.tenantID,
|
|
268
|
+
data: args.data,
|
|
269
|
+
baseUpdatedAt: args.baseUpdatedAt ?? null,
|
|
270
|
+
draftUpdatedAt,
|
|
271
|
+
updatedAt: now
|
|
272
|
+
},
|
|
273
|
+
$setOnInsert: {
|
|
274
|
+
createdAt: existing?.createdAt || now
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
{ upsert: true }
|
|
278
|
+
);
|
|
279
|
+
const saved = await this.getMongoCollection(this.draftsCollectionName).findOne({ _id });
|
|
280
|
+
if (!saved) {
|
|
281
|
+
throw new Error("Failed to persist draft snapshot");
|
|
282
|
+
}
|
|
283
|
+
return this.docToDraft(saved);
|
|
284
|
+
}
|
|
285
|
+
async deleteDraft(args) {
|
|
286
|
+
await this.getMongoCollection(this.draftsCollectionName).deleteOne({
|
|
287
|
+
_id: this.getDraftId(args.collection, args.documentId, args.tenantID)
|
|
288
|
+
});
|
|
163
289
|
}
|
|
164
290
|
async migrate() {
|
|
165
291
|
for (const config of this.collections.values()) {
|
|
@@ -180,6 +306,7 @@ var MongoDBAdapter = class extends AbstractBaseAdapter {
|
|
|
180
306
|
}
|
|
181
307
|
}
|
|
182
308
|
}
|
|
309
|
+
await this.getMongoCollection(this.draftsCollectionName).createIndex({ updatedAt: -1 });
|
|
183
310
|
console.log(`[MongoDBAdapter] Migration completed`);
|
|
184
311
|
}
|
|
185
312
|
// ========================================================================
|
|
@@ -251,6 +378,22 @@ var MongoDBAdapter = class extends AbstractBaseAdapter {
|
|
|
251
378
|
}
|
|
252
379
|
return filter;
|
|
253
380
|
}
|
|
381
|
+
getDraftId(collection, documentId, tenantID) {
|
|
382
|
+
return `${collection}::${documentId}::${tenantID || "global"}`;
|
|
383
|
+
}
|
|
384
|
+
docToDraft(doc) {
|
|
385
|
+
return {
|
|
386
|
+
id: String(doc._id),
|
|
387
|
+
collection: doc.collectionSlug,
|
|
388
|
+
documentId: doc.documentId,
|
|
389
|
+
tenantID: doc.tenantId ?? void 0,
|
|
390
|
+
data: doc.data || {},
|
|
391
|
+
baseUpdatedAt: doc.baseUpdatedAt ?? null,
|
|
392
|
+
draftUpdatedAt: doc.draftUpdatedAt,
|
|
393
|
+
createdAt: doc.createdAt,
|
|
394
|
+
updatedAt: doc.updatedAt
|
|
395
|
+
};
|
|
396
|
+
}
|
|
254
397
|
buildProjection(select) {
|
|
255
398
|
if (!select || select.length === 0) return void 0;
|
|
256
399
|
const projection = { _id: 1 };
|
|
@@ -276,8 +419,8 @@ var MongoDBAdapter = class extends AbstractBaseAdapter {
|
|
|
276
419
|
return result;
|
|
277
420
|
}
|
|
278
421
|
generateId() {
|
|
279
|
-
const timestamp =
|
|
280
|
-
const random =
|
|
422
|
+
const timestamp = Date.now().toString(16).padStart(12, "0");
|
|
423
|
+
const random = randomBytes(6).toString("hex");
|
|
281
424
|
return timestamp + random;
|
|
282
425
|
}
|
|
283
426
|
};
|
|
@@ -286,5 +429,5 @@ function createMongoDBAdapter(options) {
|
|
|
286
429
|
}
|
|
287
430
|
|
|
288
431
|
export { MongoDBAdapter, createMongoDBAdapter };
|
|
289
|
-
//# sourceMappingURL=chunk-
|
|
290
|
-
//# sourceMappingURL=chunk-
|
|
432
|
+
//# sourceMappingURL=chunk-342BJNBI.js.map
|
|
433
|
+
//# sourceMappingURL=chunk-342BJNBI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/database/mongodb/adapter.ts"],"names":[],"mappings":"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","file":"chunk-342BJNBI.js","sourcesContent":["import { randomBytes } from 'crypto';\nimport { AbstractBaseAdapter } from '../base.js';\nimport type {\n CollectionConfig,\n GlobalConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n DraftFindArgs,\n DraftUpsertArgs,\n DraftDeleteArgs,\n DraftSnapshot,\n VersionRecord,\n CreateVersionArgs,\n FindVersionsArgs,\n} from '../../registry/types.js';\n\n// ============================================================================\n// MongoDB Adapter\n// ============================================================================\n\nexport class MongoDBAdapter extends AbstractBaseAdapter {\n private client: any;\n private db: any;\n private database: string;\n private readonly draftsCollectionName = 'kyro_drafts';\n \n constructor(options: {\n client: any;\n database: string;\n }) {\n super();\n this.client = options.client;\n this.database = options.database;\n }\n\n async connect(): Promise<void> {\n this.db = this.client.db(this.database);\n this.connected = true;\n console.log(`[MongoDBAdapter] Connected to database: ${this.database}`);\n }\n\n async disconnect(): Promise<void> {\n if (this.client) {\n await this.client.close();\n this.connected = false;\n console.log(`[MongoDBAdapter] Disconnected`);\n }\n }\n\n private getMongoCollection(slug: string): any {\n if (!this.db) {\n throw new Error('MongoDB not connected');\n }\n return this.db.collection(slug);\n }\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select, draft } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n // Build filter\n const filter = this.buildFilter(where, tenantID);\n \n // Default filter for non-draft requests: only show published\n if (!draft) {\n filter._status = 'published';\n }\n\n // Build sort\n const sortOption = this.parseSort(sort);\n const sortObj: Record<string, 1 | -1> = {\n [sortOption.field]: sortOption.direction === 'asc' ? 1 : -1,\n };\n\n // Execute query\n const skip = (page - 1) * limit;\n \n const [docs, totalDocs] = await Promise.all([\n col\n .find(filter)\n .sort(sortObj)\n .skip(skip)\n .limit(limit)\n .project(this.buildProjection(select))\n .toArray(),\n col.countDocuments(filter),\n ]);\n\n // Process results\n let processedDocs = docs.map((doc: any) => this.processResult(doc, config));\n\n // If draft: true, we need to check if any docs have a separate draft version\n if (draft) {\n processedDocs = await Promise.all(processedDocs.map(async (doc: any) => {\n if (doc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: doc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n return { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };\n }\n }\n return doc;\n }));\n }\n\n return {\n docs: processedDocs as T[],\n ...this.calculatePagination(page, limit, totalDocs),\n };\n }\n\n async findByID<T>(args: FindByIDArgs): Promise<T | null> {\n const { collection: slug, id, tenantID, draft } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n const filter: any = { _id: id };\n if (tenantID) {\n filter.tenantId = tenantID;\n }\n \n if (!draft) {\n filter._status = 'published';\n }\n\n const doc = await col.findOne(filter);\n if (!doc) return null;\n\n let processedDoc = this.processResult(doc, config);\n\n // If draft: true and doc has a separate draft, merge it\n if (draft && processedDoc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: processedDoc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n processedDoc = { ...processedDoc, ...versions.docs[0].data, _has_draft: true, _status: processedDoc._status };\n }\n }\n\n return processedDoc as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n const doc: any = {\n ...this.prepareData(data, config),\n _id: this.generateId(),\n };\n\n if (tenantID) {\n doc.tenantId = tenantID;\n }\n\n await col.insertOne(doc);\n\n return this.processResult(doc, config) as T;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n const filter: any = { _id: id };\n if (tenantID) {\n filter.tenantId = tenantID;\n }\n\n const updateData = this.prepareData(data, config);\n\n const result = await col.findOneAndUpdate(\n filter,\n { $set: updateData },\n { returnDocument: 'after' }\n );\n\n if (!result) {\n throw new Error(`Document not found: ${slug}/${id}`);\n }\n\n return this.processResult(result, config) as T;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n const filter: any = { _id: id };\n if (tenantID) {\n filter.tenantId = tenantID;\n }\n\n const doc = await col.findOneAndDelete(filter);\n if (!doc) {\n throw new Error(`Document not found: ${slug}/${id}`);\n }\n\n return this.processResult(doc, config) as T;\n }\n\n async count(args: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number> {\n const { collection: slug, where = {}, tenantID } = args;\n const col = this.getMongoCollection(slug);\n const filter = this.buildFilter(where, tenantID);\n return col.countDocuments(filter);\n }\n\n async findOne(args: { collection: string; where: Record<string, any>; tenantID?: string; draft?: boolean }): Promise<any> {\n const { collection: slug, where = {}, tenantID, draft } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n const filter = this.buildFilter(where, tenantID);\n\n if (!draft) {\n filter._status = 'published';\n }\n\n const doc = await col.findOne(filter);\n if (!doc) return null;\n\n let processedDoc = this.processResult(doc, config);\n\n // If draft: true and doc has a separate draft, merge it\n if (draft && processedDoc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: processedDoc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n processedDoc = { ...processedDoc, ...versions.docs[0].data, _has_draft: true, _status: processedDoc._status };\n }\n }\n\n return processedDoc;\n }\n\n async findVersions(args: FindVersionsArgs): Promise<FindResult<VersionRecord>> {\n const { collection: slug, documentId, sort, limit = 10, page = 1, tenantID } = args;\n \n // Versions stored in a separate collection\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n const filter: any = { document_id: documentId };\n if (tenantID) filter.tenant_id = tenantID;\n\n const skip = (page - 1) * limit;\n const sortOption = this.parseSort(sort);\n const sortObj: Record<string, 1 | -1> = {\n [sortOption.field]: sortOption.direction === 'asc' ? 1 : -1,\n };\n\n const [docs, totalDocs] = await Promise.all([\n versionCollection.find(filter).sort(sortObj).skip(skip).limit(limit).toArray(),\n versionCollection.countDocuments(filter),\n ]);\n\n return {\n docs: docs.map((doc: any) => this.processResult(doc, {} as CollectionConfig) as VersionRecord),\n ...this.calculatePagination(page, limit, totalDocs),\n };\n }\n\n async findVersionByID(args: { collection: string; versionId: string; tenantID?: string }): Promise<VersionRecord | null> {\n const { collection: slug, versionId, tenantID } = args;\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n const filter: any = { _id: versionId };\n if (tenantID) filter.tenant_id = tenantID;\n \n const doc = await versionCollection.findOne(filter);\n return doc ? this.processResult(doc, {} as CollectionConfig) as VersionRecord : null;\n }\n\n async createVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>> {\n const { collection: slug, documentId, data, status, createdBy, changeDescription, tenantID } = args;\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n\n const versionDoc: any = {\n _id: this.generateId(),\n document_id: documentId,\n collection_slug: slug,\n tenant_id: tenantID,\n data,\n status,\n created_by: createdBy,\n change_description: changeDescription,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n await versionCollection.insertOne(versionDoc);\n \n // Pruning logic\n const config = this.getCollectionConfig(slug);\n if (config.versions?.maxPerDoc) {\n await this.deleteVersions({\n collection: slug,\n documentId: documentId,\n keepLatest: config.versions.maxPerDoc,\n tenantID: tenantID,\n });\n }\n\n return this.processResult(versionDoc, {} as CollectionConfig) as VersionRecord<T>;\n }\n\n async deleteVersions(args: { collection: string; documentId: string; keepLatest?: number; tenantID?: string }): Promise<void> {\n const { collection: slug, documentId, keepLatest, tenantID } = args;\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n \n if (keepLatest) {\n const filter: any = { document_id: documentId };\n if (tenantID) filter.tenant_id = tenantID;\n\n const toKeep = await versionCollection\n .find(filter)\n .sort({ createdAt: -1 })\n .limit(keepLatest)\n .project({ _id: 1 })\n .toArray();\n\n const keepIds = toKeep.map((doc: any) => doc._id);\n if (keepIds.length > 0) {\n await versionCollection.deleteMany({\n document_id: documentId,\n _id: { $nin: keepIds },\n ...(tenantID ? { tenant_id: tenantID } : {}),\n });\n }\n } else {\n const filter: any = { document_id: documentId };\n if (tenantID) filter.tenant_id = tenantID;\n await versionCollection.deleteMany(filter);\n }\n }\n\n async findDraft<T>(args: DraftFindArgs): Promise<DraftSnapshot<T> | null> {\n const draft = await this.getMongoCollection(this.draftsCollectionName).findOne({\n _id: this.getDraftId(args.collection, args.documentId, args.tenantID),\n });\n\n return draft ? this.docToDraft<T>(draft) : null;\n }\n\n async upsertDraft<T>(args: DraftUpsertArgs<T>): Promise<DraftSnapshot<T>> {\n const now = new Date().toISOString();\n const draftUpdatedAt = args.draftUpdatedAt || now;\n const _id = this.getDraftId(args.collection, args.documentId, args.tenantID);\n const existing = await this.getMongoCollection(this.draftsCollectionName).findOne({ _id });\n\n await this.getMongoCollection(this.draftsCollectionName).updateOne(\n { _id },\n {\n $set: {\n collectionSlug: args.collection,\n documentId: args.documentId,\n tenantId: args.tenantID,\n data: args.data,\n baseUpdatedAt: args.baseUpdatedAt ?? null,\n draftUpdatedAt,\n updatedAt: now,\n },\n $setOnInsert: {\n createdAt: existing?.createdAt || now,\n },\n },\n { upsert: true },\n );\n\n const saved = await this.getMongoCollection(this.draftsCollectionName).findOne({ _id });\n if (!saved) {\n throw new Error('Failed to persist draft snapshot');\n }\n return this.docToDraft<T>(saved);\n }\n\n async deleteDraft(args: DraftDeleteArgs): Promise<void> {\n await this.getMongoCollection(this.draftsCollectionName).deleteOne({\n _id: this.getDraftId(args.collection, args.documentId, args.tenantID),\n });\n }\n\n async migrate?(): Promise<void> {\n // Create indexes for all collections\n for (const config of this.collections.values()) {\n const col = this.getMongoCollection(config.slug);\n\n // Create default indexes\n await col.createIndex({ _id: 1 });\n \n if (config.tenantScoped) {\n await col.createIndex({ tenantId: 1 });\n }\n\n if (config.timestamps) {\n await col.createIndex({ createdAt: -1 });\n }\n\n // Create unique indexes\n for (const field of config.fields) {\n if (field.unique && field.name) {\n await col.createIndex({ [field.name]: 1 }, { unique: true });\n }\n if (field.indexed && field.name) {\n await col.createIndex({ [field.name]: 1 });\n }\n }\n }\n\n await this.getMongoCollection(this.draftsCollectionName).createIndex({ updatedAt: -1 });\n \n console.log(`[MongoDBAdapter] Migration completed`);\n }\n\n // ========================================================================\n // Helper Methods\n // ========================================================================\n\n private getCollectionConfig(slug: string): CollectionConfig {\n const config = this.collections.get(slug);\n if (!config) {\n throw new Error(`Collection \"${slug}\" not found`);\n }\n return config;\n }\n\n private buildFilter(where: Record<string, any> = {}, tenantID?: string): Record<string, any> {\n const filter: Record<string, any> = {};\n\n // Apply tenant filter\n if (tenantID) {\n filter.tenantId = tenantID;\n }\n\n // Convert operators to MongoDB format\n for (const [key, value] of Object.entries(where)) {\n if (key === 'AND' && Array.isArray(value)) {\n const andConditions = value.map((v: any) => this.buildFilter(v));\n Object.assign(filter, ...andConditions);\n } else if (key === 'OR' && Array.isArray(value)) {\n filter.$or = value.map((v: any) => this.buildFilter(v));\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Operator-based conditions\n const mongoOperators: Record<string, any> = {};\n \n if (value.equals !== undefined) {\n filter[key === 'id' ? '_id' : key] = value.equals;\n continue;\n }\n if (value.not_equals !== undefined) {\n mongoOperators.$ne = value.not_equals;\n }\n if (value.in !== undefined) {\n mongoOperators.$in = value.in;\n }\n if (value.not_in !== undefined) {\n mongoOperators.$nin = value.not_in;\n }\n if (value.greater_than !== undefined) {\n mongoOperators.$gt = value.greater_than;\n }\n if (value.greater_than_equal !== undefined) {\n mongoOperators.$gte = value.greater_than_equal;\n }\n if (value.less_than !== undefined) {\n mongoOperators.$lt = value.less_than;\n }\n if (value.less_than_equal !== undefined) {\n mongoOperators.$lte = value.less_than_equal;\n }\n if (value.like !== undefined) {\n mongoOperators.$regex = new RegExp(value.like.replace(/%/g, '.*'), 'i');\n }\n if (value.not_like !== undefined) {\n mongoOperators.$not = new RegExp(value.not_like.replace(/%/g, '.*'), 'i');\n }\n if (value.contains !== undefined) {\n mongoOperators.$regex = new RegExp(`.*${value.contains}.*`, 'i');\n }\n if (value.exists !== undefined) {\n mongoOperators.$exists = value.exists;\n }\n\n if (Object.keys(mongoOperators).length > 0) {\n filter[key === 'id' ? '_id' : key] = mongoOperators;\n }\n } else {\n // Direct equality\n filter[key === 'id' ? '_id' : key] = value;\n }\n }\n\n return filter;\n }\n\n private getDraftId(collection: string, documentId: string, tenantID?: string): string {\n return `${collection}::${documentId}::${tenantID || 'global'}`;\n }\n\n private docToDraft<T>(doc: any): DraftSnapshot<T> {\n return {\n id: String(doc._id),\n collection: doc.collectionSlug,\n documentId: doc.documentId,\n tenantID: doc.tenantId ?? undefined,\n data: doc.data || {},\n baseUpdatedAt: doc.baseUpdatedAt ?? null,\n draftUpdatedAt: doc.draftUpdatedAt,\n createdAt: doc.createdAt,\n updatedAt: doc.updatedAt,\n };\n }\n\n private buildProjection(select?: string[]): Record<string, 1> | undefined {\n if (!select || select.length === 0) return undefined;\n \n const projection: Record<string, 1> = { _id: 1 };\n for (const field of select) {\n projection[field] = 1;\n }\n return projection;\n }\n\n private processResult(data: any, config: CollectionConfig): any {\n if (!data) return null;\n\n const result = { ...data };\n\n // Convert _id to id\n if (data._id) {\n result.id = data._id;\n delete result._id;\n }\n\n // Remove MongoDB internals\n delete result.__v;\n\n // Convert dates to ISO strings\n if (result.createdAt) {\n result.createdAt = new Date(result.createdAt).toISOString();\n }\n if (result.updatedAt) {\n result.updatedAt = new Date(result.updatedAt).toISOString();\n }\n\n return result;\n }\n\n private generateId(): string {\n const timestamp = Date.now().toString(16).padStart(12, '0');\n const random = randomBytes(6).toString('hex');\n return timestamp + random;\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createMongoDBAdapter(options: {\n client: any;\n database: string;\n}): MongoDBAdapter {\n return new MongoDBAdapter(options);\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { WEBHOOK_EVENTS, createWebhookService, extractApiKeyFromRequest, validateApiKey, createApiKeyContext
|
|
1
|
+
import { WEBHOOK_EVENTS, createWebhookService, extractApiKeyFromRequest, validateApiKey, createApiKeyContext } from './chunk-QXIQWPAP.js';
|
|
2
|
+
import { evaluateAccess } from './chunk-SDMNUYVU.js';
|
|
2
3
|
|
|
3
4
|
// src/api/trpc/context.ts
|
|
4
5
|
async function createContext(options) {
|
|
@@ -433,5 +434,5 @@ function createKyroServer(ctx) {
|
|
|
433
434
|
}
|
|
434
435
|
|
|
435
436
|
export { createContext, createCountProcedure, createCreateProcedure, createDeleteProcedure, createDynamicRouter, createFindByIDProcedure, createFindProcedure, createKyroServer, createUpdateProcedure };
|
|
436
|
-
//# sourceMappingURL=chunk-
|
|
437
|
-
//# sourceMappingURL=chunk-
|
|
437
|
+
//# sourceMappingURL=chunk-3AJE4SEG.js.map
|
|
438
|
+
//# sourceMappingURL=chunk-3AJE4SEG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/trpc/context.ts","../src/api/trpc/procedures.ts","../src/api/trpc/router.ts"],"names":[],"mappings":"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","file":"chunk-3AJE4SEG.js","sourcesContent":["import type { BaseAdapter } from \"../../registry/types.js\";\nimport type { User, Request } from \"../../hooks/types.js\";\nimport {\n validateApiKey,\n extractApiKeyFromRequest,\n createApiKeyContext,\n} from \"../../auth/api-key.js\";\nimport { createWebhookService } from \"../../webhooks/index.js\";\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\nexport interface ApiKeyContext {\n userId: string;\n user: Partial<User>;\n permissions: string[];\n apiKeyId: string;\n tenantId?: string;\n role?: string;\n}\n\nexport interface KyroContext {\n db: BaseAdapter;\n registry: any;\n user?: User;\n tenantID?: string;\n req: Request;\n apiKey?: ApiKeyContext;\n webhookService?: ReturnType<typeof createWebhookService>;\n settings?: Record<string, any>;\n [key: string]: any;\n}\n\n// ============================================================================\n// Context Factory\n// ============================================================================\n\nexport async function createContext(options: {\n db: BaseAdapter;\n registry: any;\n req: Request;\n user?: User;\n tenantID?: string;\n settings?: Record<string, any>;\n}): Promise<KyroContext> {\n const webhookService = createWebhookService(options.db);\n\n const baseContext: KyroContext = {\n db: options.db,\n registry: options.registry,\n req: options.req,\n user: options.user,\n tenantID: options.tenantID,\n webhookService,\n settings: options.settings,\n };\n\n const apiKeyRaw = extractApiKeyFromRequest(options.req as any);\n if (apiKeyRaw) {\n const result = await validateApiKey(apiKeyRaw, options.db);\n if (result.valid) {\n baseContext.user = (result.user as User) || options.user;\n baseContext.tenantID = result.tenantId || options.tenantID;\n baseContext.apiKey = createApiKeyContext(result) as ApiKeyContext;\n }\n }\n\n return baseContext;\n}\n","import type {\n FindArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n} from \"../../registry/types.js\";\nimport { runHooks } from \"../../hooks/types.js\";\nimport { evaluateAccess } from \"../../access/types.js\";\nexport type { KyroContext, ApiKeyContext } from \"./context.js\";\nexport { createContext } from \"./context.js\";\nimport type { KyroContext } from \"./context.js\";\nimport { WEBHOOK_EVENTS, type WebhookEvent } from \"../../webhooks/types.js\";\n\nconst COLLECTION_EVENT_MAP: Record<\n string,\n { create: WebhookEvent; update: WebhookEvent; delete: WebhookEvent }\n> = {\n _media: {\n create: WEBHOOK_EVENTS.MEDIA_UPLOAD,\n update: WEBHOOK_EVENTS.MEDIA_UPLOAD,\n delete: WEBHOOK_EVENTS.MEDIA_DELETE,\n },\n};\n\nfunction getWebhookEvent(\n collection: string,\n operation: \"create\" | \"update\" | \"delete\",\n): WebhookEvent {\n const mapped = COLLECTION_EVENT_MAP[collection];\n if (mapped) return mapped[operation];\n return `collection.${operation}` as WebhookEvent;\n}\n\nasync function triggerWebhook(\n ctx: KyroContext,\n event: WebhookEvent,\n payload: {\n collection: string;\n data: unknown;\n previousData?: unknown;\n operation: \"create\" | \"update\" | \"delete\";\n },\n) {\n if (!ctx.webhookService) return;\n try {\n await ctx.webhookService.trigger(event, {\n collection: payload.collection,\n operation: payload.operation,\n data: payload.data,\n previousData: payload.previousData,\n user: ctx.user\n ? { id: ctx.user.id, email: ctx.user.email, role: ctx.user.role }\n : undefined,\n tenantId: ctx.tenantID,\n });\n } catch (err) {\n console.error(`[Webhook] Failed to trigger ${event}:`, err);\n }\n}\n\n// ============================================================================\n// CRUD Procedure Builders\n// ============================================================================\n\nexport function createFindProcedure(ctx: KyroContext) {\n return async (input: {\n collection: string;\n where?: Record<string, any>;\n sort?: string;\n limit?: number;\n page?: number;\n depth?: number;\n select?: string[];\n }) => {\n const { collection, where, sort, limit, page, depth, select } = input;\n const config = ctx.registry.getCollection(collection);\n\n // Check access\n if (config.access?.read) {\n const allowed = await evaluateAccess(config.access.read, {\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n });\n if (allowed === false) throw new Error(\"Access denied\");\n }\n\n // Run beforeRead hooks\n if (config.hooks?.beforeRead) {\n for (const hook of config.hooks.beforeRead) {\n await hook({\n collection,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: \"read\",\n where,\n });\n }\n }\n\n // Execute query\n const result = await ctx.db.find({\n collection,\n where: where || {},\n sort,\n limit: limit || 10,\n page: page || 1,\n depth: depth || 0,\n tenantID: ctx.tenantID,\n select,\n });\n\n // Run afterRead hooks\n if (config.hooks?.afterRead) {\n for (const doc of result.docs) {\n for (const hook of config.hooks.afterRead) {\n await hook({\n collection,\n doc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: \"read\",\n });\n }\n }\n }\n\n return result;\n };\n}\n\nexport function createFindByIDProcedure(ctx: KyroContext) {\n return async (input: {\n collection: string;\n id: string;\n depth?: number;\n select?: string[];\n }) => {\n const { collection, id, depth, select } = input;\n const config = ctx.registry.getCollection(collection);\n\n // Check access\n if (config.access?.read) {\n const allowed = await evaluateAccess(config.access.read, {\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n id,\n });\n if (allowed === false) throw new Error(\"Access denied\");\n }\n\n const doc = await ctx.db.findByID({\n collection,\n id,\n depth: depth || 0,\n tenantID: ctx.tenantID,\n select,\n });\n\n if (!doc) throw new Error(`Document not found: ${collection}/${id}`);\n\n // Run afterRead hooks\n if (config.hooks?.afterRead) {\n for (const hook of config.hooks.afterRead) {\n await hook({\n collection,\n doc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: \"read\",\n id,\n });\n }\n }\n\n return doc;\n };\n}\n\nexport function createCreateProcedure(ctx: KyroContext) {\n return async (input: {\n collection: string;\n data: Record<string, any>;\n depth?: number;\n select?: string[];\n }) => {\n const { collection, data, depth, select } = input;\n const config = ctx.registry.getCollection(collection);\n\n // Check access\n if (config.access?.create) {\n const allowed = await evaluateAccess(config.access.create, {\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n data,\n });\n if (allowed === false) throw new Error(\"Access denied\");\n }\n\n // Validate with Zod\n const schema = ctx.registry.getCreateZodSchema(collection);\n const validated = schema.parse(data);\n\n // Add tenantID if scoped\n if (config.tenantScoped && ctx.tenantID) {\n validated.tenantID = ctx.tenantID;\n }\n\n // Run beforeValidate hooks\n if (config.hooks?.beforeValidate) {\n for (const hook of config.hooks.beforeValidate) {\n const hookResult = await hook({\n collection,\n data: validated,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: \"create\",\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n // Run beforeChange hooks\n if (config.hooks?.beforeChange) {\n for (const hook of config.hooks.beforeChange) {\n const hookResult = await hook({\n collection,\n data: validated,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: \"create\",\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n // Execute create\n const doc = await ctx.db.create({\n collection,\n data: validated,\n depth: depth || 0,\n tenantID: ctx.tenantID,\n select,\n });\n\n // Run afterChange hooks\n if (config.hooks?.afterChange) {\n for (const hook of config.hooks.afterChange) {\n await hook({\n collection,\n doc,\n data: validated,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: \"create\",\n });\n }\n }\n\n await triggerWebhook(ctx, getWebhookEvent(collection, \"create\"), {\n collection,\n data: doc,\n operation: \"create\",\n });\n\n return { doc };\n };\n}\n\nexport function createUpdateProcedure(ctx: KyroContext) {\n return async (input: {\n collection: string;\n id: string;\n data: Record<string, any>;\n depth?: number;\n select?: string[];\n }) => {\n const { collection, id, data, depth, select } = input;\n const config = ctx.registry.getCollection(collection);\n\n // Get original doc for hooks\n const originalDoc = await ctx.db.findByID({\n collection,\n id,\n tenantID: ctx.tenantID,\n });\n\n if (!originalDoc)\n throw new Error(`Document not found: ${collection}/${id}`);\n\n // Check access\n if (config.access?.update) {\n const allowed = await evaluateAccess(config.access.update, {\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n id,\n doc: originalDoc,\n data,\n });\n if (allowed === false) throw new Error(\"Access denied\");\n }\n\n // Validate with Zod\n const schema = ctx.registry.getUpdateZodSchema(collection);\n const validated = schema.parse(data);\n\n // Add tenantID if scoped\n if (config.tenantScoped && ctx.tenantID) {\n validated.tenantID = ctx.tenantID;\n }\n\n // Run beforeValidate hooks\n if (config.hooks?.beforeValidate) {\n for (const hook of config.hooks.beforeValidate) {\n const hookResult = await hook({\n collection,\n data: validated,\n originalDoc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: \"update\",\n id,\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n // Run beforeChange hooks\n if (config.hooks?.beforeChange) {\n for (const hook of config.hooks.beforeChange) {\n const hookResult = await hook({\n collection,\n data: validated,\n originalDoc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: \"update\",\n id,\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n // Execute update\n const doc = await ctx.db.update({\n collection,\n id,\n data: validated,\n depth: depth || 0,\n tenantID: ctx.tenantID,\n select,\n });\n\n // Run afterChange hooks\n if (config.hooks?.afterChange) {\n for (const hook of config.hooks.afterChange) {\n await hook({\n collection,\n doc,\n data: validated,\n originalDoc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: \"update\",\n id,\n });\n }\n }\n\n await triggerWebhook(ctx, getWebhookEvent(collection, \"update\"), {\n collection,\n data: doc,\n previousData: originalDoc,\n operation: \"update\",\n });\n\n return { doc };\n };\n}\n\nexport function createDeleteProcedure(ctx: KyroContext) {\n return async (input: { collection: string; id: string }) => {\n const { collection, id } = input;\n const config = ctx.registry.getCollection(collection);\n\n // Get original doc for hooks\n const originalDoc = await ctx.db.findByID({\n collection,\n id,\n tenantID: ctx.tenantID,\n });\n\n if (!originalDoc)\n throw new Error(`Document not found: ${collection}/${id}`);\n\n // Check access\n if (config.access?.delete) {\n const allowed = await evaluateAccess(config.access.delete, {\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n id,\n doc: originalDoc,\n });\n if (allowed === false) throw new Error(\"Access denied\");\n }\n\n // Run beforeDelete hooks\n if (config.hooks?.beforeDelete) {\n for (const hook of config.hooks.beforeDelete) {\n await hook({\n collection,\n doc: originalDoc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: \"delete\",\n id,\n });\n }\n }\n\n // Execute delete\n const doc = await ctx.db.delete({\n collection,\n id,\n tenantID: ctx.tenantID,\n });\n\n // Run afterDelete hooks\n if (config.hooks?.afterDelete) {\n for (const hook of config.hooks.afterDelete) {\n await hook({\n collection,\n doc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: \"delete\",\n id,\n });\n }\n }\n\n await triggerWebhook(ctx, getWebhookEvent(collection, \"delete\"), {\n collection,\n data: doc,\n previousData: originalDoc,\n operation: \"delete\",\n });\n\n return { doc, message: \"Deleted successfully\" };\n };\n}\n\nexport function createCountProcedure(ctx: KyroContext) {\n return async (input: { collection: string; where?: Record<string, any> }) => {\n const { collection, where } = input;\n const config = ctx.registry.getCollection(collection);\n\n // Check access\n if (config.access?.read) {\n const allowed = await evaluateAccess(config.access.read, {\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n });\n if (allowed === false) throw new Error(\"Access denied\");\n }\n\n const totalDocs = await ctx.db.count({\n collection,\n where: where || {},\n tenantID: ctx.tenantID,\n });\n\n return { totalDocs };\n };\n}\n","import type { KyroContext } from \"./context.js\";\nimport {\n createFindProcedure,\n createFindByIDProcedure,\n createCreateProcedure,\n createUpdateProcedure,\n createDeleteProcedure,\n createCountProcedure,\n} from \"./procedures.js\";\n\n// ============================================================================\n// Dynamic Router Generator\n// ============================================================================\n\nexport function createDynamicRouter(ctx: KyroContext) {\n const router: Record<string, any> = {};\n const collections = ctx.registry.getCollections();\n\n for (const collection of collections) {\n const slug = collection.slug;\n\n router[slug] = {\n find: createFindProcedure(ctx),\n findByID: createFindByIDProcedure(ctx),\n create: createCreateProcedure(ctx),\n update: createUpdateProcedure(ctx),\n delete: createDeleteProcedure(ctx),\n count: createCountProcedure(ctx),\n };\n }\n\n // Add globals\n const globals = ctx.registry.getGlobals();\n for (const global of globals) {\n const slug = global.slug;\n\n router[`_globals_${slug}`] = {\n get: async () => {\n const doc = await ctx.db.findOne({\n collection: `_globals_${slug}`,\n where: {},\n tenantID: ctx.tenantID,\n });\n return doc;\n },\n update: async (input: { data: Record<string, any> }) => {\n const schema = ctx.registry.getZodSchema(slug);\n const validated = schema.parse(input.data);\n\n const doc = await ctx.db.create({\n collection: `_globals_${slug}`,\n data: { ...validated, id: slug },\n tenantID: ctx.tenantID,\n });\n\n return doc;\n },\n };\n }\n\n return router;\n}\n\n// ============================================================================\n// Typed Router Interface\n// ============================================================================\n\nexport interface KyroRouter {\n [collectionSlug: string]: {\n find: (input: {\n where?: Record<string, any>;\n sort?: string;\n limit?: number;\n page?: number;\n depth?: number;\n select?: string[];\n }) => Promise<{\n docs: any[];\n totalDocs: number;\n limit: number;\n totalPages: number;\n page: number;\n pagingCounter: number;\n hasPrevPage: boolean;\n hasNextPage: boolean;\n prevPage: number | null;\n nextPage: number | null;\n }>;\n findByID: (input: {\n id: string;\n depth?: number;\n select?: string[];\n }) => Promise<any>;\n create: (input: {\n data: Record<string, any>;\n depth?: number;\n select?: string[];\n }) => Promise<{ doc: any }>;\n update: (input: {\n id: string;\n data: Record<string, any>;\n depth?: number;\n select?: string[];\n }) => Promise<{ doc: any }>;\n delete: (input: { id: string }) => Promise<{ doc: any; message: string }>;\n count: (input: {\n where?: Record<string, any>;\n }) => Promise<{ totalDocs: number }>;\n };\n}\n\n// ============================================================================\n// Server Entry\n// ============================================================================\n\nexport function createKyroServer(ctx: KyroContext): KyroRouter {\n // Check if tRPC is disabled in settings\n const apiAccess = ctx.settings?.access?.apiAccess;\n if (apiAccess?.trpcEnabled === false) {\n throw new Error(\"tRPC API is disabled\");\n }\n\n return createDynamicRouter(ctx) as KyroRouter;\n}\n"]}
|