@sonicjs-cms/core 3.0.0-beta.12 → 3.0.0-beta.14
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/{chunk-INKP2WNU.js → chunk-32SDMKZ7.js} +2 -2
- package/dist/{chunk-INKP2WNU.js.map → chunk-32SDMKZ7.js.map} +1 -1
- package/dist/{chunk-NYLWNR6T.cjs → chunk-4YRYGDCQ.cjs} +4 -4
- package/dist/{chunk-NYLWNR6T.cjs.map → chunk-4YRYGDCQ.cjs.map} +1 -1
- package/dist/{chunk-Q3P7Y5VO.js → chunk-5L6EMI7A.js} +4 -4
- package/dist/{chunk-Q3P7Y5VO.js.map → chunk-5L6EMI7A.js.map} +1 -1
- package/dist/{chunk-IVPRUGTY.js → chunk-75JKPNUZ.js} +3 -3
- package/dist/{chunk-IVPRUGTY.js.map → chunk-75JKPNUZ.js.map} +1 -1
- package/dist/{chunk-SY7CBACS.cjs → chunk-G5LC7MYH.cjs} +10 -10
- package/dist/{chunk-SY7CBACS.cjs.map → chunk-G5LC7MYH.cjs.map} +1 -1
- package/dist/{chunk-KI5KMJH2.cjs → chunk-H5FB6GKR.cjs} +2 -2
- package/dist/{chunk-KI5KMJH2.cjs.map → chunk-H5FB6GKR.cjs.map} +1 -1
- package/dist/{chunk-R2O6TTQS.js → chunk-HNUGMALL.js} +224 -18
- package/dist/chunk-HNUGMALL.js.map +1 -0
- package/dist/{chunk-SUHGXAII.js → chunk-INE5E3SL.js} +2 -2
- package/dist/{chunk-SUHGXAII.js.map → chunk-INE5E3SL.js.map} +1 -1
- package/dist/{chunk-BYLQOBO6.cjs → chunk-L3KHLEHL.cjs} +25 -41
- package/dist/chunk-L3KHLEHL.cjs.map +1 -0
- package/dist/{chunk-DMXDQ5YI.js → chunk-O32IZ6JS.js} +15 -31
- package/dist/chunk-O32IZ6JS.js.map +1 -0
- package/dist/{chunk-BLMTL57B.js → chunk-PDC7DLOV.js} +21 -3
- package/dist/chunk-PDC7DLOV.js.map +1 -0
- package/dist/{chunk-XHBEFQJ3.js → chunk-QNPT6BQP.js} +3 -3
- package/dist/{chunk-XHBEFQJ3.js.map → chunk-QNPT6BQP.js.map} +1 -1
- package/dist/{chunk-XGH2FVVR.cjs → chunk-SIPBHWMG.cjs} +4 -4
- package/dist/{chunk-XGH2FVVR.cjs.map → chunk-SIPBHWMG.cjs.map} +1 -1
- package/dist/{chunk-TV7LRFXH.cjs → chunk-SSOP7G4R.cjs} +441 -235
- package/dist/chunk-SSOP7G4R.cjs.map +1 -0
- package/dist/{chunk-ALNODOY4.js → chunk-U7T5EOHJ.js} +4 -4
- package/dist/{chunk-ALNODOY4.js.map → chunk-U7T5EOHJ.js.map} +1 -1
- package/dist/{chunk-2CB4KY7I.cjs → chunk-W36OZTJ5.cjs} +21 -3
- package/dist/chunk-W36OZTJ5.cjs.map +1 -0
- package/dist/{chunk-LLWLHFTD.cjs → chunk-WIV3R2MJ.cjs} +2 -2
- package/dist/{chunk-LLWLHFTD.cjs.map → chunk-WIV3R2MJ.cjs.map} +1 -1
- package/dist/{chunk-NUKJ54GA.cjs → chunk-ZTEJHSYS.cjs} +3 -3
- package/dist/{chunk-NUKJ54GA.cjs.map → chunk-ZTEJHSYS.cjs.map} +1 -1
- package/dist/{collection-config-JgHOpFCG.d.cts → collection-config-BTzAvKt2.d.cts} +25 -0
- package/dist/{collection-config-JgHOpFCG.d.ts → collection-config-BTzAvKt2.d.ts} +25 -0
- package/dist/{config-ON6FNMYX.cjs → config-FLOUCYHH.cjs} +5 -5
- package/dist/{config-ON6FNMYX.cjs.map → config-FLOUCYHH.cjs.map} +1 -1
- package/dist/config-PLJTDINX.js +6 -0
- package/dist/{config-HFXANXCC.js.map → config-PLJTDINX.js.map} +1 -1
- package/dist/index.cjs +275 -275
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +19 -19
- package/dist/index.js.map +1 -1
- package/dist/middleware.cjs +34 -33
- package/dist/middleware.js +5 -4
- package/dist/migrations-DOPZXFK3.js +4 -0
- package/dist/{migrations-MLBACCPF.js.map → migrations-DOPZXFK3.js.map} +1 -1
- package/dist/migrations-TYYC66P4.cjs +13 -0
- package/dist/{migrations-AFSCRO56.cjs.map → migrations-TYYC66P4.cjs.map} +1 -1
- package/dist/{plugin-bootstrap-B8ThJU21.d.cts → plugin-bootstrap-BHWQ2df8.d.cts} +1 -1
- package/dist/{plugin-bootstrap-qu8hJgUt.d.ts → plugin-bootstrap-Bj4fxX1q.d.ts} +1 -1
- package/dist/plugins.cjs +40 -40
- package/dist/plugins.js +3 -3
- package/dist/rbac-4QLDXIDF.js +5 -0
- package/dist/{rbac-O73MFKDA.js.map → rbac-4QLDXIDF.js.map} +1 -1
- package/dist/rbac-ESTOCVT2.cjs +14 -0
- package/dist/{rbac-VONLJJKB.cjs.map → rbac-ESTOCVT2.cjs.map} +1 -1
- package/dist/routes.cjs +27 -27
- package/dist/routes.js +7 -7
- package/dist/services.cjs +18 -18
- package/dist/services.d.cts +2 -2
- package/dist/services.d.ts +2 -2
- package/dist/services.js +2 -2
- package/dist/types.d.cts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/utils.cjs +3 -3
- package/dist/utils.d.cts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-2CB4KY7I.cjs.map +0 -1
- package/dist/chunk-BLMTL57B.js.map +0 -1
- package/dist/chunk-BYLQOBO6.cjs.map +0 -1
- package/dist/chunk-DMXDQ5YI.js.map +0 -1
- package/dist/chunk-R2O6TTQS.js.map +0 -1
- package/dist/chunk-TV7LRFXH.cjs.map +0 -1
- package/dist/config-HFXANXCC.js +0 -6
- package/dist/migrations-AFSCRO56.cjs +0 -13
- package/dist/migrations-MLBACCPF.js +0 -4
- package/dist/rbac-O73MFKDA.js +0 -5
- package/dist/rbac-VONLJJKB.cjs +0 -14
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
var chunkHIKBY7MS_cjs = require('./chunk-HIKBY7MS.cjs');
|
|
4
4
|
var chunkN32OWET6_cjs = require('./chunk-N32OWET6.cjs');
|
|
5
5
|
var chunk4BTBSXMR_cjs = require('./chunk-4BTBSXMR.cjs');
|
|
6
|
-
var
|
|
7
|
-
var
|
|
6
|
+
var chunkL3KHLEHL_cjs = require('./chunk-L3KHLEHL.cjs');
|
|
7
|
+
var chunkW36OZTJ5_cjs = require('./chunk-W36OZTJ5.cjs');
|
|
8
8
|
var chunkJEQ7FLOD_cjs = require('./chunk-JEQ7FLOD.cjs');
|
|
9
|
-
var
|
|
10
|
-
var
|
|
9
|
+
var chunkWIV3R2MJ_cjs = require('./chunk-WIV3R2MJ.cjs');
|
|
10
|
+
var chunkH5FB6GKR_cjs = require('./chunk-H5FB6GKR.cjs');
|
|
11
11
|
var chunkPXNTCCPE_cjs = require('./chunk-PXNTCCPE.cjs');
|
|
12
12
|
var chunkK623Q6WD_cjs = require('./chunk-K623Q6WD.cjs');
|
|
13
|
-
var
|
|
13
|
+
var chunk4YRYGDCQ_cjs = require('./chunk-4YRYGDCQ.cjs');
|
|
14
14
|
var chunkJ6JTWD2A_cjs = require('./chunk-J6JTWD2A.cjs');
|
|
15
15
|
var chunkIXUHXTHW_cjs = require('./chunk-IXUHXTHW.cjs');
|
|
16
16
|
var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs');
|
|
17
|
-
var
|
|
17
|
+
var chunkSIPBHWMG_cjs = require('./chunk-SIPBHWMG.cjs');
|
|
18
18
|
var chunkMNWKYY5E_cjs = require('./chunk-MNWKYY5E.cjs');
|
|
19
19
|
var hono = require('hono');
|
|
20
20
|
var zod = require('zod');
|
|
@@ -256,7 +256,7 @@ function getDocumentRequestContext(c) {
|
|
|
256
256
|
|
|
257
257
|
// src/routes/api-documents.ts
|
|
258
258
|
async function aclAllowsRead(db, tenantId, principalSet, row, preloadedType) {
|
|
259
|
-
const docType = preloadedType ?? await new
|
|
259
|
+
const docType = preloadedType ?? await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(row.type_id);
|
|
260
260
|
if (!docType) return false;
|
|
261
261
|
return new DocumentRepository(db, tenantId).isAllowed(principalSet, row.root_id, "read", docType.settings);
|
|
262
262
|
}
|
|
@@ -274,7 +274,7 @@ apiDocumentsRoutes.get("/", async (c) => {
|
|
|
274
274
|
if (!typeId) {
|
|
275
275
|
return c.json({ error: "type query parameter is required" }, 400);
|
|
276
276
|
}
|
|
277
|
-
const registry = new
|
|
277
|
+
const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
|
|
278
278
|
const docType = await registry.findById(typeId);
|
|
279
279
|
if (!docType || !docType.isActive) {
|
|
280
280
|
return c.json({ error: "Unknown document type" }, 400);
|
|
@@ -356,7 +356,7 @@ apiDocumentsRoutes.get("/root/:rootId", async (c) => {
|
|
|
356
356
|
AND (expires_at IS NULL OR expires_at > ?) LIMIT 1`
|
|
357
357
|
).bind(rootId, now, now).first();
|
|
358
358
|
if (!row) return c.json({ error: "Not found" }, 404);
|
|
359
|
-
const docType = await new
|
|
359
|
+
const docType = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(row.type_id);
|
|
360
360
|
const effTenant = effectiveTenantForType(tenantId, docType?.settings);
|
|
361
361
|
if (row.tenant_id !== effTenant) return c.json({ error: "Not found" }, 404);
|
|
362
362
|
if (!await aclAllowsRead(db, effTenant, principalSet, row, docType)) {
|
|
@@ -392,7 +392,7 @@ apiDocumentsRoutes.get("/:id", async (c) => {
|
|
|
392
392
|
AND (expires_at IS NULL OR expires_at > ?) LIMIT 1`
|
|
393
393
|
).bind(id, now, now).first();
|
|
394
394
|
if (!row) return c.json({ error: "Not found" }, 404);
|
|
395
|
-
const docType = await new
|
|
395
|
+
const docType = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(row.type_id);
|
|
396
396
|
const effTenant = effectiveTenantForType(tenantId, docType?.settings);
|
|
397
397
|
if (row.tenant_id !== effTenant) return c.json({ error: "Not found" }, 404);
|
|
398
398
|
if (!await aclAllowsRead(db, effTenant, principalSet, row, docType)) {
|
|
@@ -462,17 +462,17 @@ async function resolveDocScope(c, db, by, opts = {}) {
|
|
|
462
462
|
const draft = opts.currentDraftOnly ? " AND is_current_draft = 1" : "";
|
|
463
463
|
const row = await db.prepare(`SELECT type_id, root_id, tenant_id FROM documents WHERE ${col} = ?${draft} LIMIT 1`).bind(val).first();
|
|
464
464
|
if (!row) return null;
|
|
465
|
-
const docType = await new
|
|
465
|
+
const docType = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(row.type_id);
|
|
466
466
|
const tenantId = effectiveTenantForType(getRequestTenant(c), docType?.settings);
|
|
467
467
|
if (row.tenant_id !== tenantId) return null;
|
|
468
468
|
return { typeId: row.type_id, rootId: row.root_id, tenantId, docType };
|
|
469
469
|
}
|
|
470
470
|
var adminDocumentsRoutes = new hono.Hono();
|
|
471
|
-
adminDocumentsRoutes.use("*",
|
|
472
|
-
adminDocumentsRoutes.use("*",
|
|
471
|
+
adminDocumentsRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
|
|
472
|
+
adminDocumentsRoutes.use("*", chunkL3KHLEHL_cjs.requireRole(["admin", "editor"]));
|
|
473
473
|
adminDocumentsRoutes.get("/types", async (c) => {
|
|
474
474
|
try {
|
|
475
|
-
const registry = new
|
|
475
|
+
const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(c.env.DB);
|
|
476
476
|
const types = await registry.findAll();
|
|
477
477
|
return c.json({ data: types });
|
|
478
478
|
} catch (error) {
|
|
@@ -500,7 +500,7 @@ adminDocumentsRoutes.get("/", async (c) => {
|
|
|
500
500
|
if (!typeId) {
|
|
501
501
|
return c.json({ error: "type query parameter is required" }, 400);
|
|
502
502
|
}
|
|
503
|
-
const registry = new
|
|
503
|
+
const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
|
|
504
504
|
const docType = await registry.findById(typeId);
|
|
505
505
|
if (!docType || !docType.isActive) {
|
|
506
506
|
return c.json({ error: "Unknown document type" }, 400);
|
|
@@ -611,7 +611,7 @@ adminDocumentsRoutes.post("/", async (c) => {
|
|
|
611
611
|
const input = validation.data;
|
|
612
612
|
const db = c.env.DB;
|
|
613
613
|
const user = c.get("user");
|
|
614
|
-
const registry = new
|
|
614
|
+
const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
|
|
615
615
|
const docType = await registry.findById(input.typeId);
|
|
616
616
|
if (!docType || !docType.isActive) {
|
|
617
617
|
return c.json({ error: "Unknown document type" }, 400);
|
|
@@ -619,7 +619,7 @@ adminDocumentsRoutes.post("/", async (c) => {
|
|
|
619
619
|
const createDenied = await denyIfNotAllowed(c, db, "", "create", docType.settings);
|
|
620
620
|
if (createDenied) return createDenied;
|
|
621
621
|
const tenantId = effectiveTenantForType(getRequestTenant(c), docType.settings);
|
|
622
|
-
const svc = new
|
|
622
|
+
const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
|
|
623
623
|
queryableFields: docType.queryableFields,
|
|
624
624
|
typeSchemaVersion: docType.schemaVersion,
|
|
625
625
|
maxVersionsPerRoot: docType.settings.maxVersionsPerRoot,
|
|
@@ -657,7 +657,7 @@ adminDocumentsRoutes.put("/:rootId", async (c) => {
|
|
|
657
657
|
const docType = scope.docType;
|
|
658
658
|
const updateDenied = await denyIfNotAllowed(c, db, rootId, "update", docType?.settings, scope.tenantId);
|
|
659
659
|
if (updateDenied) return updateDenied;
|
|
660
|
-
const svc = new
|
|
660
|
+
const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
|
|
661
661
|
queryableFields: docType?.queryableFields ?? [],
|
|
662
662
|
typeSchemaVersion: docType?.schemaVersion,
|
|
663
663
|
maxVersionsPerRoot: docType?.settings.maxVersionsPerRoot,
|
|
@@ -682,7 +682,7 @@ adminDocumentsRoutes.post("/:id/publish", async (c) => {
|
|
|
682
682
|
const docType = scope.docType;
|
|
683
683
|
const publishDenied = await denyIfNotAllowed(c, db, scope.rootId, "publish", docType?.settings, scope.tenantId);
|
|
684
684
|
if (publishDenied) return publishDenied;
|
|
685
|
-
const svc = new
|
|
685
|
+
const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
|
|
686
686
|
queryableFields: docType?.queryableFields ?? [],
|
|
687
687
|
typeSchemaVersion: docType?.schemaVersion,
|
|
688
688
|
tenantId: scope.tenantId,
|
|
@@ -705,7 +705,7 @@ adminDocumentsRoutes.post("/:id/unpublish", async (c) => {
|
|
|
705
705
|
const docType = scope.docType;
|
|
706
706
|
const unpublishDenied = await denyIfNotAllowed(c, db, scope.rootId, "publish", docType?.settings, scope.tenantId);
|
|
707
707
|
if (unpublishDenied) return unpublishDenied;
|
|
708
|
-
const svc = new
|
|
708
|
+
const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
|
|
709
709
|
queryableFields: docType?.queryableFields ?? [],
|
|
710
710
|
tenantId: scope.tenantId
|
|
711
711
|
});
|
|
@@ -727,7 +727,7 @@ adminDocumentsRoutes.delete("/:id", async (c) => {
|
|
|
727
727
|
const docType = scope.docType;
|
|
728
728
|
const deleteDenied = await denyIfNotAllowed(c, db, scope.rootId, "delete", docType?.settings, scope.tenantId);
|
|
729
729
|
if (deleteDenied) return deleteDenied;
|
|
730
|
-
const svc = new
|
|
730
|
+
const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, { queryableFields: docType?.queryableFields ?? [], tenantId: scope.tenantId });
|
|
731
731
|
if (docType?.settings.pii) {
|
|
732
732
|
if (scope.rootId) await svc.erase(scope.rootId, scope.tenantId);
|
|
733
733
|
} else {
|
|
@@ -743,7 +743,7 @@ adminDocumentsRoutes.post("/types/:typeId/reindex", async (c) => {
|
|
|
743
743
|
try {
|
|
744
744
|
const { typeId } = c.req.param();
|
|
745
745
|
const db = c.env.DB;
|
|
746
|
-
const registry = new
|
|
746
|
+
const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
|
|
747
747
|
const docType = await registry.findById(typeId);
|
|
748
748
|
if (!docType) return c.json({ error: "Unknown document type" }, 400);
|
|
749
749
|
const reindexTenant = effectiveTenantForType(getRequestTenant(c), docType.settings);
|
|
@@ -897,13 +897,13 @@ async function resolveContentVariables(contentData, db) {
|
|
|
897
897
|
// src/routes/api-content-crud.ts
|
|
898
898
|
var apiContentCrudRoutes = new hono.Hono();
|
|
899
899
|
async function resolveDocBacking(db, collectionIdOrName) {
|
|
900
|
-
const registry =
|
|
900
|
+
const registry = chunkWIV3R2MJ_cjs.getCollectionRegistry();
|
|
901
901
|
const record = registry.getBySlugOrName(collectionIdOrName) ?? registry.getById(collectionIdOrName);
|
|
902
902
|
if (record) {
|
|
903
|
-
const docType2 = await new
|
|
903
|
+
const docType2 = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(record.name);
|
|
904
904
|
return docType2 ? { coll: { id: record.id, name: record.name }, docType: docType2 } : null;
|
|
905
905
|
}
|
|
906
|
-
const docType = await new
|
|
906
|
+
const docType = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(collectionIdOrName);
|
|
907
907
|
if (docType) {
|
|
908
908
|
return { coll: { id: collectionIdOrName, name: collectionIdOrName }, docType };
|
|
909
909
|
}
|
|
@@ -946,7 +946,7 @@ apiContentCrudRoutes.get("/check-slug", async (c) => {
|
|
|
946
946
|
}, 500);
|
|
947
947
|
}
|
|
948
948
|
});
|
|
949
|
-
apiContentCrudRoutes.get("/:id",
|
|
949
|
+
apiContentCrudRoutes.get("/:id", chunkL3KHLEHL_cjs.optionalAuth(), async (c) => {
|
|
950
950
|
try {
|
|
951
951
|
const id = c.req.param("id");
|
|
952
952
|
const db = c.env.DB;
|
|
@@ -956,7 +956,7 @@ apiContentCrudRoutes.get("/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) =>
|
|
|
956
956
|
).bind(id, getRequestTenant(c)).first();
|
|
957
957
|
let transformedContent;
|
|
958
958
|
if (docRow) {
|
|
959
|
-
const coll =
|
|
959
|
+
const coll = chunkWIV3R2MJ_cjs.getCollectionRegistry().getByName(docRow.type_id);
|
|
960
960
|
transformedContent = {
|
|
961
961
|
id: docRow.root_id,
|
|
962
962
|
title: docRow.title,
|
|
@@ -965,8 +965,8 @@ apiContentCrudRoutes.get("/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) =>
|
|
|
965
965
|
collectionId: coll?.id ?? docRow.type_id,
|
|
966
966
|
data: docRow.data ? JSON.parse(docRow.data) : {},
|
|
967
967
|
// D29: document timestamps are SECONDS; legacy `content` API contract is MILLISECONDS.
|
|
968
|
-
created_at:
|
|
969
|
-
updated_at:
|
|
968
|
+
created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(docRow.created_at),
|
|
969
|
+
updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(docRow.updated_at)
|
|
970
970
|
};
|
|
971
971
|
} else {
|
|
972
972
|
return c.json({ error: "Content not found" }, 404);
|
|
@@ -990,7 +990,7 @@ apiContentCrudRoutes.get("/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) =>
|
|
|
990
990
|
}, 500);
|
|
991
991
|
}
|
|
992
992
|
});
|
|
993
|
-
apiContentCrudRoutes.post("/",
|
|
993
|
+
apiContentCrudRoutes.post("/", chunkL3KHLEHL_cjs.requireAuth(), chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
|
|
994
994
|
try {
|
|
995
995
|
const db = c.env.DB;
|
|
996
996
|
const user = c.get("user");
|
|
@@ -1024,7 +1024,7 @@ apiContentCrudRoutes.post("/", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cj
|
|
|
1024
1024
|
return c.json({ error: "Write cancelled by plugin", details: String(err) }, 400);
|
|
1025
1025
|
}
|
|
1026
1026
|
const tenantId = getRequestTenant(c);
|
|
1027
|
-
const svc = new
|
|
1027
|
+
const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
|
|
1028
1028
|
queryableFields: backing.docType.queryableFields ?? [],
|
|
1029
1029
|
typeSchemaVersion: backing.docType.schemaVersion ?? 1,
|
|
1030
1030
|
maxVersionsPerRoot: backing.docType.settings?.maxVersionsPerRoot ?? 50,
|
|
@@ -1053,7 +1053,7 @@ apiContentCrudRoutes.post("/", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cj
|
|
|
1053
1053
|
"fire-and-forget"
|
|
1054
1054
|
);
|
|
1055
1055
|
return c.json({
|
|
1056
|
-
data: { id: doc.rootId, title: doc.title, slug: doc.slug, status: doc.status, collectionId: backing.coll.id, data: doc.data, created_at:
|
|
1056
|
+
data: { id: doc.rootId, title: doc.title, slug: doc.slug, status: doc.status, collectionId: backing.coll.id, data: doc.data, created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(doc.createdAt), updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(doc.updatedAt) }
|
|
1057
1057
|
}, 201);
|
|
1058
1058
|
}
|
|
1059
1059
|
return c.json({ error: "Collection is not document-backed" }, 400);
|
|
@@ -1065,7 +1065,7 @@ apiContentCrudRoutes.post("/", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cj
|
|
|
1065
1065
|
}, 500);
|
|
1066
1066
|
}
|
|
1067
1067
|
});
|
|
1068
|
-
apiContentCrudRoutes.put("/:id",
|
|
1068
|
+
apiContentCrudRoutes.put("/:id", chunkL3KHLEHL_cjs.requireAuth(), chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
|
|
1069
1069
|
try {
|
|
1070
1070
|
const id = c.req.param("id");
|
|
1071
1071
|
const db = c.env.DB;
|
|
@@ -1087,8 +1087,8 @@ apiContentCrudRoutes.put("/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_
|
|
|
1087
1087
|
} catch (err) {
|
|
1088
1088
|
return c.json({ error: "Write cancelled by plugin", details: String(err) }, 400);
|
|
1089
1089
|
}
|
|
1090
|
-
const docType = await new
|
|
1091
|
-
const svc = new
|
|
1090
|
+
const docType = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(docRow.type_id);
|
|
1091
|
+
const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
|
|
1092
1092
|
queryableFields: docType?.queryableFields ?? [],
|
|
1093
1093
|
typeSchemaVersion: docType?.schemaVersion ?? 1,
|
|
1094
1094
|
maxVersionsPerRoot: docType?.settings?.maxVersionsPerRoot ?? 50,
|
|
@@ -1110,7 +1110,7 @@ apiContentCrudRoutes.put("/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_
|
|
|
1110
1110
|
const cache = chunk4BTBSXMR_cjs.getCacheService(chunk4BTBSXMR_cjs.CACHE_CONFIGS.api);
|
|
1111
1111
|
await cache.invalidate("content-filtered:*");
|
|
1112
1112
|
await cache.invalidate("collection-content-filtered:*");
|
|
1113
|
-
const coll =
|
|
1113
|
+
const coll = chunkWIV3R2MJ_cjs.getCollectionRegistry().getByName(docRow.type_id);
|
|
1114
1114
|
const saved = await db.prepare("SELECT * FROM documents WHERE id = ?").bind(newDraft.id).first();
|
|
1115
1115
|
const savedData = saved?.data ? JSON.parse(saved.data) : {};
|
|
1116
1116
|
dispatchHookEvent(c, "content:after:update", { collection: docRow.type_id, id, data: savedData, user: actor }, "fire-and-forget");
|
|
@@ -1119,7 +1119,7 @@ apiContentCrudRoutes.put("/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_
|
|
|
1119
1119
|
dispatchHookEvent(c, "content:after:publish", { collection: docRow.type_id, id, data: savedData, user: actor }, "fire-and-forget");
|
|
1120
1120
|
}
|
|
1121
1121
|
return c.json({
|
|
1122
|
-
data: { id: saved.root_id, title: saved.title, slug: saved.slug, status: saved.status, collectionId: coll?.id ?? docRow.type_id, data: savedData, created_at:
|
|
1122
|
+
data: { id: saved.root_id, title: saved.title, slug: saved.slug, status: saved.status, collectionId: coll?.id ?? docRow.type_id, data: savedData, created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(saved.created_at), updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(saved.updated_at) }
|
|
1123
1123
|
});
|
|
1124
1124
|
}
|
|
1125
1125
|
return c.json({ error: "Content not found" }, 404);
|
|
@@ -1131,7 +1131,7 @@ apiContentCrudRoutes.put("/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_
|
|
|
1131
1131
|
}, 500);
|
|
1132
1132
|
}
|
|
1133
1133
|
});
|
|
1134
|
-
apiContentCrudRoutes.delete("/:id",
|
|
1134
|
+
apiContentCrudRoutes.delete("/:id", chunkL3KHLEHL_cjs.requireAuth(), chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
|
|
1135
1135
|
try {
|
|
1136
1136
|
const id = c.req.param("id");
|
|
1137
1137
|
const db = c.env.DB;
|
|
@@ -1244,8 +1244,8 @@ function mapDocRowToContent(row, collectionId) {
|
|
|
1244
1244
|
collectionId,
|
|
1245
1245
|
data: row.data ? JSON.parse(row.data) : {},
|
|
1246
1246
|
// D29: document timestamps are SECONDS; the legacy `content` API contract is MILLISECONDS.
|
|
1247
|
-
created_at:
|
|
1248
|
-
updated_at:
|
|
1247
|
+
created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(row.created_at),
|
|
1248
|
+
updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(row.updated_at)
|
|
1249
1249
|
};
|
|
1250
1250
|
}
|
|
1251
1251
|
var apiRoutes = new hono.Hono();
|
|
@@ -1257,7 +1257,7 @@ apiRoutes.use("*", async (c, next) => {
|
|
|
1257
1257
|
c.header("X-Response-Time", `${totalTime}ms`);
|
|
1258
1258
|
});
|
|
1259
1259
|
apiRoutes.use("*", async (c, next) => {
|
|
1260
|
-
const cacheEnabled = await
|
|
1260
|
+
const cacheEnabled = await chunkL3KHLEHL_cjs.isPluginActive(c.env.DB, "core-cache");
|
|
1261
1261
|
c.set("cacheEnabled", cacheEnabled);
|
|
1262
1262
|
await next();
|
|
1263
1263
|
});
|
|
@@ -1280,7 +1280,7 @@ apiRoutes.get("/", (c) => {
|
|
|
1280
1280
|
openapi: "3.0.0",
|
|
1281
1281
|
info: {
|
|
1282
1282
|
title: "SonicJS AI API",
|
|
1283
|
-
version:
|
|
1283
|
+
version: chunkSIPBHWMG_cjs.getCoreVersion(),
|
|
1284
1284
|
description: "RESTful API for SonicJS headless CMS - a modern, AI-powered content management system built on Cloudflare Workers",
|
|
1285
1285
|
contact: {
|
|
1286
1286
|
name: "SonicJS Support",
|
|
@@ -1710,8 +1710,8 @@ apiRoutes.get("/collections", async (c) => {
|
|
|
1710
1710
|
}
|
|
1711
1711
|
c.header("X-Cache-Status", "MISS");
|
|
1712
1712
|
c.header("X-Cache-Source", "registry");
|
|
1713
|
-
const records =
|
|
1714
|
-
const transformedResults = records.map(
|
|
1713
|
+
const records = chunkWIV3R2MJ_cjs.getCollectionRegistry().listActive().filter((r) => !r.internal);
|
|
1714
|
+
const transformedResults = records.map(chunkWIV3R2MJ_cjs.collectionRecordToRow);
|
|
1715
1715
|
const responseData = {
|
|
1716
1716
|
data: transformedResults,
|
|
1717
1717
|
meta: addTimingMeta(c, {
|
|
@@ -1732,7 +1732,7 @@ apiRoutes.get("/collections", async (c) => {
|
|
|
1732
1732
|
return c.json({ error: "Failed to fetch collections" }, 500);
|
|
1733
1733
|
}
|
|
1734
1734
|
});
|
|
1735
|
-
apiRoutes.get("/content",
|
|
1735
|
+
apiRoutes.get("/content", chunkL3KHLEHL_cjs.optionalAuth(), async (c) => {
|
|
1736
1736
|
const executionStart = Date.now();
|
|
1737
1737
|
try {
|
|
1738
1738
|
const db = c.env.DB;
|
|
@@ -1741,7 +1741,7 @@ apiRoutes.get("/content", chunkBYLQOBO6_cjs.optionalAuth(), async (c) => {
|
|
|
1741
1741
|
const collIdByName = /* @__PURE__ */ new Map();
|
|
1742
1742
|
let typeId;
|
|
1743
1743
|
let typeIds;
|
|
1744
|
-
const registry =
|
|
1744
|
+
const registry = chunkWIV3R2MJ_cjs.getCollectionRegistry();
|
|
1745
1745
|
if (queryParams.collection) {
|
|
1746
1746
|
const collectionName = queryParams.collection;
|
|
1747
1747
|
const record = registry.getByName(collectionName);
|
|
@@ -1840,13 +1840,13 @@ apiRoutes.get("/content", chunkBYLQOBO6_cjs.optionalAuth(), async (c) => {
|
|
|
1840
1840
|
}, 500);
|
|
1841
1841
|
}
|
|
1842
1842
|
});
|
|
1843
|
-
apiRoutes.get("/collections/:collection/content",
|
|
1843
|
+
apiRoutes.get("/collections/:collection/content", chunkL3KHLEHL_cjs.optionalAuth(), async (c) => {
|
|
1844
1844
|
const executionStart = Date.now();
|
|
1845
1845
|
try {
|
|
1846
1846
|
const collection = c.req.param("collection");
|
|
1847
1847
|
const db = c.env.DB;
|
|
1848
1848
|
const queryParams = c.req.query();
|
|
1849
|
-
const record =
|
|
1849
|
+
const record = chunkWIV3R2MJ_cjs.getCollectionRegistry().getBySlugOrName(collection);
|
|
1850
1850
|
if (!record || record.isActive === false) {
|
|
1851
1851
|
return c.json({ error: "Collection not found" }, 404);
|
|
1852
1852
|
}
|
|
@@ -1902,7 +1902,7 @@ apiRoutes.get("/collections/:collection/content", chunkBYLQOBO6_cjs.optionalAuth
|
|
|
1902
1902
|
const responseData = {
|
|
1903
1903
|
data: transformedResults,
|
|
1904
1904
|
meta: addTimingMeta(c, {
|
|
1905
|
-
...includeCollection ? { collection:
|
|
1905
|
+
...includeCollection ? { collection: chunkWIV3R2MJ_cjs.collectionRecordToRow(record) } : {},
|
|
1906
1906
|
count: results.length,
|
|
1907
1907
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1908
1908
|
// D44: echo the caller's filter with the access policy applied (status=published forced for
|
|
@@ -1927,13 +1927,13 @@ apiRoutes.get("/collections/:collection/content", chunkBYLQOBO6_cjs.optionalAuth
|
|
|
1927
1927
|
}
|
|
1928
1928
|
});
|
|
1929
1929
|
apiRoutes.route("/content", api_content_crud_default);
|
|
1930
|
-
apiRoutes.get("/:collection",
|
|
1930
|
+
apiRoutes.get("/:collection", chunkL3KHLEHL_cjs.optionalAuth(), async (c) => {
|
|
1931
1931
|
const executionStart = Date.now();
|
|
1932
1932
|
try {
|
|
1933
1933
|
const collection = c.req.param("collection");
|
|
1934
1934
|
const db = c.env.DB;
|
|
1935
1935
|
const queryParams = c.req.query();
|
|
1936
|
-
const record =
|
|
1936
|
+
const record = chunkWIV3R2MJ_cjs.getCollectionRegistry().getBySlugOrName(collection);
|
|
1937
1937
|
if (!record || record.isActive === false) {
|
|
1938
1938
|
return c.json({ error: "Collection not found" }, 404);
|
|
1939
1939
|
}
|
|
@@ -1973,7 +1973,7 @@ apiRoutes.get("/:collection", chunkBYLQOBO6_cjs.optionalAuth(), async (c) => {
|
|
|
1973
1973
|
const responseData = {
|
|
1974
1974
|
data: transformedResults,
|
|
1975
1975
|
meta: addTimingMeta(c, {
|
|
1976
|
-
...includeCollection ? { collection:
|
|
1976
|
+
...includeCollection ? { collection: chunkWIV3R2MJ_cjs.collectionRecordToRow(record) } : {},
|
|
1977
1977
|
count: results.length,
|
|
1978
1978
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1979
1979
|
filter: normalizePublicContentFilter(filter, role),
|
|
@@ -1991,12 +1991,12 @@ apiRoutes.get("/:collection", chunkBYLQOBO6_cjs.optionalAuth(), async (c) => {
|
|
|
1991
1991
|
return c.json({ error: "Failed to fetch content", details: error instanceof Error ? error.message : String(error) }, 500);
|
|
1992
1992
|
}
|
|
1993
1993
|
});
|
|
1994
|
-
apiRoutes.get("/:collection/:id",
|
|
1994
|
+
apiRoutes.get("/:collection/:id", chunkL3KHLEHL_cjs.optionalAuth(), async (c) => {
|
|
1995
1995
|
try {
|
|
1996
1996
|
const collection = c.req.param("collection");
|
|
1997
1997
|
const id = c.req.param("id");
|
|
1998
1998
|
const db = c.env.DB;
|
|
1999
|
-
const record =
|
|
1999
|
+
const record = chunkWIV3R2MJ_cjs.getCollectionRegistry().getBySlugOrName(collection);
|
|
2000
2000
|
if (!record || record.isActive === false) {
|
|
2001
2001
|
return c.json({ error: "Collection not found" }, 404);
|
|
2002
2002
|
}
|
|
@@ -2005,7 +2005,7 @@ apiRoutes.get("/:collection/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) =>
|
|
|
2005
2005
|
privileged ? "SELECT * FROM documents WHERE root_id = ? AND type_id = ? AND tenant_id = 'default' AND is_current_draft = 1 AND deleted_at IS NULL" : "SELECT * FROM documents WHERE root_id = ? AND type_id = ? AND tenant_id = 'default' AND is_published = 1 AND deleted_at IS NULL"
|
|
2006
2006
|
).bind(id, record.name).first();
|
|
2007
2007
|
if (!docRow) return c.json({ error: "Content not found" }, 404);
|
|
2008
|
-
const coll =
|
|
2008
|
+
const coll = chunkWIV3R2MJ_cjs.getCollectionRegistry().getByName(docRow.type_id);
|
|
2009
2009
|
const transformedContent = {
|
|
2010
2010
|
id: docRow.root_id,
|
|
2011
2011
|
title: docRow.title,
|
|
@@ -2013,8 +2013,8 @@ apiRoutes.get("/:collection/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) =>
|
|
|
2013
2013
|
status: docRow.status,
|
|
2014
2014
|
collectionId: coll?.id ?? docRow.type_id,
|
|
2015
2015
|
data: docRow.data ? JSON.parse(docRow.data) : {},
|
|
2016
|
-
created_at:
|
|
2017
|
-
updated_at:
|
|
2016
|
+
created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(docRow.created_at),
|
|
2017
|
+
updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(docRow.updated_at)
|
|
2018
2018
|
};
|
|
2019
2019
|
dispatchHookEvent(c, "content:read", { collection: docRow.type_id, id: docRow.root_id, data: transformedContent.data }, "fire-and-forget");
|
|
2020
2020
|
return c.json({ data: transformedContent });
|
|
@@ -2023,7 +2023,7 @@ apiRoutes.get("/:collection/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) =>
|
|
|
2023
2023
|
return c.json({ error: "Failed to fetch content", details: error instanceof Error ? error.message : String(error) }, 500);
|
|
2024
2024
|
}
|
|
2025
2025
|
});
|
|
2026
|
-
apiRoutes.post("/:collection",
|
|
2026
|
+
apiRoutes.post("/:collection", chunkL3KHLEHL_cjs.requireAuth(), chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
|
|
2027
2027
|
try {
|
|
2028
2028
|
const collection = c.req.param("collection");
|
|
2029
2029
|
const db = c.env.DB;
|
|
@@ -2044,26 +2044,26 @@ apiRoutes.post("/:collection", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cj
|
|
|
2044
2044
|
} catch (err) {
|
|
2045
2045
|
return c.json({ error: "Write cancelled by plugin", details: String(err) }, 400);
|
|
2046
2046
|
}
|
|
2047
|
-
const svc = new
|
|
2047
|
+
const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, { queryableFields: backing.docType.queryableFields ?? [], typeSchemaVersion: backing.docType.schemaVersion ?? 1, maxVersionsPerRoot: backing.docType.settings?.maxVersionsPerRoot ?? 50, tenantId: "default", versioning: backing.docType.settings?.versioning ?? false });
|
|
2048
2048
|
const doc = await svc.create(createDocumentSchema.parse({ typeId: backing.coll.name, tenantId: "default", locale: "default", title, slug: finalSlug, data: hookData, publishOnCreate: (status || "draft") === "published" }), user?.userId);
|
|
2049
2049
|
const cache = chunk4BTBSXMR_cjs.getCacheService(chunk4BTBSXMR_cjs.CACHE_CONFIGS.api);
|
|
2050
2050
|
await cache.invalidate("content-filtered:*");
|
|
2051
2051
|
await cache.invalidate("collection-content-filtered:*");
|
|
2052
2052
|
dispatchHookEvent(c, "content:after:create", { collection: backing.coll.name, id: doc.rootId, data: doc.data ?? {}, user: actor }, "fire-and-forget");
|
|
2053
|
-
return c.json({ data: { id: doc.rootId, title: doc.title, slug: doc.slug, status: doc.status, collectionId: backing.coll.id, data: doc.data, created_at:
|
|
2053
|
+
return c.json({ data: { id: doc.rootId, title: doc.title, slug: doc.slug, status: doc.status, collectionId: backing.coll.id, data: doc.data, created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(doc.createdAt), updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(doc.updatedAt) } }, 201);
|
|
2054
2054
|
} catch (error) {
|
|
2055
2055
|
console.error("Error creating content:", error);
|
|
2056
2056
|
return c.json({ error: "Failed to create content", details: error instanceof Error ? error.message : String(error) }, 500);
|
|
2057
2057
|
}
|
|
2058
2058
|
});
|
|
2059
|
-
apiRoutes.put("/:collection/:id",
|
|
2059
|
+
apiRoutes.put("/:collection/:id", chunkL3KHLEHL_cjs.requireAuth(), chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
|
|
2060
2060
|
try {
|
|
2061
2061
|
const collection = c.req.param("collection");
|
|
2062
2062
|
const id = c.req.param("id");
|
|
2063
2063
|
const db = c.env.DB;
|
|
2064
2064
|
const user = c.get("user");
|
|
2065
2065
|
const body = await c.req.json();
|
|
2066
|
-
const collRecord =
|
|
2066
|
+
const collRecord = chunkWIV3R2MJ_cjs.getCollectionRegistry().getBySlugOrName(collection);
|
|
2067
2067
|
const typeName = collRecord?.name ?? collection;
|
|
2068
2068
|
const docRow = await db.prepare("SELECT root_id, type_id FROM documents WHERE root_id = ? AND type_id = ? AND tenant_id = 'default' AND is_current_draft = 1 AND deleted_at IS NULL").bind(id, typeName).first();
|
|
2069
2069
|
if (!docRow) return c.json({ error: "Content not found" }, 404);
|
|
@@ -2075,8 +2075,8 @@ apiRoutes.put("/:collection/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6
|
|
|
2075
2075
|
} catch (err) {
|
|
2076
2076
|
return c.json({ error: "Write cancelled by plugin", details: String(err) }, 400);
|
|
2077
2077
|
}
|
|
2078
|
-
const docType = await new
|
|
2079
|
-
const svc = new
|
|
2078
|
+
const docType = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(docRow.type_id);
|
|
2079
|
+
const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, { queryableFields: docType?.queryableFields ?? [], typeSchemaVersion: docType?.schemaVersion ?? 1, maxVersionsPerRoot: docType?.settings?.maxVersionsPerRoot ?? 50, tenantId: "default", versioning: docType?.settings?.versioning ?? false });
|
|
2080
2080
|
const input = {};
|
|
2081
2081
|
if (body.title !== void 0) input.title = body.title;
|
|
2082
2082
|
if (body.slug !== void 0) input.slug = slugify(body.slug);
|
|
@@ -2092,25 +2092,25 @@ apiRoutes.put("/:collection/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6
|
|
|
2092
2092
|
const cache = chunk4BTBSXMR_cjs.getCacheService(chunk4BTBSXMR_cjs.CACHE_CONFIGS.api);
|
|
2093
2093
|
await cache.invalidate("content-filtered:*");
|
|
2094
2094
|
await cache.invalidate("collection-content-filtered:*");
|
|
2095
|
-
const coll =
|
|
2095
|
+
const coll = chunkWIV3R2MJ_cjs.getCollectionRegistry().getByName(docRow.type_id);
|
|
2096
2096
|
const saved = await db.prepare("SELECT * FROM documents WHERE id = ?").bind(newDraft.id).first();
|
|
2097
2097
|
const savedData = saved?.data ? JSON.parse(saved.data) : {};
|
|
2098
2098
|
dispatchHookEvent(c, "content:after:update", { collection: docRow.type_id, id, data: savedData, user: actor }, "fire-and-forget");
|
|
2099
2099
|
const nowPublished = body.status === "published" || body.status === void 0 && wasPublished;
|
|
2100
2100
|
if (nowPublished && !wasPublished) dispatchHookEvent(c, "content:after:publish", { collection: docRow.type_id, id, data: savedData, user: actor }, "fire-and-forget");
|
|
2101
|
-
return c.json({ data: { id: saved.root_id, title: saved.title, slug: saved.slug, status: saved.status, collectionId: coll?.id ?? docRow.type_id, data: savedData, created_at:
|
|
2101
|
+
return c.json({ data: { id: saved.root_id, title: saved.title, slug: saved.slug, status: saved.status, collectionId: coll?.id ?? docRow.type_id, data: savedData, created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(saved.created_at), updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(saved.updated_at) } });
|
|
2102
2102
|
} catch (error) {
|
|
2103
2103
|
console.error("Error updating content:", error);
|
|
2104
2104
|
return c.json({ error: "Failed to update content", details: error instanceof Error ? error.message : String(error) }, 500);
|
|
2105
2105
|
}
|
|
2106
2106
|
});
|
|
2107
|
-
apiRoutes.delete("/:collection/:id",
|
|
2107
|
+
apiRoutes.delete("/:collection/:id", chunkL3KHLEHL_cjs.requireAuth(), chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
|
|
2108
2108
|
try {
|
|
2109
2109
|
const collection = c.req.param("collection");
|
|
2110
2110
|
const id = c.req.param("id");
|
|
2111
2111
|
const db = c.env.DB;
|
|
2112
2112
|
const user = c.get("user");
|
|
2113
|
-
const collRecord =
|
|
2113
|
+
const collRecord = chunkWIV3R2MJ_cjs.getCollectionRegistry().getBySlugOrName(collection);
|
|
2114
2114
|
const typeName = collRecord?.name ?? collection;
|
|
2115
2115
|
const docRow = await db.prepare("SELECT type_id FROM documents WHERE root_id = ? AND type_id = ? AND tenant_id = 'default' AND deleted_at IS NULL LIMIT 1").bind(id, typeName).first();
|
|
2116
2116
|
if (!docRow) return c.json({ error: "Content not found" }, 404);
|
|
@@ -2195,7 +2195,7 @@ var MediaDocumentService = class {
|
|
|
2195
2195
|
}
|
|
2196
2196
|
/** Create a media_asset document from R2 upload metadata. Published-on-create (immediately usable). */
|
|
2197
2197
|
async createFromUpload(meta, createdBy) {
|
|
2198
|
-
const svc = new
|
|
2198
|
+
const svc = new chunkW36OZTJ5_cjs.DocumentsService(this.db, { queryableFields: MEDIA_QUERYABLE, tenantId: this.tenantId, maxVersionsPerRoot: 5 });
|
|
2199
2199
|
return svc.create(
|
|
2200
2200
|
createDocumentSchema.parse({
|
|
2201
2201
|
typeId: "media_asset",
|
|
@@ -2268,7 +2268,7 @@ var MediaDocumentService = class {
|
|
|
2268
2268
|
}
|
|
2269
2269
|
/** Update alt/caption/tags on a media_asset document (saveDraft + publish atomically). */
|
|
2270
2270
|
async updateMetadata(rootId, meta, updatedBy) {
|
|
2271
|
-
const svc = new
|
|
2271
|
+
const svc = new chunkW36OZTJ5_cjs.DocumentsService(this.db, { queryableFields: MEDIA_QUERYABLE, tenantId: this.tenantId, maxVersionsPerRoot: 5 });
|
|
2272
2272
|
const newDraft = await svc.saveDraft(rootId, { data: meta }, updatedBy);
|
|
2273
2273
|
return svc.publish(newDraft.id, updatedBy);
|
|
2274
2274
|
}
|
|
@@ -2325,7 +2325,7 @@ var fileValidationSchema = zod.z.object({
|
|
|
2325
2325
|
// 50MB max
|
|
2326
2326
|
});
|
|
2327
2327
|
var apiMediaRoutes = new hono.Hono();
|
|
2328
|
-
apiMediaRoutes.use("*",
|
|
2328
|
+
apiMediaRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
|
|
2329
2329
|
apiMediaRoutes.post("/upload", async (c) => {
|
|
2330
2330
|
try {
|
|
2331
2331
|
const user = c.get("user");
|
|
@@ -3023,7 +3023,7 @@ apiSystemRoutes.get("/info", (c) => {
|
|
|
3023
3023
|
apiSystemRoutes.get("/stats", async (c) => {
|
|
3024
3024
|
try {
|
|
3025
3025
|
const db = c.env.DB;
|
|
3026
|
-
const typeIds =
|
|
3026
|
+
const typeIds = chunkWIV3R2MJ_cjs.getCollectionRegistry().listActive().filter((r) => !r.internal).map((r) => r.name);
|
|
3027
3027
|
let contentStats = null;
|
|
3028
3028
|
if (typeIds.length > 0) {
|
|
3029
3029
|
const placeholders = typeIds.map(() => "?").join(",");
|
|
@@ -3098,12 +3098,12 @@ apiSystemRoutes.get("/env", (c) => {
|
|
|
3098
3098
|
});
|
|
3099
3099
|
var api_system_default = apiSystemRoutes;
|
|
3100
3100
|
var adminApiRoutes = new hono.Hono();
|
|
3101
|
-
adminApiRoutes.use("*",
|
|
3102
|
-
adminApiRoutes.use("*",
|
|
3101
|
+
adminApiRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
|
|
3102
|
+
adminApiRoutes.use("*", chunkL3KHLEHL_cjs.requireRole(["admin", "editor"]));
|
|
3103
3103
|
adminApiRoutes.get("/stats", async (c) => {
|
|
3104
3104
|
try {
|
|
3105
3105
|
const db = c.env.DB;
|
|
3106
|
-
const userCollections =
|
|
3106
|
+
const userCollections = chunkWIV3R2MJ_cjs.getCollectionRegistry().listActive().filter((r) => !r.internal);
|
|
3107
3107
|
const collectionsCount = userCollections.length;
|
|
3108
3108
|
let contentCount = 0;
|
|
3109
3109
|
if (userCollections.length > 0) {
|
|
@@ -3194,7 +3194,7 @@ adminApiRoutes.get("/collections", async (c) => {
|
|
|
3194
3194
|
try {
|
|
3195
3195
|
const search = c.req.query("search") || "";
|
|
3196
3196
|
const includeInactive = c.req.query("includeInactive") === "true";
|
|
3197
|
-
let records =
|
|
3197
|
+
let records = chunkWIV3R2MJ_cjs.getCollectionRegistry().list().filter((r) => !r.internal);
|
|
3198
3198
|
if (!includeInactive) records = records.filter((r) => r.isActive !== false);
|
|
3199
3199
|
if (search) {
|
|
3200
3200
|
const needle = search.toLowerCase();
|
|
@@ -3226,7 +3226,7 @@ adminApiRoutes.get("/collections", async (c) => {
|
|
|
3226
3226
|
adminApiRoutes.get("/collections/:id", async (c) => {
|
|
3227
3227
|
try {
|
|
3228
3228
|
const id = c.req.param("id");
|
|
3229
|
-
const registry =
|
|
3229
|
+
const registry = chunkWIV3R2MJ_cjs.getCollectionRegistry();
|
|
3230
3230
|
const record = registry.getById(id) ?? registry.getByName(id);
|
|
3231
3231
|
if (!record) {
|
|
3232
3232
|
return c.json({ error: "Collection not found" }, 404);
|
|
@@ -3276,7 +3276,7 @@ adminApiRoutes.get("/references", async (c) => {
|
|
|
3276
3276
|
if (collectionParams.length === 0) {
|
|
3277
3277
|
return c.json({ error: "Collection is required" }, 400);
|
|
3278
3278
|
}
|
|
3279
|
-
const registry =
|
|
3279
|
+
const registry = chunkWIV3R2MJ_cjs.getCollectionRegistry();
|
|
3280
3280
|
const matched = collectionParams.map((param) => registry.getById(param) ?? registry.getByName(param)).filter((r) => !!r);
|
|
3281
3281
|
const seen = /* @__PURE__ */ new Set();
|
|
3282
3282
|
const collections = matched.filter((r) => {
|
|
@@ -3391,7 +3391,7 @@ adminApiRoutes.patch("/collections/:id", collectionsReadOnly);
|
|
|
3391
3391
|
adminApiRoutes.delete("/collections/:id", collectionsReadOnly);
|
|
3392
3392
|
adminApiRoutes.get("/migrations/status", async (c) => {
|
|
3393
3393
|
try {
|
|
3394
|
-
const { MigrationService: MigrationService2 } = await import('./migrations-
|
|
3394
|
+
const { MigrationService: MigrationService2 } = await import('./migrations-TYYC66P4.cjs');
|
|
3395
3395
|
const db = c.env.DB;
|
|
3396
3396
|
const migrationService = new MigrationService2(db);
|
|
3397
3397
|
const status = await migrationService.getMigrationStatus();
|
|
@@ -3434,7 +3434,7 @@ adminApiRoutes.post("/migrations/run", async (c) => {
|
|
|
3434
3434
|
});
|
|
3435
3435
|
adminApiRoutes.get("/migrations/validate", async (c) => {
|
|
3436
3436
|
try {
|
|
3437
|
-
const { MigrationService: MigrationService2 } = await import('./migrations-
|
|
3437
|
+
const { MigrationService: MigrationService2 } = await import('./migrations-TYYC66P4.cjs');
|
|
3438
3438
|
const db = c.env.DB;
|
|
3439
3439
|
const migrationService = new MigrationService2(db);
|
|
3440
3440
|
const validation = await migrationService.validateSchema();
|
|
@@ -3593,7 +3593,7 @@ function renderLoginPage(data, demoLoginActive = false) {
|
|
|
3593
3593
|
<!-- Form -->
|
|
3594
3594
|
<form
|
|
3595
3595
|
id="login-form"
|
|
3596
|
-
hx-post="/auth/login/form"
|
|
3596
|
+
hx-post="/auth/login/form${data.redirect ? `?redirect=${encodeURIComponent(data.redirect)}` : ""}"
|
|
3597
3597
|
hx-target="#form-response"
|
|
3598
3598
|
hx-swap="innerHTML"
|
|
3599
3599
|
class="space-y-6"
|
|
@@ -3849,7 +3849,7 @@ function renderRegisterPage(data) {
|
|
|
3849
3849
|
}
|
|
3850
3850
|
|
|
3851
3851
|
// src/services/email/email-service-singleton.ts
|
|
3852
|
-
var singleton =
|
|
3852
|
+
var singleton = chunk4YRYGDCQ_cjs.createServiceSingleton("EmailService");
|
|
3853
3853
|
function setEmailService(service2) {
|
|
3854
3854
|
singleton.set(service2);
|
|
3855
3855
|
}
|
|
@@ -3893,7 +3893,7 @@ function emptyProfile() {
|
|
|
3893
3893
|
return { custom: {} };
|
|
3894
3894
|
}
|
|
3895
3895
|
function service(db) {
|
|
3896
|
-
return new
|
|
3896
|
+
return new chunkW36OZTJ5_cjs.DocumentsService(db, { tenantId: "default", maxVersionsPerRoot: 1, queryableFields: [] });
|
|
3897
3897
|
}
|
|
3898
3898
|
async function readProfileData(db, userId) {
|
|
3899
3899
|
const row = await db.prepare(
|
|
@@ -4657,7 +4657,7 @@ function getLexicalInitScript(settings = {}) {
|
|
|
4657
4657
|
</script>
|
|
4658
4658
|
`;
|
|
4659
4659
|
}
|
|
4660
|
-
var lexicalEditorPlugin =
|
|
4660
|
+
var lexicalEditorPlugin = chunk4YRYGDCQ_cjs.definePlugin({
|
|
4661
4661
|
id: "lexical-editor",
|
|
4662
4662
|
version: "1.0.0",
|
|
4663
4663
|
name: "Lexical Editor",
|
|
@@ -5581,6 +5581,79 @@ function renderDynamicField(field, options = {}) {
|
|
|
5581
5581
|
`;
|
|
5582
5582
|
break;
|
|
5583
5583
|
}
|
|
5584
|
+
case "json": {
|
|
5585
|
+
const jsonParsedValue = value !== null && value !== void 0 && typeof value !== "string" ? value : typeof value === "string" && value !== "" ? (() => {
|
|
5586
|
+
try {
|
|
5587
|
+
return JSON.parse(value);
|
|
5588
|
+
} catch {
|
|
5589
|
+
return value;
|
|
5590
|
+
}
|
|
5591
|
+
})() : null;
|
|
5592
|
+
const jsonDisplayValue = jsonParsedValue !== null && typeof jsonParsedValue !== "string" ? JSON.stringify(jsonParsedValue, null, 2) : typeof jsonParsedValue === "string" ? jsonParsedValue : "";
|
|
5593
|
+
const viewerId = `${fieldId}-viewer`;
|
|
5594
|
+
const textareaId = `${fieldId}-textarea`;
|
|
5595
|
+
const jsonDataAttr = escapeHtml2(JSON.stringify(jsonParsedValue ?? null));
|
|
5596
|
+
const isEmpty = jsonParsedValue === null || jsonDisplayValue === "";
|
|
5597
|
+
if (disabled) {
|
|
5598
|
+
fieldHTML = `
|
|
5599
|
+
<div
|
|
5600
|
+
id="${viewerId}"
|
|
5601
|
+
class="json-viewer-host rounded-lg px-3 py-2 text-xs bg-white dark:bg-zinc-800 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 min-h-[2.5rem] overflow-auto"
|
|
5602
|
+
data-json-viewer
|
|
5603
|
+
data-json="${jsonDataAttr}"
|
|
5604
|
+
data-open="${opts.open ?? 2}"
|
|
5605
|
+
>${isEmpty ? '<span class="text-zinc-400 dark:text-zinc-500 italic">empty</span>' : ""}</div>
|
|
5606
|
+
${getJsonViewerScript()}
|
|
5607
|
+
`;
|
|
5608
|
+
} else {
|
|
5609
|
+
fieldHTML = `
|
|
5610
|
+
<div class="json-field-wrapper space-y-2">
|
|
5611
|
+
<div class="flex items-center justify-end">
|
|
5612
|
+
<button
|
|
5613
|
+
type="button"
|
|
5614
|
+
id="${fieldId}-toggle"
|
|
5615
|
+
class="text-xs text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200 underline transition-colors"
|
|
5616
|
+
data-json-toggle
|
|
5617
|
+
data-viewer="${viewerId}"
|
|
5618
|
+
data-textarea="${textareaId}"
|
|
5619
|
+
data-hidden-input="${fieldId}"
|
|
5620
|
+
>Edit JSON</button>
|
|
5621
|
+
</div>
|
|
5622
|
+
|
|
5623
|
+
<div
|
|
5624
|
+
id="${viewerId}"
|
|
5625
|
+
class="json-viewer-host rounded-lg px-3 py-2 text-xs bg-white dark:bg-zinc-800 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 min-h-[2.5rem] overflow-auto"
|
|
5626
|
+
data-json-viewer
|
|
5627
|
+
data-json="${jsonDataAttr}"
|
|
5628
|
+
data-open="${opts.open ?? 2}"
|
|
5629
|
+
>${isEmpty ? '<span class="text-zinc-400 dark:text-zinc-500 italic">empty \u2014 click "Edit JSON" to add data</span>' : ""}</div>
|
|
5630
|
+
|
|
5631
|
+
<textarea
|
|
5632
|
+
id="${textareaId}"
|
|
5633
|
+
rows="${opts.rows || 8}"
|
|
5634
|
+
placeholder="${opts.placeholder || "{}"}"
|
|
5635
|
+
class="${baseClasses} ${errorClasses} resize-y font-mono text-xs hidden"
|
|
5636
|
+
aria-label="${escapeHtml2(field.field_label)}"
|
|
5637
|
+
data-json-edit-area
|
|
5638
|
+
data-viewer="${viewerId}"
|
|
5639
|
+
data-hidden-input="${fieldId}"
|
|
5640
|
+
>${escapeHtml2(jsonDisplayValue)}</textarea>
|
|
5641
|
+
|
|
5642
|
+
<input
|
|
5643
|
+
type="hidden"
|
|
5644
|
+
id="${fieldId}"
|
|
5645
|
+
name="${fieldName}"
|
|
5646
|
+
value="${escapeHtml2(jsonDisplayValue)}"
|
|
5647
|
+
${required}
|
|
5648
|
+
>
|
|
5649
|
+
|
|
5650
|
+
<div id="${fieldId}-json-error" class="text-xs text-pink-500 dark:text-pink-400 hidden"></div>
|
|
5651
|
+
</div>
|
|
5652
|
+
${getJsonViewerScript()}
|
|
5653
|
+
`;
|
|
5654
|
+
}
|
|
5655
|
+
break;
|
|
5656
|
+
}
|
|
5584
5657
|
default:
|
|
5585
5658
|
fieldHTML = `
|
|
5586
5659
|
<input
|
|
@@ -6077,6 +6150,120 @@ function normalizeBlockField(fieldConfig, fieldName) {
|
|
|
6077
6150
|
options
|
|
6078
6151
|
};
|
|
6079
6152
|
}
|
|
6153
|
+
function getJsonViewerScript() {
|
|
6154
|
+
return `
|
|
6155
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/json-formatter-js@2.5.23/dist/json-formatter.min.css" id="json-formatter-css" onload="this.removeAttribute('onload')" onerror="">
|
|
6156
|
+
<script>
|
|
6157
|
+
(function() {
|
|
6158
|
+
var JS_URL = 'https://cdn.jsdelivr.net/npm/json-formatter-js@2.5.23/dist/json-formatter.umd.min.js';
|
|
6159
|
+
|
|
6160
|
+
function isDark() {
|
|
6161
|
+
return document.documentElement.classList.contains('dark') ||
|
|
6162
|
+
document.documentElement.dataset.theme === 'dark' ||
|
|
6163
|
+
window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
6164
|
+
}
|
|
6165
|
+
|
|
6166
|
+
function initViewer(el) {
|
|
6167
|
+
var raw = el.dataset.json;
|
|
6168
|
+
var open = parseInt(el.dataset.open || '2', 10);
|
|
6169
|
+
if (!raw || raw === 'null') return;
|
|
6170
|
+
var data;
|
|
6171
|
+
try { data = JSON.parse(raw); } catch(e) { el.textContent = raw; return; }
|
|
6172
|
+
var fmt = new JSONFormatter(data, open, {
|
|
6173
|
+
hoverPreviewEnabled: true,
|
|
6174
|
+
hoverPreviewArrayCount: 5,
|
|
6175
|
+
hoverPreviewFieldCount: 5,
|
|
6176
|
+
theme: isDark() ? 'dark' : '',
|
|
6177
|
+
animateOpen: true,
|
|
6178
|
+
animateClose: true,
|
|
6179
|
+
});
|
|
6180
|
+
el.innerHTML = '';
|
|
6181
|
+
el.appendChild(fmt.render());
|
|
6182
|
+
}
|
|
6183
|
+
|
|
6184
|
+
function initAllViewers() {
|
|
6185
|
+
document.querySelectorAll('[data-json-viewer]').forEach(function(el) { initViewer(el); });
|
|
6186
|
+
}
|
|
6187
|
+
|
|
6188
|
+
function ensureLoaded(cb) {
|
|
6189
|
+
if (window.JSONFormatter) { cb(); return; }
|
|
6190
|
+
if (window.__jsonFormatterCallbacks) { window.__jsonFormatterCallbacks.push(cb); return; }
|
|
6191
|
+
window.__jsonFormatterCallbacks = [cb];
|
|
6192
|
+
var s = document.createElement('script');
|
|
6193
|
+
s.src = JS_URL;
|
|
6194
|
+
s.onload = function() {
|
|
6195
|
+
(window.__jsonFormatterCallbacks || []).forEach(function(fn) { fn(); });
|
|
6196
|
+
window.__jsonFormatterCallbacks = null;
|
|
6197
|
+
};
|
|
6198
|
+
document.head.appendChild(s);
|
|
6199
|
+
}
|
|
6200
|
+
|
|
6201
|
+
if (!window.__sonicJsonViewerInit) {
|
|
6202
|
+
window.__sonicJsonViewerInit = true;
|
|
6203
|
+
|
|
6204
|
+
// Toggle between viewer and edit textarea
|
|
6205
|
+
document.addEventListener('click', function(e) {
|
|
6206
|
+
var btn = e.target.closest('[data-json-toggle]');
|
|
6207
|
+
if (!btn) return;
|
|
6208
|
+
var viewerId = btn.dataset.viewer;
|
|
6209
|
+
var textareaId = btn.dataset.textarea;
|
|
6210
|
+
var hiddenId = btn.dataset.hiddenInput;
|
|
6211
|
+
var viewer = document.getElementById(viewerId);
|
|
6212
|
+
var textarea = document.getElementById(textareaId);
|
|
6213
|
+
var hidden = document.getElementById(hiddenId);
|
|
6214
|
+
var errorEl = hidden ? document.getElementById(hiddenId + '-json-error') : null;
|
|
6215
|
+
if (!viewer || !textarea) return;
|
|
6216
|
+
var isEditing = !textarea.classList.contains('hidden');
|
|
6217
|
+
if (isEditing) {
|
|
6218
|
+
// Switching back to viewer \u2014 validate + refresh
|
|
6219
|
+
var raw = textarea.value.trim();
|
|
6220
|
+
if (raw) {
|
|
6221
|
+
try {
|
|
6222
|
+
var parsed = JSON.parse(raw);
|
|
6223
|
+
if (hidden) hidden.value = raw;
|
|
6224
|
+
viewer.dataset.json = JSON.stringify(parsed);
|
|
6225
|
+
ensureLoaded(function() { initViewer(viewer); });
|
|
6226
|
+
if (errorEl) { errorEl.textContent = ''; errorEl.classList.add('hidden'); }
|
|
6227
|
+
} catch(ex) {
|
|
6228
|
+
if (errorEl) { errorEl.textContent = 'Invalid JSON: ' + ex.message; errorEl.classList.remove('hidden'); }
|
|
6229
|
+
return;
|
|
6230
|
+
}
|
|
6231
|
+
} else {
|
|
6232
|
+
if (hidden) hidden.value = '';
|
|
6233
|
+
viewer.innerHTML = '<span class="text-zinc-400 dark:text-zinc-500 italic">empty</span>';
|
|
6234
|
+
}
|
|
6235
|
+
textarea.classList.add('hidden');
|
|
6236
|
+
viewer.classList.remove('hidden');
|
|
6237
|
+
btn.textContent = 'Edit JSON';
|
|
6238
|
+
} else {
|
|
6239
|
+
// Switching to edit \u2014 populate textarea from hidden input
|
|
6240
|
+
if (hidden && hidden.value) {
|
|
6241
|
+
try {
|
|
6242
|
+
textarea.value = JSON.stringify(JSON.parse(hidden.value), null, 2);
|
|
6243
|
+
} catch(e) {
|
|
6244
|
+
textarea.value = hidden.value;
|
|
6245
|
+
}
|
|
6246
|
+
}
|
|
6247
|
+
viewer.classList.add('hidden');
|
|
6248
|
+
textarea.classList.remove('hidden');
|
|
6249
|
+
btn.textContent = 'Preview';
|
|
6250
|
+
}
|
|
6251
|
+
});
|
|
6252
|
+
}
|
|
6253
|
+
|
|
6254
|
+
function run() {
|
|
6255
|
+
ensureLoaded(initAllViewers);
|
|
6256
|
+
}
|
|
6257
|
+
|
|
6258
|
+
if (document.readyState === 'loading') {
|
|
6259
|
+
document.addEventListener('DOMContentLoaded', run);
|
|
6260
|
+
} else {
|
|
6261
|
+
run();
|
|
6262
|
+
}
|
|
6263
|
+
})();
|
|
6264
|
+
</script>
|
|
6265
|
+
`;
|
|
6266
|
+
}
|
|
6080
6267
|
function getStructuredFieldScript() {
|
|
6081
6268
|
return `
|
|
6082
6269
|
${getReadFieldValueScript()}
|
|
@@ -6876,7 +7063,7 @@ api.put("/:userId", async (c) => {
|
|
|
6876
7063
|
await saveCustomData(db, userId, sanitized);
|
|
6877
7064
|
return c.json({ success: true });
|
|
6878
7065
|
});
|
|
6879
|
-
var userProfilesPlugin =
|
|
7066
|
+
var userProfilesPlugin = chunk4YRYGDCQ_cjs.definePlugin({
|
|
6880
7067
|
id: "user-profiles",
|
|
6881
7068
|
version: "1.0.0",
|
|
6882
7069
|
name: "User Profiles",
|
|
@@ -6914,8 +7101,8 @@ function renderPasswordResetEmail(resetLink, firstName) {
|
|
|
6914
7101
|
async function setCsrfCookie(c, maxAge) {
|
|
6915
7102
|
const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK;
|
|
6916
7103
|
const isDev = c.env?.ENVIRONMENT === "development" || !c.env?.ENVIRONMENT;
|
|
6917
|
-
const csrfToken = await
|
|
6918
|
-
const cookieMaxAge = await
|
|
7104
|
+
const csrfToken = await chunkL3KHLEHL_cjs.generateCsrfToken(secret);
|
|
7105
|
+
const cookieMaxAge = await chunkL3KHLEHL_cjs.getJwtExpirySecondsFromDb(c.env?.DB, c.env);
|
|
6919
7106
|
cookie.setCookie(c, "csrf_token", csrfToken, {
|
|
6920
7107
|
httpOnly: false,
|
|
6921
7108
|
secure: !isDev,
|
|
@@ -6937,10 +7124,12 @@ var authRoutes = new hono.Hono();
|
|
|
6937
7124
|
authRoutes.get("/login", async (c) => {
|
|
6938
7125
|
const error = c.req.query("error");
|
|
6939
7126
|
const message = c.req.query("message");
|
|
7127
|
+
const redirect = c.req.query("redirect");
|
|
6940
7128
|
const pageData = {
|
|
6941
7129
|
error: error || void 0,
|
|
6942
7130
|
message: message || void 0,
|
|
6943
|
-
version: c.get("appVersion")
|
|
7131
|
+
version: c.get("appVersion"),
|
|
7132
|
+
redirect: redirect && redirect.startsWith("/") ? redirect : void 0
|
|
6944
7133
|
};
|
|
6945
7134
|
const db = c.env.DB;
|
|
6946
7135
|
let demoLoginActive = false;
|
|
@@ -6972,7 +7161,7 @@ var loginSchema = zod.z.object({
|
|
|
6972
7161
|
});
|
|
6973
7162
|
authRoutes.post(
|
|
6974
7163
|
"/register",
|
|
6975
|
-
|
|
7164
|
+
chunkL3KHLEHL_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }),
|
|
6976
7165
|
async (c) => {
|
|
6977
7166
|
try {
|
|
6978
7167
|
const db = c.env.DB;
|
|
@@ -7008,7 +7197,7 @@ authRoutes.post(
|
|
|
7008
7197
|
if (existingUser) {
|
|
7009
7198
|
return c.json({ error: "User with this email already exists" }, 400);
|
|
7010
7199
|
}
|
|
7011
|
-
const passwordHash = await
|
|
7200
|
+
const passwordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(password);
|
|
7012
7201
|
const userId = crypto.randomUUID();
|
|
7013
7202
|
const now = /* @__PURE__ */ new Date();
|
|
7014
7203
|
const nowSec = Math.floor(now.getTime() / 1e3);
|
|
@@ -7041,8 +7230,8 @@ authRoutes.post(
|
|
|
7041
7230
|
{ user: { id: userId, email: normalizedEmail, role: "viewer" } },
|
|
7042
7231
|
"fire-and-forget"
|
|
7043
7232
|
);
|
|
7044
|
-
const tokenTtl = await
|
|
7045
|
-
const token = await
|
|
7233
|
+
const tokenTtl = await chunkL3KHLEHL_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env);
|
|
7234
|
+
const token = await chunkL3KHLEHL_cjs.AuthManager.generateToken(userId, normalizedEmail, "viewer", c.env.JWT_SECRET, tokenTtl);
|
|
7046
7235
|
cookie.setCookie(c, "auth_token", token, {
|
|
7047
7236
|
httpOnly: true,
|
|
7048
7237
|
secure: true,
|
|
@@ -7074,7 +7263,7 @@ authRoutes.post(
|
|
|
7074
7263
|
);
|
|
7075
7264
|
authRoutes.post(
|
|
7076
7265
|
"/login",
|
|
7077
|
-
|
|
7266
|
+
chunkL3KHLEHL_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }),
|
|
7078
7267
|
async (c) => {
|
|
7079
7268
|
try {
|
|
7080
7269
|
const body = await c.req.json();
|
|
@@ -7084,7 +7273,7 @@ authRoutes.post(
|
|
|
7084
7273
|
}
|
|
7085
7274
|
const { email, password } = validation.data;
|
|
7086
7275
|
const normalizedEmail = email.toLowerCase();
|
|
7087
|
-
const { createAuth } = await import('./config-
|
|
7276
|
+
const { createAuth } = await import('./config-FLOUCYHH.cjs');
|
|
7088
7277
|
const auth = createAuth(c.env);
|
|
7089
7278
|
const baReq = new Request(new URL("/auth/sign-in/email", c.req.url).href, {
|
|
7090
7279
|
method: "POST",
|
|
@@ -7106,6 +7295,20 @@ authRoutes.post(
|
|
|
7106
7295
|
await setCsrfCookie(c);
|
|
7107
7296
|
const baBody = await baRes.json();
|
|
7108
7297
|
const user = baBody.user ?? {};
|
|
7298
|
+
const tokenTtl = await chunkL3KHLEHL_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env);
|
|
7299
|
+
const token = await chunkL3KHLEHL_cjs.AuthManager.generateToken(
|
|
7300
|
+
user.id,
|
|
7301
|
+
user.email,
|
|
7302
|
+
user.role ?? "viewer",
|
|
7303
|
+
c.env.JWT_SECRET,
|
|
7304
|
+
tokenTtl
|
|
7305
|
+
);
|
|
7306
|
+
cookie.setCookie(c, "auth_token", token, {
|
|
7307
|
+
httpOnly: true,
|
|
7308
|
+
secure: true,
|
|
7309
|
+
sameSite: "Strict",
|
|
7310
|
+
maxAge: tokenTtl
|
|
7311
|
+
});
|
|
7109
7312
|
return c.json({
|
|
7110
7313
|
user: {
|
|
7111
7314
|
id: user.id,
|
|
@@ -7113,7 +7316,8 @@ authRoutes.post(
|
|
|
7113
7316
|
firstName: user.name?.split(" ")[0] ?? "",
|
|
7114
7317
|
lastName: user.name?.split(" ").slice(1).join(" ") ?? "",
|
|
7115
7318
|
role: user.role ?? "viewer"
|
|
7116
|
-
}
|
|
7319
|
+
},
|
|
7320
|
+
token
|
|
7117
7321
|
});
|
|
7118
7322
|
} catch (error) {
|
|
7119
7323
|
console.error("Login error:", error);
|
|
@@ -7123,7 +7327,7 @@ authRoutes.post(
|
|
|
7123
7327
|
);
|
|
7124
7328
|
authRoutes.post("/logout", async (c) => {
|
|
7125
7329
|
try {
|
|
7126
|
-
const { createAuth } = await import('./config-
|
|
7330
|
+
const { createAuth } = await import('./config-FLOUCYHH.cjs');
|
|
7127
7331
|
const auth = createAuth(c.env);
|
|
7128
7332
|
const baReq = new Request(new URL("/auth/sign-out", c.req.url).href, {
|
|
7129
7333
|
method: "POST",
|
|
@@ -7139,7 +7343,7 @@ authRoutes.post("/logout", async (c) => {
|
|
|
7139
7343
|
});
|
|
7140
7344
|
authRoutes.get("/logout", async (c) => {
|
|
7141
7345
|
try {
|
|
7142
|
-
const { createAuth } = await import('./config-
|
|
7346
|
+
const { createAuth } = await import('./config-FLOUCYHH.cjs');
|
|
7143
7347
|
const auth = createAuth(c.env);
|
|
7144
7348
|
const baReq = new Request(new URL("/auth/sign-out", c.req.url).href, {
|
|
7145
7349
|
method: "POST",
|
|
@@ -7153,7 +7357,7 @@ authRoutes.get("/logout", async (c) => {
|
|
|
7153
7357
|
clearCsrfCookie(c);
|
|
7154
7358
|
return c.redirect("/auth/login?message=You have been logged out successfully");
|
|
7155
7359
|
});
|
|
7156
|
-
authRoutes.get("/me",
|
|
7360
|
+
authRoutes.get("/me", chunkL3KHLEHL_cjs.requireAuth(), async (c) => {
|
|
7157
7361
|
try {
|
|
7158
7362
|
const user = c.get("user");
|
|
7159
7363
|
if (!user) {
|
|
@@ -7173,7 +7377,7 @@ authRoutes.get("/me", chunkBYLQOBO6_cjs.requireAuth(), async (c) => {
|
|
|
7173
7377
|
});
|
|
7174
7378
|
authRoutes.post(
|
|
7175
7379
|
"/refresh",
|
|
7176
|
-
|
|
7380
|
+
chunkL3KHLEHL_cjs.rateLimit({ max: 60, windowMs: 60 * 1e3, keyPrefix: "refresh" }),
|
|
7177
7381
|
async (c) => {
|
|
7178
7382
|
try {
|
|
7179
7383
|
let token = c.req.header("Authorization")?.replace("Bearer ", "");
|
|
@@ -7182,8 +7386,8 @@ authRoutes.post(
|
|
|
7182
7386
|
return c.json({ error: "Authentication required" }, 401);
|
|
7183
7387
|
}
|
|
7184
7388
|
const db = c.env.DB;
|
|
7185
|
-
const grace = await
|
|
7186
|
-
const payload = await
|
|
7389
|
+
const grace = await chunkL3KHLEHL_cjs.getJwtRefreshGraceSecondsFromDb(db, c.env);
|
|
7390
|
+
const payload = await chunkL3KHLEHL_cjs.AuthManager.verifyToken(token, c.env.JWT_SECRET, grace);
|
|
7187
7391
|
if (!payload) {
|
|
7188
7392
|
return c.json({ error: "Invalid or expired token" }, 401);
|
|
7189
7393
|
}
|
|
@@ -7191,8 +7395,8 @@ authRoutes.post(
|
|
|
7191
7395
|
if (!row || !row.is_active) {
|
|
7192
7396
|
return c.json({ error: "User is not active" }, 401);
|
|
7193
7397
|
}
|
|
7194
|
-
const tokenTtl = await
|
|
7195
|
-
const newToken = await
|
|
7398
|
+
const tokenTtl = await chunkL3KHLEHL_cjs.getJwtExpirySecondsFromDb(db, c.env);
|
|
7399
|
+
const newToken = await chunkL3KHLEHL_cjs.AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl);
|
|
7196
7400
|
cookie.setCookie(c, "auth_token", newToken, {
|
|
7197
7401
|
httpOnly: true,
|
|
7198
7402
|
secure: true,
|
|
@@ -7212,7 +7416,7 @@ authRoutes.post(
|
|
|
7212
7416
|
);
|
|
7213
7417
|
authRoutes.post(
|
|
7214
7418
|
"/register/form",
|
|
7215
|
-
|
|
7419
|
+
chunkL3KHLEHL_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }),
|
|
7216
7420
|
async (c) => {
|
|
7217
7421
|
try {
|
|
7218
7422
|
const db = c.env.DB;
|
|
@@ -7257,7 +7461,7 @@ authRoutes.post(
|
|
|
7257
7461
|
</div>
|
|
7258
7462
|
`);
|
|
7259
7463
|
}
|
|
7260
|
-
const passwordHash = await
|
|
7464
|
+
const passwordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(password);
|
|
7261
7465
|
const role = isFirstUser ? "admin" : "viewer";
|
|
7262
7466
|
const userId = crypto.randomUUID();
|
|
7263
7467
|
const now = /* @__PURE__ */ new Date();
|
|
@@ -7291,7 +7495,7 @@ authRoutes.post(
|
|
|
7291
7495
|
await saveCustomData(db, userId, sanitized);
|
|
7292
7496
|
}
|
|
7293
7497
|
}
|
|
7294
|
-
const rbacService = new
|
|
7498
|
+
const rbacService = new chunkW36OZTJ5_cjs.RbacService(db);
|
|
7295
7499
|
await rbacService.addUserRoleByName(userId, role);
|
|
7296
7500
|
dispatchHookEvent(
|
|
7297
7501
|
c,
|
|
@@ -7299,8 +7503,8 @@ authRoutes.post(
|
|
|
7299
7503
|
{ user: { id: userId, email: normalizedEmail, role } },
|
|
7300
7504
|
"fire-and-forget"
|
|
7301
7505
|
);
|
|
7302
|
-
const tokenTtl = await
|
|
7303
|
-
const token = await
|
|
7506
|
+
const tokenTtl = await chunkL3KHLEHL_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env);
|
|
7507
|
+
const token = await chunkL3KHLEHL_cjs.AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl);
|
|
7304
7508
|
cookie.setCookie(c, "auth_token", token, {
|
|
7305
7509
|
httpOnly: true,
|
|
7306
7510
|
secure: false,
|
|
@@ -7332,7 +7536,7 @@ authRoutes.post(
|
|
|
7332
7536
|
);
|
|
7333
7537
|
authRoutes.post(
|
|
7334
7538
|
"/login/form",
|
|
7335
|
-
|
|
7539
|
+
chunkL3KHLEHL_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }),
|
|
7336
7540
|
async (c) => {
|
|
7337
7541
|
try {
|
|
7338
7542
|
const formData = await c.req.formData();
|
|
@@ -7346,7 +7550,7 @@ authRoutes.post(
|
|
|
7346
7550
|
</div>
|
|
7347
7551
|
`);
|
|
7348
7552
|
}
|
|
7349
|
-
const { createAuth } = await import('./config-
|
|
7553
|
+
const { createAuth } = await import('./config-FLOUCYHH.cjs');
|
|
7350
7554
|
const auth = createAuth(c.env);
|
|
7351
7555
|
const baReq = new Request(new URL("/auth/sign-in/email", c.req.url).href, {
|
|
7352
7556
|
method: "POST",
|
|
@@ -7370,6 +7574,8 @@ authRoutes.post(
|
|
|
7370
7574
|
}
|
|
7371
7575
|
}
|
|
7372
7576
|
await setCsrfCookie(c);
|
|
7577
|
+
const rawRedirect = c.req.query("redirect");
|
|
7578
|
+
const redirectUrl = rawRedirect && rawRedirect.startsWith("/") ? rawRedirect : "/admin/content";
|
|
7373
7579
|
return c.html(html.html`
|
|
7374
7580
|
<div id="form-response">
|
|
7375
7581
|
<div class="rounded-lg bg-green-100 dark:bg-lime-500/10 p-4 ring-1 ring-green-400 dark:ring-lime-500/20">
|
|
@@ -7382,7 +7588,7 @@ authRoutes.post(
|
|
|
7382
7588
|
</div>
|
|
7383
7589
|
</div>
|
|
7384
7590
|
<script>
|
|
7385
|
-
setTimeout(() => { window.location.href = '
|
|
7591
|
+
setTimeout(() => { window.location.href = '${redirectUrl}'; }, 500);
|
|
7386
7592
|
</script>
|
|
7387
7593
|
</div>
|
|
7388
7594
|
</div>
|
|
@@ -7399,14 +7605,14 @@ authRoutes.post(
|
|
|
7399
7605
|
);
|
|
7400
7606
|
authRoutes.post(
|
|
7401
7607
|
"/seed-admin",
|
|
7402
|
-
|
|
7608
|
+
chunkL3KHLEHL_cjs.rateLimit({ max: 10, windowMs: 60 * 1e3, keyPrefix: "seed-admin" }),
|
|
7403
7609
|
async (c) => {
|
|
7404
7610
|
try {
|
|
7405
7611
|
const db = c.env.DB;
|
|
7406
|
-
const rbac = new
|
|
7612
|
+
const rbac = new chunkW36OZTJ5_cjs.RbacService(db);
|
|
7407
7613
|
const results = [];
|
|
7408
7614
|
const upsertSeedUser = async (opts) => {
|
|
7409
|
-
const passwordHash = await
|
|
7615
|
+
const passwordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(opts.password);
|
|
7410
7616
|
const nowMs = Date.now();
|
|
7411
7617
|
const nowSec = Math.floor(nowMs / 1e3);
|
|
7412
7618
|
const existing = await db.prepare("SELECT id FROM auth_user WHERE email = ?").bind(opts.email).first();
|
|
@@ -7631,7 +7837,7 @@ authRoutes.post("/accept-invitation", async (c) => {
|
|
|
7631
7837
|
if (invitationAge > maxAge) {
|
|
7632
7838
|
return c.json({ error: "Invitation has expired" }, 400);
|
|
7633
7839
|
}
|
|
7634
|
-
const passwordHash = await
|
|
7840
|
+
const passwordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(password);
|
|
7635
7841
|
const updateStmt = db.prepare(`
|
|
7636
7842
|
UPDATE auth_user SET
|
|
7637
7843
|
password_hash = ?,
|
|
@@ -7648,8 +7854,8 @@ authRoutes.post("/accept-invitation", async (c) => {
|
|
|
7648
7854
|
Date.now(),
|
|
7649
7855
|
invitedUser.id
|
|
7650
7856
|
).run();
|
|
7651
|
-
const tokenTtl = await
|
|
7652
|
-
const authToken = await
|
|
7857
|
+
const tokenTtl = await chunkL3KHLEHL_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env);
|
|
7858
|
+
const authToken = await chunkL3KHLEHL_cjs.AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl);
|
|
7653
7859
|
cookie.setCookie(c, "auth_token", authToken, {
|
|
7654
7860
|
httpOnly: true,
|
|
7655
7861
|
secure: true,
|
|
@@ -7665,7 +7871,7 @@ authRoutes.post("/accept-invitation", async (c) => {
|
|
|
7665
7871
|
});
|
|
7666
7872
|
authRoutes.post(
|
|
7667
7873
|
"/request-password-reset",
|
|
7668
|
-
|
|
7874
|
+
chunkL3KHLEHL_cjs.rateLimit({ max: 3, windowMs: 15 * 60 * 1e3, keyPrefix: "password-reset" }),
|
|
7669
7875
|
async (c) => {
|
|
7670
7876
|
try {
|
|
7671
7877
|
const formData = await c.req.formData();
|
|
@@ -7902,7 +8108,7 @@ authRoutes.post("/reset-password", async (c) => {
|
|
|
7902
8108
|
if (Date.now() > user.password_reset_expires) {
|
|
7903
8109
|
return c.json({ error: "Reset token has expired" }, 400);
|
|
7904
8110
|
}
|
|
7905
|
-
const newPasswordHash = await
|
|
8111
|
+
const newPasswordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(password);
|
|
7906
8112
|
try {
|
|
7907
8113
|
const historyStmt = db.prepare(`
|
|
7908
8114
|
INSERT INTO auth_password_history (id, user_id, password_hash, created_at)
|
|
@@ -8116,7 +8322,7 @@ app.post("/test-seed-defaults", async (c) => {
|
|
|
8116
8322
|
var test_cleanup_default = app;
|
|
8117
8323
|
|
|
8118
8324
|
// src/plugins/available/easy-mdx/index.ts
|
|
8119
|
-
|
|
8325
|
+
chunk4YRYGDCQ_cjs.definePlugin({
|
|
8120
8326
|
id: "easy-mdx",
|
|
8121
8327
|
version: "1.0.0",
|
|
8122
8328
|
name: "EasyMDE Markdown Editor",
|
|
@@ -8316,7 +8522,7 @@ function getMDXEditorInitScript(config) {
|
|
|
8316
8522
|
}
|
|
8317
8523
|
|
|
8318
8524
|
// src/plugins/available/tinymce-plugin/index.ts
|
|
8319
|
-
|
|
8525
|
+
chunk4YRYGDCQ_cjs.definePlugin({
|
|
8320
8526
|
id: "tinymce-plugin",
|
|
8321
8527
|
version: "1.0.0",
|
|
8322
8528
|
name: "TinyMCE",
|
|
@@ -8586,7 +8792,7 @@ function getQuillCDN(version = "2.0.2") {
|
|
|
8586
8792
|
</style>
|
|
8587
8793
|
`;
|
|
8588
8794
|
}
|
|
8589
|
-
|
|
8795
|
+
chunk4YRYGDCQ_cjs.definePlugin({
|
|
8590
8796
|
id: "quill-editor",
|
|
8591
8797
|
version: "1.0.0",
|
|
8592
8798
|
name: "Quill Editor",
|
|
@@ -11160,7 +11366,7 @@ function extractFieldData(fields, formData, options = {}) {
|
|
|
11160
11366
|
}
|
|
11161
11367
|
return { data, errors };
|
|
11162
11368
|
}
|
|
11163
|
-
adminContentRoutes.use("*",
|
|
11369
|
+
adminContentRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
|
|
11164
11370
|
async function getCollectionFields(db, collectionId) {
|
|
11165
11371
|
console.log(`[getCollectionFields] Loading fields for collection: ${collectionId}`);
|
|
11166
11372
|
const collectionStmt = db.prepare("SELECT schema, queryable_fields FROM document_types WHERE id = ?");
|
|
@@ -11187,7 +11393,7 @@ async function getCollectionFields(db, collectionId) {
|
|
|
11187
11393
|
};
|
|
11188
11394
|
});
|
|
11189
11395
|
}
|
|
11190
|
-
const codeCollections2 = await
|
|
11396
|
+
const codeCollections2 = await chunkWIV3R2MJ_cjs.loadCollectionConfigs();
|
|
11191
11397
|
const codeMatch = codeCollections2.find((c) => c.name === collectionId);
|
|
11192
11398
|
if (codeMatch && codeMatch.schema?.properties) {
|
|
11193
11399
|
console.log(`[getCollectionFields] DB doc type has no properties \u2014 using code collection schema`);
|
|
@@ -11219,7 +11425,7 @@ async function getCollectionFields(db, collectionId) {
|
|
|
11219
11425
|
}
|
|
11220
11426
|
}
|
|
11221
11427
|
console.log(`[getCollectionFields] Not in database, checking code collections`);
|
|
11222
|
-
const codeCollections = await
|
|
11428
|
+
const codeCollections = await chunkWIV3R2MJ_cjs.loadCollectionConfigs();
|
|
11223
11429
|
console.log(`[getCollectionFields] Found ${codeCollections.length} code collections`);
|
|
11224
11430
|
const codeCollection = codeCollections.find((c) => c.name === collectionId);
|
|
11225
11431
|
if (codeCollection && codeCollection.schema) {
|
|
@@ -11273,7 +11479,7 @@ async function getCollection(db, collectionId) {
|
|
|
11273
11479
|
};
|
|
11274
11480
|
}
|
|
11275
11481
|
console.log(`[getCollection] Not in database, checking code collections`);
|
|
11276
|
-
const codeCollections = await
|
|
11482
|
+
const codeCollections = await chunkWIV3R2MJ_cjs.loadCollectionConfigs();
|
|
11277
11483
|
const codeCollection = codeCollections.find((c) => c.name === collectionId);
|
|
11278
11484
|
if (codeCollection) {
|
|
11279
11485
|
console.log(`[getCollection] Found code collection: ${collectionId}`);
|
|
@@ -11292,7 +11498,7 @@ async function getCollection(db, collectionId) {
|
|
|
11292
11498
|
}
|
|
11293
11499
|
async function getDocBackingType(db, collectionName) {
|
|
11294
11500
|
if (!collectionName) return null;
|
|
11295
|
-
const dt = await new
|
|
11501
|
+
const dt = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(collectionName);
|
|
11296
11502
|
return dt && dt.isActive ? dt : null;
|
|
11297
11503
|
}
|
|
11298
11504
|
async function getCollectionByName(db, name) {
|
|
@@ -11309,7 +11515,7 @@ async function getCollectionByName(db, name) {
|
|
|
11309
11515
|
};
|
|
11310
11516
|
}
|
|
11311
11517
|
console.log(`[getCollectionByName] Not in database, checking code collections`);
|
|
11312
|
-
const codeCollections = await
|
|
11518
|
+
const codeCollections = await chunkWIV3R2MJ_cjs.loadCollectionConfigs();
|
|
11313
11519
|
const codeCollection = codeCollections.find((c) => c.name === name);
|
|
11314
11520
|
if (codeCollection) {
|
|
11315
11521
|
console.log(`[getCollectionByName] Found code collection: ${name}`);
|
|
@@ -11325,7 +11531,7 @@ async function getCollectionByName(db, name) {
|
|
|
11325
11531
|
return null;
|
|
11326
11532
|
}
|
|
11327
11533
|
async function loadContentEditorFlags(db) {
|
|
11328
|
-
const flags = { workflowEnabled: await
|
|
11534
|
+
const flags = { workflowEnabled: await chunkL3KHLEHL_cjs.isPluginActive(db, "workflow") };
|
|
11329
11535
|
const editors = [
|
|
11330
11536
|
["tinymce-plugin", "tinymce"],
|
|
11331
11537
|
["quill-editor", "quill"],
|
|
@@ -11333,10 +11539,10 @@ async function loadContentEditorFlags(db) {
|
|
|
11333
11539
|
["lexical-editor", "lexical"]
|
|
11334
11540
|
];
|
|
11335
11541
|
for (const [plugin, key] of editors) {
|
|
11336
|
-
const enabled = await
|
|
11542
|
+
const enabled = await chunkL3KHLEHL_cjs.isPluginActive(db, plugin);
|
|
11337
11543
|
flags[`${key}Enabled`] = enabled;
|
|
11338
11544
|
if (enabled) {
|
|
11339
|
-
const ps = new
|
|
11545
|
+
const ps = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
11340
11546
|
const p = await ps.getPlugin(plugin);
|
|
11341
11547
|
flags[`${key}Settings`] = p?.settings;
|
|
11342
11548
|
}
|
|
@@ -11344,7 +11550,7 @@ async function loadContentEditorFlags(db) {
|
|
|
11344
11550
|
return flags;
|
|
11345
11551
|
}
|
|
11346
11552
|
function makeDocService(db, docType, tenantId) {
|
|
11347
|
-
return new
|
|
11553
|
+
return new chunkW36OZTJ5_cjs.DocumentsService(db, {
|
|
11348
11554
|
queryableFields: docType.queryableFields ?? [],
|
|
11349
11555
|
typeSchemaVersion: docType.schemaVersion ?? 1,
|
|
11350
11556
|
maxVersionsPerRoot: docType.settings?.maxVersionsPerRoot ?? 50,
|
|
@@ -11372,9 +11578,9 @@ adminContentRoutes.get("/", async (c) => {
|
|
|
11372
11578
|
const offset = (page - 1) * limit;
|
|
11373
11579
|
const collectionsStmt = db.prepare("SELECT id, name, display_name FROM document_types WHERE is_active = 1 ORDER BY display_name");
|
|
11374
11580
|
const { results: collectionsResults } = await collectionsStmt.all();
|
|
11375
|
-
const codeCollections = await
|
|
11581
|
+
const codeCollections = await chunkWIV3R2MJ_cjs.loadCollectionConfigs();
|
|
11376
11582
|
const codeCollectionMap = new Map(codeCollections.map((c2) => [c2.name, c2]));
|
|
11377
|
-
const docTypeRegistry = new
|
|
11583
|
+
const docTypeRegistry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
|
|
11378
11584
|
const docTypes = (await docTypeRegistry.findAll()).filter((dt) => !dt.settings?.internal && !dt.isAuth);
|
|
11379
11585
|
const visibleTypeIds = new Set(docTypes.map((dt) => dt.id));
|
|
11380
11586
|
const allCollections = [
|
|
@@ -11386,7 +11592,7 @@ adminContentRoutes.get("/", async (c) => {
|
|
|
11386
11592
|
...allCollections.map((c2) => ({ name: c2.name, displayName: c2.displayName })),
|
|
11387
11593
|
...docTypes.filter((dt) => !collectionNames.has(dt.id)).map((dt) => ({ name: `doc:${dt.id}`, displayName: dt.displayName }))
|
|
11388
11594
|
];
|
|
11389
|
-
const newContentCollections = await
|
|
11595
|
+
const newContentCollections = await chunkWIV3R2MJ_cjs.getVisibleCollections(db);
|
|
11390
11596
|
const docBackedCollection = !modelName.startsWith("doc:") && modelName !== "all" ? docTypes.find((dt) => dt.id === modelName) : void 0;
|
|
11391
11597
|
const isDocModel = modelName.startsWith("doc:") || !!docBackedCollection;
|
|
11392
11598
|
if (isDocModel) {
|
|
@@ -11663,9 +11869,9 @@ adminContentRoutes.get("/new", async (c) => {
|
|
|
11663
11869
|
const collectionsStmt = db2.prepare("SELECT id, name, display_name, description FROM document_types WHERE is_active = 1 ORDER BY display_name");
|
|
11664
11870
|
const { results } = await collectionsStmt.all();
|
|
11665
11871
|
const visibleTypeIds = new Set(
|
|
11666
|
-
(await new
|
|
11872
|
+
(await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db2).findAll()).filter((dt) => !dt.settings?.internal && !dt.isAuth).map((dt) => dt.id)
|
|
11667
11873
|
);
|
|
11668
|
-
const codeCollections = await
|
|
11874
|
+
const codeCollections = await chunkWIV3R2MJ_cjs.loadCollectionConfigs();
|
|
11669
11875
|
const dbCollectionNames = new Set((results || []).map((r) => r.name));
|
|
11670
11876
|
const allCollections = [
|
|
11671
11877
|
...codeCollections.filter((c2) => !dbCollectionNames.has(c2.name)).map((c2) => ({
|
|
@@ -11731,32 +11937,32 @@ adminContentRoutes.get("/new", async (c) => {
|
|
|
11731
11937
|
return c.html(renderContentFormPage(formData2));
|
|
11732
11938
|
}
|
|
11733
11939
|
const fields = await getCollectionFields(db, collection.id);
|
|
11734
|
-
const workflowEnabled = await
|
|
11735
|
-
const tinymceEnabled = await
|
|
11940
|
+
const workflowEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "workflow");
|
|
11941
|
+
const tinymceEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "tinymce-plugin");
|
|
11736
11942
|
let tinymceSettings;
|
|
11737
11943
|
if (tinymceEnabled) {
|
|
11738
|
-
const pluginService = new
|
|
11944
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
11739
11945
|
const tinymcePlugin2 = await pluginService.getPlugin("tinymce-plugin");
|
|
11740
11946
|
tinymceSettings = tinymcePlugin2?.settings;
|
|
11741
11947
|
}
|
|
11742
|
-
const quillEnabled = await
|
|
11948
|
+
const quillEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "quill-editor");
|
|
11743
11949
|
let quillSettings;
|
|
11744
11950
|
if (quillEnabled) {
|
|
11745
|
-
const pluginService = new
|
|
11951
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
11746
11952
|
const quillPlugin = await pluginService.getPlugin("quill-editor");
|
|
11747
11953
|
quillSettings = quillPlugin?.settings;
|
|
11748
11954
|
}
|
|
11749
|
-
const mdxeditorEnabled = await
|
|
11955
|
+
const mdxeditorEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "easy-mdx");
|
|
11750
11956
|
let mdxeditorSettings;
|
|
11751
11957
|
if (mdxeditorEnabled) {
|
|
11752
|
-
const pluginService = new
|
|
11958
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
11753
11959
|
const mdxeditorPlugin = await pluginService.getPlugin("easy-mdx");
|
|
11754
11960
|
mdxeditorSettings = mdxeditorPlugin?.settings;
|
|
11755
11961
|
}
|
|
11756
|
-
const lexicalEnabled = await
|
|
11962
|
+
const lexicalEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "lexical-editor");
|
|
11757
11963
|
let lexicalSettings;
|
|
11758
11964
|
if (lexicalEnabled) {
|
|
11759
|
-
const pluginService = new
|
|
11965
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
11760
11966
|
const lexicalPlugin = await pluginService.getPlugin("lexical-editor");
|
|
11761
11967
|
lexicalSettings = lexicalPlugin?.settings;
|
|
11762
11968
|
}
|
|
@@ -11884,32 +12090,32 @@ adminContentRoutes.get("/:id/edit", async (c) => {
|
|
|
11884
12090
|
};
|
|
11885
12091
|
const fields = await getCollectionFields(db, content.collection_id);
|
|
11886
12092
|
const contentData = content.data ? JSON.parse(content.data) : {};
|
|
11887
|
-
const workflowEnabled = await
|
|
11888
|
-
const tinymceEnabled = await
|
|
12093
|
+
const workflowEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "workflow");
|
|
12094
|
+
const tinymceEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "tinymce-plugin");
|
|
11889
12095
|
let tinymceSettings;
|
|
11890
12096
|
if (tinymceEnabled) {
|
|
11891
|
-
const pluginService = new
|
|
12097
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
11892
12098
|
const tinymcePlugin2 = await pluginService.getPlugin("tinymce-plugin");
|
|
11893
12099
|
tinymceSettings = tinymcePlugin2?.settings;
|
|
11894
12100
|
}
|
|
11895
|
-
const quillEnabled = await
|
|
12101
|
+
const quillEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "quill-editor");
|
|
11896
12102
|
let quillSettings;
|
|
11897
12103
|
if (quillEnabled) {
|
|
11898
|
-
const pluginService = new
|
|
12104
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
11899
12105
|
const quillPlugin = await pluginService.getPlugin("quill-editor");
|
|
11900
12106
|
quillSettings = quillPlugin?.settings;
|
|
11901
12107
|
}
|
|
11902
|
-
const mdxeditorEnabled = await
|
|
12108
|
+
const mdxeditorEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "easy-mdx");
|
|
11903
12109
|
let mdxeditorSettings;
|
|
11904
12110
|
if (mdxeditorEnabled) {
|
|
11905
|
-
const pluginService = new
|
|
12111
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
11906
12112
|
const mdxeditorPlugin = await pluginService.getPlugin("easy-mdx");
|
|
11907
12113
|
mdxeditorSettings = mdxeditorPlugin?.settings;
|
|
11908
12114
|
}
|
|
11909
|
-
const lexicalEnabled = await
|
|
12115
|
+
const lexicalEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "lexical-editor");
|
|
11910
12116
|
let lexicalSettings;
|
|
11911
12117
|
if (lexicalEnabled) {
|
|
11912
|
-
const pluginService = new
|
|
12118
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
11913
12119
|
const lexicalPlugin = await pluginService.getPlugin("lexical-editor");
|
|
11914
12120
|
lexicalSettings = lexicalPlugin?.settings;
|
|
11915
12121
|
}
|
|
@@ -12282,7 +12488,7 @@ adminContentRoutes.put("/:id", async (c) => {
|
|
|
12282
12488
|
`);
|
|
12283
12489
|
}
|
|
12284
12490
|
});
|
|
12285
|
-
adminContentRoutes.post("/preview",
|
|
12491
|
+
adminContentRoutes.post("/preview", chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
|
|
12286
12492
|
try {
|
|
12287
12493
|
const formData = await c.req.formData();
|
|
12288
12494
|
const collectionId = formData.get("collection_id");
|
|
@@ -12601,7 +12807,7 @@ adminContentRoutes.delete("/:id", async (c) => {
|
|
|
12601
12807
|
return c.json({ success: false, error: "Failed to delete content" }, 500);
|
|
12602
12808
|
}
|
|
12603
12809
|
});
|
|
12604
|
-
adminContentRoutes.get("/:id/version/:version/preview",
|
|
12810
|
+
adminContentRoutes.get("/:id/version/:version/preview", chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
|
|
12605
12811
|
try {
|
|
12606
12812
|
const id = c.req.param("id");
|
|
12607
12813
|
const version = parseInt(c.req.param("version") || "0");
|
|
@@ -12697,9 +12903,9 @@ function parseDocFormData(formData, queryableFields = []) {
|
|
|
12697
12903
|
return { title, slug, data };
|
|
12698
12904
|
}
|
|
12699
12905
|
async function getDocService(db, typeId, tenantId) {
|
|
12700
|
-
const registry = new
|
|
12906
|
+
const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
|
|
12701
12907
|
const docType = await registry.findById(typeId);
|
|
12702
|
-
const svc = new
|
|
12908
|
+
const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
|
|
12703
12909
|
queryableFields: docType?.queryableFields ?? [],
|
|
12704
12910
|
typeSchemaVersion: docType?.schemaVersion ?? 1,
|
|
12705
12911
|
maxVersionsPerRoot: docType?.settings?.maxVersionsPerRoot ?? 50,
|
|
@@ -12710,7 +12916,7 @@ async function getDocService(db, typeId, tenantId) {
|
|
|
12710
12916
|
}
|
|
12711
12917
|
adminContentRoutes.get("/documents/:typeId/new", async (c) => {
|
|
12712
12918
|
const { typeId } = c.req.param();
|
|
12713
|
-
const registry = new
|
|
12919
|
+
const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(c.env.DB);
|
|
12714
12920
|
const docType = await registry.findById(typeId);
|
|
12715
12921
|
if (!docType) return c.html("<p>Unknown document type.</p>", 404);
|
|
12716
12922
|
return c.html(chunkN32OWET6_cjs.renderDocumentFormPage({ docType, isEdit: false, user: userCtx(c) }));
|
|
@@ -12735,7 +12941,7 @@ adminContentRoutes.post("/documents/:typeId/new", async (c) => {
|
|
|
12735
12941
|
}), user?.userId);
|
|
12736
12942
|
return c.redirect(`/admin/content/documents/${typeId}/${doc.rootId}/edit?message=Created+successfully`);
|
|
12737
12943
|
} catch (err) {
|
|
12738
|
-
const registry = new
|
|
12944
|
+
const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(c.env.DB);
|
|
12739
12945
|
const docType = await registry.findById(typeId);
|
|
12740
12946
|
if (!docType) return c.html("<p>Unknown document type.</p>", 404);
|
|
12741
12947
|
return c.html(chunkN32OWET6_cjs.renderDocumentFormPage({ docType, isEdit: false, user: userCtx(c), message: err?.message ?? "Failed to create", messageType: "error" }));
|
|
@@ -12745,7 +12951,7 @@ adminContentRoutes.get("/documents/:typeId/:rootId/edit", async (c) => {
|
|
|
12745
12951
|
const { typeId, rootId } = c.req.param();
|
|
12746
12952
|
const db = c.env.DB;
|
|
12747
12953
|
const message = c.req.query("message");
|
|
12748
|
-
const registry = new
|
|
12954
|
+
const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
|
|
12749
12955
|
const docType = await registry.findById(typeId);
|
|
12750
12956
|
if (!docType) return c.html("<p>Unknown document type.</p>", 404);
|
|
12751
12957
|
const tenantId = reqTenant(c);
|
|
@@ -12858,7 +13064,7 @@ adminContentRoutes.get("/documents/:typeId/:rootId/versions", async (c) => {
|
|
|
12858
13064
|
const { typeId, rootId } = c.req.param();
|
|
12859
13065
|
const db = c.env.DB;
|
|
12860
13066
|
const { renderVersionHistoryFragment } = await import('./admin-documents-form.template-LSZKGA5J.cjs');
|
|
12861
|
-
const registry = new
|
|
13067
|
+
const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
|
|
12862
13068
|
const docType = await registry.findById(typeId);
|
|
12863
13069
|
if (!docType) return c.html("<div>Unknown type.</div>", 404);
|
|
12864
13070
|
const result = await db.prepare(
|
|
@@ -14790,7 +14996,7 @@ var TenantService = class {
|
|
|
14790
14996
|
SET name = ?, domain = ?, status = ?, notes = ?, updated_at = ?
|
|
14791
14997
|
WHERE slug = ?
|
|
14792
14998
|
`).bind(name, domain, status, notes, now, slug).run();
|
|
14793
|
-
|
|
14999
|
+
chunkWIV3R2MJ_cjs.invalidateTenantCache();
|
|
14794
15000
|
const updated = await this.getTenantBySlug(slug);
|
|
14795
15001
|
if (!updated) throw new Error("Tenant not found");
|
|
14796
15002
|
return updated;
|
|
@@ -14808,7 +15014,7 @@ var TenantService = class {
|
|
|
14808
15014
|
throw new Error(`Tenant '${slug}' still owns ${docCount} document(s). Delete or migrate its content first.`);
|
|
14809
15015
|
}
|
|
14810
15016
|
await this.db.prepare(`DELETE FROM auth_tenant WHERE slug = ?`).bind(slug).run();
|
|
14811
|
-
|
|
15017
|
+
chunkWIV3R2MJ_cjs.invalidateTenantCache();
|
|
14812
15018
|
}
|
|
14813
15019
|
// ─── Membership (auth_tenant_member) ───────────────────────────────────────
|
|
14814
15020
|
// Tenant resolution and the admin switcher are gated on membership: an authed user may only
|
|
@@ -15052,7 +15258,7 @@ var TenantService = class {
|
|
|
15052
15258
|
INSERT INTO auth_tenant (id, name, slug, status, domain, notes, metadata, created_at, updated_at)
|
|
15053
15259
|
VALUES (?, ?, ?, 'active', ?, ?, '{}', ?, ?)
|
|
15054
15260
|
`).bind(id, input.name, input.slug, input.domain, input.notes, now, now).run();
|
|
15055
|
-
|
|
15261
|
+
chunkWIV3R2MJ_cjs.invalidateTenantCache();
|
|
15056
15262
|
const created = await this.getTenantBySlug(input.slug);
|
|
15057
15263
|
if (!created) throw new Error("Failed to create tenant");
|
|
15058
15264
|
return created;
|
|
@@ -15076,14 +15282,14 @@ function mapRowToTenant(row) {
|
|
|
15076
15282
|
|
|
15077
15283
|
// src/routes/admin-users.ts
|
|
15078
15284
|
var userRoutes = new hono.Hono();
|
|
15079
|
-
userRoutes.use("*",
|
|
15080
|
-
userRoutes.use("/users/*",
|
|
15081
|
-
userRoutes.use("/users",
|
|
15082
|
-
userRoutes.use("/invite-user",
|
|
15083
|
-
userRoutes.use("/resend-invitation/*",
|
|
15084
|
-
userRoutes.use("/cancel-invitation/*",
|
|
15085
|
-
userRoutes.use("/activity-logs",
|
|
15086
|
-
userRoutes.use("/activity-logs/*",
|
|
15285
|
+
userRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
|
|
15286
|
+
userRoutes.use("/users/*", chunkL3KHLEHL_cjs.requireRole(["admin"]));
|
|
15287
|
+
userRoutes.use("/users", chunkL3KHLEHL_cjs.requireRole(["admin"]));
|
|
15288
|
+
userRoutes.use("/invite-user", chunkL3KHLEHL_cjs.requireRole(["admin"]));
|
|
15289
|
+
userRoutes.use("/resend-invitation/*", chunkL3KHLEHL_cjs.requireRole(["admin"]));
|
|
15290
|
+
userRoutes.use("/cancel-invitation/*", chunkL3KHLEHL_cjs.requireRole(["admin"]));
|
|
15291
|
+
userRoutes.use("/activity-logs", chunkL3KHLEHL_cjs.requireRole(["admin"]));
|
|
15292
|
+
userRoutes.use("/activity-logs/*", chunkL3KHLEHL_cjs.requireRole(["admin"]));
|
|
15087
15293
|
userRoutes.get("/", (c) => {
|
|
15088
15294
|
return c.redirect("/admin/dashboard");
|
|
15089
15295
|
});
|
|
@@ -15250,7 +15456,7 @@ userRoutes.put("/profile", async (c) => {
|
|
|
15250
15456
|
}
|
|
15251
15457
|
await saveCustomData(db, user.userId, sanitized);
|
|
15252
15458
|
}
|
|
15253
|
-
await
|
|
15459
|
+
await chunkL3KHLEHL_cjs.logActivity(
|
|
15254
15460
|
db,
|
|
15255
15461
|
user.userId,
|
|
15256
15462
|
"profile.update",
|
|
@@ -15313,7 +15519,7 @@ userRoutes.post("/profile/avatar", async (c) => {
|
|
|
15313
15519
|
SELECT first_name, last_name FROM auth_user WHERE id = ?
|
|
15314
15520
|
`);
|
|
15315
15521
|
const userData = await userStmt.bind(user.userId).first();
|
|
15316
|
-
await
|
|
15522
|
+
await chunkL3KHLEHL_cjs.logActivity(
|
|
15317
15523
|
db,
|
|
15318
15524
|
user.userId,
|
|
15319
15525
|
"profile.avatar_update",
|
|
@@ -15384,7 +15590,7 @@ userRoutes.post("/profile/password", async (c) => {
|
|
|
15384
15590
|
dismissible: true
|
|
15385
15591
|
}));
|
|
15386
15592
|
}
|
|
15387
|
-
const validPassword = await
|
|
15593
|
+
const validPassword = await chunkL3KHLEHL_cjs.AuthManager.verifyPassword(currentPassword, userData.password_hash);
|
|
15388
15594
|
if (!validPassword) {
|
|
15389
15595
|
return c.html(chunkN32OWET6_cjs.renderAlert({
|
|
15390
15596
|
type: "error",
|
|
@@ -15392,7 +15598,7 @@ userRoutes.post("/profile/password", async (c) => {
|
|
|
15392
15598
|
dismissible: true
|
|
15393
15599
|
}));
|
|
15394
15600
|
}
|
|
15395
|
-
const newPasswordHash = await
|
|
15601
|
+
const newPasswordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(newPassword);
|
|
15396
15602
|
const historyStmt = db.prepare(`
|
|
15397
15603
|
INSERT INTO auth_password_history (id, user_id, password_hash, created_at)
|
|
15398
15604
|
VALUES (?, ?, ?, ?)
|
|
@@ -15408,7 +15614,7 @@ userRoutes.post("/profile/password", async (c) => {
|
|
|
15408
15614
|
WHERE id = ?
|
|
15409
15615
|
`);
|
|
15410
15616
|
await updateStmt.bind(newPasswordHash, Date.now(), user.userId).run();
|
|
15411
|
-
await
|
|
15617
|
+
await chunkL3KHLEHL_cjs.logActivity(
|
|
15412
15618
|
db,
|
|
15413
15619
|
user.userId,
|
|
15414
15620
|
"profile.password_change",
|
|
@@ -15475,7 +15681,7 @@ userRoutes.get("/users", async (c) => {
|
|
|
15475
15681
|
`);
|
|
15476
15682
|
const countResult = await countStmt.bind(...params).first();
|
|
15477
15683
|
const totalUsers = countResult?.total || 0;
|
|
15478
|
-
await
|
|
15684
|
+
await chunkL3KHLEHL_cjs.logActivity(
|
|
15479
15685
|
db,
|
|
15480
15686
|
user.userId,
|
|
15481
15687
|
"users.list_view",
|
|
@@ -15656,7 +15862,7 @@ userRoutes.post("/users/new", async (c) => {
|
|
|
15656
15862
|
dismissible: true
|
|
15657
15863
|
}));
|
|
15658
15864
|
}
|
|
15659
|
-
const passwordHash = await
|
|
15865
|
+
const passwordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(password);
|
|
15660
15866
|
const userId = crypto.randomUUID();
|
|
15661
15867
|
const createStmt = db.prepare(`
|
|
15662
15868
|
INSERT INTO auth_user (
|
|
@@ -15681,7 +15887,7 @@ userRoutes.post("/users/new", async (c) => {
|
|
|
15681
15887
|
if (sanitizedRegistrationCustom !== null && Object.keys(sanitizedRegistrationCustom).length > 0) {
|
|
15682
15888
|
await writeProfileData(db, userId, { custom: sanitizedRegistrationCustom }, user.userId);
|
|
15683
15889
|
}
|
|
15684
|
-
await
|
|
15890
|
+
await chunkL3KHLEHL_cjs.logActivity(
|
|
15685
15891
|
db,
|
|
15686
15892
|
user.userId,
|
|
15687
15893
|
"user!.create",
|
|
@@ -15720,7 +15926,7 @@ userRoutes.get("/users/:id", async (c) => {
|
|
|
15720
15926
|
if (!userRecord) {
|
|
15721
15927
|
return c.json({ error: "User not found" }, 404);
|
|
15722
15928
|
}
|
|
15723
|
-
await
|
|
15929
|
+
await chunkL3KHLEHL_cjs.logActivity(
|
|
15724
15930
|
db,
|
|
15725
15931
|
user.userId,
|
|
15726
15932
|
"user!.view",
|
|
@@ -15934,7 +16140,7 @@ userRoutes.put("/users/:id", async (c) => {
|
|
|
15934
16140
|
userId
|
|
15935
16141
|
).run();
|
|
15936
16142
|
if (newPassword) {
|
|
15937
|
-
const passwordHash = await
|
|
16143
|
+
const passwordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(newPassword);
|
|
15938
16144
|
const updatePasswordStmt = db.prepare(`
|
|
15939
16145
|
UPDATE auth_user SET password_hash = ?, updated_at = ? WHERE id = ?
|
|
15940
16146
|
`);
|
|
@@ -15947,7 +16153,7 @@ userRoutes.put("/users/:id", async (c) => {
|
|
|
15947
16153
|
...sanitizedCustom !== null ? { custom: sanitizedCustom } : {}
|
|
15948
16154
|
}, user.userId);
|
|
15949
16155
|
}
|
|
15950
|
-
await
|
|
16156
|
+
await chunkL3KHLEHL_cjs.logActivity(
|
|
15951
16157
|
db,
|
|
15952
16158
|
user.userId,
|
|
15953
16159
|
"user.update",
|
|
@@ -15993,7 +16199,7 @@ userRoutes.post("/users/:id/toggle", async (c) => {
|
|
|
15993
16199
|
UPDATE auth_user SET is_active = ?, updated_at = ? WHERE id = ?
|
|
15994
16200
|
`);
|
|
15995
16201
|
await toggleStmt.bind(active ? 1 : 0, Date.now(), userId).run();
|
|
15996
|
-
await
|
|
16202
|
+
await chunkL3KHLEHL_cjs.logActivity(
|
|
15997
16203
|
db,
|
|
15998
16204
|
user.userId,
|
|
15999
16205
|
active ? "user.activate" : "user.deactivate",
|
|
@@ -16034,7 +16240,7 @@ userRoutes.delete("/users/:id", async (c) => {
|
|
|
16034
16240
|
DELETE FROM auth_user WHERE id = ?
|
|
16035
16241
|
`);
|
|
16036
16242
|
await deleteStmt.bind(userId).run();
|
|
16037
|
-
await
|
|
16243
|
+
await chunkL3KHLEHL_cjs.logActivity(
|
|
16038
16244
|
db,
|
|
16039
16245
|
user.userId,
|
|
16040
16246
|
"user!.hard_delete",
|
|
@@ -16053,7 +16259,7 @@ userRoutes.delete("/users/:id", async (c) => {
|
|
|
16053
16259
|
UPDATE auth_user SET is_active = 0, updated_at = ? WHERE id = ?
|
|
16054
16260
|
`);
|
|
16055
16261
|
await deleteStmt.bind(Date.now(), userId).run();
|
|
16056
|
-
await
|
|
16262
|
+
await chunkL3KHLEHL_cjs.logActivity(
|
|
16057
16263
|
db,
|
|
16058
16264
|
user.userId,
|
|
16059
16265
|
"user!.soft_delete",
|
|
@@ -16119,7 +16325,7 @@ userRoutes.post("/invite-user", async (c) => {
|
|
|
16119
16325
|
Date.now(),
|
|
16120
16326
|
Date.now()
|
|
16121
16327
|
).run();
|
|
16122
|
-
await
|
|
16328
|
+
await chunkL3KHLEHL_cjs.logActivity(
|
|
16123
16329
|
db,
|
|
16124
16330
|
user.userId,
|
|
16125
16331
|
"user!.invite_sent",
|
|
@@ -16176,7 +16382,7 @@ userRoutes.post("/resend-invitation/:id", async (c) => {
|
|
|
16176
16382
|
Date.now(),
|
|
16177
16383
|
userId
|
|
16178
16384
|
).run();
|
|
16179
|
-
await
|
|
16385
|
+
await chunkL3KHLEHL_cjs.logActivity(
|
|
16180
16386
|
db,
|
|
16181
16387
|
user.userId,
|
|
16182
16388
|
"user!.invitation_resent",
|
|
@@ -16212,7 +16418,7 @@ userRoutes.delete("/cancel-invitation/:id", async (c) => {
|
|
|
16212
16418
|
}
|
|
16213
16419
|
const deleteStmt = db.prepare(`DELETE FROM auth_user WHERE id = ?`);
|
|
16214
16420
|
await deleteStmt.bind(userId).run();
|
|
16215
|
-
await
|
|
16421
|
+
await chunkL3KHLEHL_cjs.logActivity(
|
|
16216
16422
|
db,
|
|
16217
16423
|
user.userId,
|
|
16218
16424
|
"user!.invitation_cancelled",
|
|
@@ -17593,7 +17799,7 @@ var fileValidationSchema2 = zod.z.object({
|
|
|
17593
17799
|
// 50MB max
|
|
17594
17800
|
});
|
|
17595
17801
|
var adminMediaRoutes = new hono.Hono();
|
|
17596
|
-
adminMediaRoutes.use("*",
|
|
17802
|
+
adminMediaRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
|
|
17597
17803
|
adminMediaRoutes.get("/", async (c) => {
|
|
17598
17804
|
try {
|
|
17599
17805
|
const user = c.get("user");
|
|
@@ -17635,7 +17841,7 @@ adminMediaRoutes.get("/selector", async (c) => {
|
|
|
17635
17841
|
const { searchParams } = new URL(c.req.url);
|
|
17636
17842
|
const search = searchParams.get("search") || "";
|
|
17637
17843
|
const db = c.env.DB;
|
|
17638
|
-
const pluginService = new
|
|
17844
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
17639
17845
|
const mediaPlugin = await pluginService.getPlugin("core-media");
|
|
17640
17846
|
if (!mediaPlugin || mediaPlugin.status !== "active") {
|
|
17641
17847
|
return c.html(html.html`
|
|
@@ -18009,7 +18215,7 @@ adminMediaRoutes.put("/:id", async (c) => {
|
|
|
18009
18215
|
`);
|
|
18010
18216
|
}
|
|
18011
18217
|
});
|
|
18012
|
-
adminMediaRoutes.delete("/cleanup",
|
|
18218
|
+
adminMediaRoutes.delete("/cleanup", chunkL3KHLEHL_cjs.requireRole("admin"), async (c) => {
|
|
18013
18219
|
try {
|
|
18014
18220
|
const db = c.env.DB;
|
|
18015
18221
|
const allMediaStmt = db.prepare("SELECT id, r2_key, filename FROM media WHERE deleted_at IS NULL");
|
|
@@ -20442,8 +20648,8 @@ defineUserProfile({
|
|
|
20442
20648
|
|
|
20443
20649
|
// src/routes/admin-plugins.ts
|
|
20444
20650
|
var adminPluginRoutes = new hono.Hono();
|
|
20445
|
-
adminPluginRoutes.use("*",
|
|
20446
|
-
var AVAILABLE_PLUGINS = Object.values(
|
|
20651
|
+
adminPluginRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
|
|
20652
|
+
var AVAILABLE_PLUGINS = Object.values(chunkWIV3R2MJ_cjs.PLUGIN_REGISTRY).map((p) => ({
|
|
20447
20653
|
id: p.id,
|
|
20448
20654
|
name: p.codeName,
|
|
20449
20655
|
display_name: p.displayName,
|
|
@@ -20463,7 +20669,7 @@ adminPluginRoutes.get("/", async (c) => {
|
|
|
20463
20669
|
if (user?.role !== "admin") {
|
|
20464
20670
|
return c.text("Access denied", 403);
|
|
20465
20671
|
}
|
|
20466
|
-
const pluginService = new
|
|
20672
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
20467
20673
|
let installedPlugins = [];
|
|
20468
20674
|
let stats = { total: 0, active: 0, inactive: 0, errors: 0, uninstalled: 0 };
|
|
20469
20675
|
try {
|
|
@@ -20535,10 +20741,10 @@ adminPluginRoutes.get("/:id", async (c) => {
|
|
|
20535
20741
|
if (user?.role !== "admin") {
|
|
20536
20742
|
return c.redirect("/admin/plugins");
|
|
20537
20743
|
}
|
|
20538
|
-
const pluginService = new
|
|
20744
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
20539
20745
|
let plugin = await pluginService.getPlugin(pluginId);
|
|
20540
20746
|
if (!plugin) {
|
|
20541
|
-
const def =
|
|
20747
|
+
const def = chunk4YRYGDCQ_cjs.getPluginDefinition(pluginId);
|
|
20542
20748
|
if (!def) return c.text("Plugin not found", 404);
|
|
20543
20749
|
plugin = await pluginService.ensurePlugin(pluginId, {
|
|
20544
20750
|
displayName: def.displayName ?? pluginId,
|
|
@@ -20629,14 +20835,14 @@ adminPluginRoutes.get("/:id/configure", async (c) => {
|
|
|
20629
20835
|
const user = c.get("user");
|
|
20630
20836
|
const pluginId = c.req.param("id");
|
|
20631
20837
|
if (user?.role !== "admin") return c.redirect("/admin/plugins");
|
|
20632
|
-
const def =
|
|
20838
|
+
const def = chunk4YRYGDCQ_cjs.getPluginDefinition(pluginId);
|
|
20633
20839
|
if (!def?.configSchema) return c.text("No schema-driven settings for this plugin", 404);
|
|
20634
20840
|
const db = c.env.DB;
|
|
20635
|
-
const pluginService = new
|
|
20841
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
20636
20842
|
const plugin = await pluginService.getPlugin(pluginId);
|
|
20637
20843
|
const stored = plugin?.settings ?? {};
|
|
20638
|
-
const values =
|
|
20639
|
-
const fieldsHtml =
|
|
20844
|
+
const values = chunk4YRYGDCQ_cjs.applySchemaDefaults(def.configSchema, stored);
|
|
20845
|
+
const fieldsHtml = chunk4YRYGDCQ_cjs.renderSchemaFields(def.configSchema, values);
|
|
20640
20846
|
const displayName = plugin?.display_name ?? def.displayName ?? def.id;
|
|
20641
20847
|
return c.html(`<!DOCTYPE html>
|
|
20642
20848
|
<html lang="en"><head>
|
|
@@ -20663,12 +20869,12 @@ adminPluginRoutes.post("/:id/configure", async (c) => {
|
|
|
20663
20869
|
const user = c.get("user");
|
|
20664
20870
|
const pluginId = c.req.param("id");
|
|
20665
20871
|
if (user?.role !== "admin") return c.json({ error: "Access denied" }, 403);
|
|
20666
|
-
const def =
|
|
20872
|
+
const def = chunk4YRYGDCQ_cjs.getPluginDefinition(pluginId);
|
|
20667
20873
|
if (!def?.configSchema) return c.text("No schema-driven settings for this plugin", 404);
|
|
20668
20874
|
const form = await c.req.formData();
|
|
20669
|
-
const parsed =
|
|
20875
|
+
const parsed = chunk4YRYGDCQ_cjs.parseFormDataToSettings(def.configSchema, form);
|
|
20670
20876
|
const db = c.env.DB;
|
|
20671
|
-
const pluginService = new
|
|
20877
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
20672
20878
|
await pluginService.ensurePlugin(pluginId, {
|
|
20673
20879
|
displayName: def.displayName ?? pluginId,
|
|
20674
20880
|
version: def.version,
|
|
@@ -20690,7 +20896,7 @@ adminPluginRoutes.post("/:id/activate", async (c) => {
|
|
|
20690
20896
|
if (user?.role !== "admin") {
|
|
20691
20897
|
return c.json({ error: "Access denied" }, 403);
|
|
20692
20898
|
}
|
|
20693
|
-
const pluginService = new
|
|
20899
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
20694
20900
|
await pluginService.activatePlugin(pluginId);
|
|
20695
20901
|
return c.json({ success: true });
|
|
20696
20902
|
} catch (error) {
|
|
@@ -20707,7 +20913,7 @@ adminPluginRoutes.post("/:id/deactivate", async (c) => {
|
|
|
20707
20913
|
if (user?.role !== "admin") {
|
|
20708
20914
|
return c.json({ error: "Access denied" }, 403);
|
|
20709
20915
|
}
|
|
20710
|
-
const pluginService = new
|
|
20916
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
20711
20917
|
await pluginService.deactivatePlugin(pluginId);
|
|
20712
20918
|
return c.json({ success: true });
|
|
20713
20919
|
} catch (error) {
|
|
@@ -20724,8 +20930,8 @@ adminPluginRoutes.post("/install", async (c) => {
|
|
|
20724
20930
|
return c.json({ error: "Access denied" }, 403);
|
|
20725
20931
|
}
|
|
20726
20932
|
const body = await c.req.json();
|
|
20727
|
-
const pluginService = new
|
|
20728
|
-
const registryEntry =
|
|
20933
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
20934
|
+
const registryEntry = chunkWIV3R2MJ_cjs.findPluginByCodeName(body.name) || chunkWIV3R2MJ_cjs.PLUGIN_REGISTRY[body.name] || chunkWIV3R2MJ_cjs.PLUGIN_REGISTRY[body.id];
|
|
20729
20935
|
if (!registryEntry) {
|
|
20730
20936
|
return c.json({ error: "Plugin not found in registry" }, 404);
|
|
20731
20937
|
}
|
|
@@ -20758,7 +20964,7 @@ adminPluginRoutes.post("/:id/uninstall", async (c) => {
|
|
|
20758
20964
|
if (user?.role !== "admin") {
|
|
20759
20965
|
return c.json({ error: "Access denied" }, 403);
|
|
20760
20966
|
}
|
|
20761
|
-
const pluginService = new
|
|
20967
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
20762
20968
|
await pluginService.uninstallPlugin(pluginId);
|
|
20763
20969
|
return c.json({ success: true });
|
|
20764
20970
|
} catch (error) {
|
|
@@ -20776,7 +20982,7 @@ adminPluginRoutes.post("/:id/settings", async (c) => {
|
|
|
20776
20982
|
return c.json({ error: "Access denied" }, 403);
|
|
20777
20983
|
}
|
|
20778
20984
|
const settings = await c.req.json();
|
|
20779
|
-
const pluginService = new
|
|
20985
|
+
const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
|
|
20780
20986
|
await pluginService.updatePluginSettings(pluginId, settings);
|
|
20781
20987
|
if (pluginId === "core-auth") {
|
|
20782
20988
|
try {
|
|
@@ -21584,7 +21790,7 @@ function renderLogConfigPage(data) {
|
|
|
21584
21790
|
|
|
21585
21791
|
// src/routes/admin-logs.ts
|
|
21586
21792
|
var adminLogsRoutes = new hono.Hono();
|
|
21587
|
-
adminLogsRoutes.use("*",
|
|
21793
|
+
adminLogsRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
|
|
21588
21794
|
adminLogsRoutes.get("/", async (c) => {
|
|
21589
21795
|
try {
|
|
21590
21796
|
const user = c.get("user");
|
|
@@ -22576,9 +22782,9 @@ function renderStorageUsage(databaseSizeBytes, mediaSizeBytes) {
|
|
|
22576
22782
|
}
|
|
22577
22783
|
|
|
22578
22784
|
// src/routes/admin-dashboard.ts
|
|
22579
|
-
var VERSION =
|
|
22785
|
+
var VERSION = chunkSIPBHWMG_cjs.getCoreVersion();
|
|
22580
22786
|
var router = new hono.Hono();
|
|
22581
|
-
router.use("*",
|
|
22787
|
+
router.use("*", chunkL3KHLEHL_cjs.requireAuth());
|
|
22582
22788
|
router.get("/", async (c) => {
|
|
22583
22789
|
const user = c.get("user");
|
|
22584
22790
|
try {
|
|
@@ -24543,7 +24749,7 @@ function renderCollectionFormPage(data) {
|
|
|
24543
24749
|
// src/routes/admin-collections.ts
|
|
24544
24750
|
chunkK623Q6WD_cjs.init_admin_layout_catalyst_template();
|
|
24545
24751
|
var adminCollectionsRoutes = new hono.Hono();
|
|
24546
|
-
adminCollectionsRoutes.use("*",
|
|
24752
|
+
adminCollectionsRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
|
|
24547
24753
|
adminCollectionsRoutes.get("/", async (c) => {
|
|
24548
24754
|
try {
|
|
24549
24755
|
const user = c.get("user");
|
|
@@ -24560,7 +24766,7 @@ adminCollectionsRoutes.get("/", async (c) => {
|
|
|
24560
24766
|
results = queryResults.results ?? [];
|
|
24561
24767
|
} catch (e) {
|
|
24562
24768
|
}
|
|
24563
|
-
const codeCollections =
|
|
24769
|
+
const codeCollections = chunkWIV3R2MJ_cjs.getCollectionRegistry().list();
|
|
24564
24770
|
const codeCollectionsMap = new Map(
|
|
24565
24771
|
codeCollections.map((cfg) => {
|
|
24566
24772
|
const fieldCount = cfg.schema?.properties ? Object.keys(cfg.schema.properties).length : 0;
|
|
@@ -24574,7 +24780,7 @@ adminCollectionsRoutes.get("/", async (c) => {
|
|
|
24574
24780
|
field_count: fieldCount,
|
|
24575
24781
|
managed: cfg.managed !== false,
|
|
24576
24782
|
source_type: "code",
|
|
24577
|
-
internal:
|
|
24783
|
+
internal: chunkWIV3R2MJ_cjs.isCodeCollectionInternal(cfg),
|
|
24578
24784
|
versioning: cfg.versioning === true
|
|
24579
24785
|
}];
|
|
24580
24786
|
})
|
|
@@ -24613,7 +24819,7 @@ adminCollectionsRoutes.get("/", async (c) => {
|
|
|
24613
24819
|
field_count: fieldCount,
|
|
24614
24820
|
managed: false,
|
|
24615
24821
|
source_type: row.source === "code" || row.source === "system" || row.source === "plugin" ? "code" : "user",
|
|
24616
|
-
internal:
|
|
24822
|
+
internal: chunkWIV3R2MJ_cjs.isDbDocTypeInternal(row.source),
|
|
24617
24823
|
versioning: dbVersioning
|
|
24618
24824
|
};
|
|
24619
24825
|
});
|
|
@@ -24774,7 +24980,7 @@ export const myPlugin = definePlugin({
|
|
|
24774
24980
|
title: "Add a Collection",
|
|
24775
24981
|
pageTitle: "Add a Collection",
|
|
24776
24982
|
currentPath: "/admin/collections",
|
|
24777
|
-
version:
|
|
24983
|
+
version: chunkSIPBHWMG_cjs.getCoreVersion(),
|
|
24778
24984
|
user: u ? { name: u.email ?? "Admin", email: u.email ?? "", role: u.role ?? "admin" } : void 0,
|
|
24779
24985
|
content
|
|
24780
24986
|
})
|
|
@@ -24791,7 +24997,7 @@ adminCollectionsRoutes.get("/:id", async (c) => {
|
|
|
24791
24997
|
collection = await stmt.bind(id).first();
|
|
24792
24998
|
} catch {
|
|
24793
24999
|
}
|
|
24794
|
-
const registryRecord =
|
|
25000
|
+
const registryRecord = chunkWIV3R2MJ_cjs.getCollectionRegistry().getById(id) ?? chunkWIV3R2MJ_cjs.getCollectionRegistry().getByName(id);
|
|
24795
25001
|
if (!collection && !registryRecord) {
|
|
24796
25002
|
const formData2 = {
|
|
24797
25003
|
isEdit: true,
|
|
@@ -24838,9 +25044,9 @@ adminCollectionsRoutes.get("/:id", async (c) => {
|
|
|
24838
25044
|
isCodeDriven = true;
|
|
24839
25045
|
}
|
|
24840
25046
|
const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([
|
|
24841
|
-
|
|
24842
|
-
|
|
24843
|
-
|
|
25047
|
+
chunkL3KHLEHL_cjs.isPluginActive(db, "tinymce-plugin"),
|
|
25048
|
+
chunkL3KHLEHL_cjs.isPluginActive(db, "quill-editor"),
|
|
25049
|
+
chunkL3KHLEHL_cjs.isPluginActive(db, "easy-mdx")
|
|
24844
25050
|
]);
|
|
24845
25051
|
const displayName = collection?.display_name ?? registryRecord?.displayName ?? id;
|
|
24846
25052
|
const formData = {
|
|
@@ -24860,9 +25066,9 @@ adminCollectionsRoutes.get("/:id", async (c) => {
|
|
|
24860
25066
|
console.error("Error fetching collection:", error);
|
|
24861
25067
|
const user = c.get("user");
|
|
24862
25068
|
const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([
|
|
24863
|
-
|
|
24864
|
-
|
|
24865
|
-
|
|
25069
|
+
chunkL3KHLEHL_cjs.isPluginActive(db, "tinymce-plugin"),
|
|
25070
|
+
chunkL3KHLEHL_cjs.isPluginActive(db, "quill-editor"),
|
|
25071
|
+
chunkL3KHLEHL_cjs.isPluginActive(db, "easy-mdx")
|
|
24866
25072
|
]);
|
|
24867
25073
|
const formData = {
|
|
24868
25074
|
isEdit: true,
|
|
@@ -25811,7 +26017,7 @@ function renderDatabaseToolsSettings(settings) {
|
|
|
25811
26017
|
|
|
25812
26018
|
// src/routes/admin-settings.ts
|
|
25813
26019
|
var adminSettingsRoutes = new hono.Hono();
|
|
25814
|
-
adminSettingsRoutes.use("*",
|
|
26020
|
+
adminSettingsRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
|
|
25815
26021
|
function getMockSettings(user) {
|
|
25816
26022
|
return {
|
|
25817
26023
|
general: {
|
|
@@ -25914,7 +26120,7 @@ adminSettingsRoutes.get("/database-tools", (c) => {
|
|
|
25914
26120
|
adminSettingsRoutes.get("/api/migrations/status", async (c) => {
|
|
25915
26121
|
try {
|
|
25916
26122
|
const db = c.env.DB;
|
|
25917
|
-
const migrationService = new
|
|
26123
|
+
const migrationService = new chunkH5FB6GKR_cjs.MigrationService(db);
|
|
25918
26124
|
const status = await migrationService.getMigrationStatus();
|
|
25919
26125
|
return c.json({
|
|
25920
26126
|
success: true,
|
|
@@ -25954,7 +26160,7 @@ adminSettingsRoutes.post("/api/migrations/run", async (c) => {
|
|
|
25954
26160
|
adminSettingsRoutes.get("/api/migrations/validate", async (c) => {
|
|
25955
26161
|
try {
|
|
25956
26162
|
const db = c.env.DB;
|
|
25957
|
-
const migrationService = new
|
|
26163
|
+
const migrationService = new chunkH5FB6GKR_cjs.MigrationService(db);
|
|
25958
26164
|
const validation = await migrationService.validateSchema();
|
|
25959
26165
|
return c.json({
|
|
25960
26166
|
success: true,
|
|
@@ -26547,16 +26753,16 @@ function renderAPIReferencePage(data) {
|
|
|
26547
26753
|
}
|
|
26548
26754
|
|
|
26549
26755
|
// src/routes/admin-api-reference.ts
|
|
26550
|
-
var VERSION2 =
|
|
26756
|
+
var VERSION2 = chunkSIPBHWMG_cjs.getCoreVersion();
|
|
26551
26757
|
var router2 = new hono.Hono();
|
|
26552
|
-
router2.use("*",
|
|
26758
|
+
router2.use("*", chunkL3KHLEHL_cjs.requireAuth());
|
|
26553
26759
|
router2.get("/", async (c) => {
|
|
26554
26760
|
const user = c.get("user");
|
|
26555
26761
|
try {
|
|
26556
26762
|
const app2 = chunk4BTBSXMR_cjs.getAppInstance();
|
|
26557
26763
|
const baseEndpoints = chunk4BTBSXMR_cjs.buildRouteList(app2);
|
|
26558
26764
|
const collectionRoutes = [];
|
|
26559
|
-
const collections =
|
|
26765
|
+
const collections = chunkWIV3R2MJ_cjs.getCollectionRegistry().listActive().filter((r) => !r.internal);
|
|
26560
26766
|
const methodOrder = { GET: 0, POST: 1, PUT: 2, PATCH: 3, DELETE: 4 };
|
|
26561
26767
|
for (const col of collections) {
|
|
26562
26768
|
const displayName = col.displayName || col.name;
|
|
@@ -26672,5 +26878,5 @@ exports.setVariablesCache = setVariablesCache;
|
|
|
26672
26878
|
exports.test_cleanup_default = test_cleanup_default;
|
|
26673
26879
|
exports.userProfilesPlugin = userProfilesPlugin;
|
|
26674
26880
|
exports.userRoutes = userRoutes;
|
|
26675
|
-
//# sourceMappingURL=chunk-
|
|
26676
|
-
//# sourceMappingURL=chunk-
|
|
26881
|
+
//# sourceMappingURL=chunk-SSOP7G4R.cjs.map
|
|
26882
|
+
//# sourceMappingURL=chunk-SSOP7G4R.cjs.map
|