@actuate-media/cms-core 0.57.0 → 0.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/dist/__tests__/api/stats-seo-cache.test.js +1 -1
  2. package/dist/__tests__/api/stats-seo-cache.test.js.map +1 -1
  3. package/dist/__tests__/auth/oauth.test.js +3 -1
  4. package/dist/__tests__/auth/oauth.test.js.map +1 -1
  5. package/dist/__tests__/auth/reset.test.js +1 -0
  6. package/dist/__tests__/auth/reset.test.js.map +1 -1
  7. package/dist/__tests__/auth/user-admin.test.js +14 -12
  8. package/dist/__tests__/auth/user-admin.test.js.map +1 -1
  9. package/dist/__tests__/db/model-types-freshness.test.d.ts +2 -0
  10. package/dist/__tests__/db/model-types-freshness.test.d.ts.map +1 -0
  11. package/dist/__tests__/db/model-types-freshness.test.js +46 -0
  12. package/dist/__tests__/db/model-types-freshness.test.js.map +1 -0
  13. package/dist/__tests__/scheduling/scheduling.test.js +8 -6
  14. package/dist/__tests__/scheduling/scheduling.test.js.map +1 -1
  15. package/dist/__tests__/server-site.test.js +3 -1
  16. package/dist/__tests__/server-site.test.js.map +1 -1
  17. package/dist/__tests__/setup/index.test.js +21 -10
  18. package/dist/__tests__/setup/index.test.js.map +1 -1
  19. package/dist/actions.d.ts +2 -1
  20. package/dist/actions.d.ts.map +1 -1
  21. package/dist/actions.js +15 -8
  22. package/dist/actions.js.map +1 -1
  23. package/dist/api/guarded-db.d.ts +14 -0
  24. package/dist/api/guarded-db.d.ts.map +1 -0
  25. package/dist/api/guarded-db.js +58 -0
  26. package/dist/api/guarded-db.js.map +1 -0
  27. package/dist/api/handler-factory.d.ts.map +1 -1
  28. package/dist/api/handler-factory.js +2 -1
  29. package/dist/api/handler-factory.js.map +1 -1
  30. package/dist/api/handlers.d.ts +5 -3
  31. package/dist/api/handlers.d.ts.map +1 -1
  32. package/dist/api/handlers.js +54 -13068
  33. package/dist/api/handlers.js.map +1 -1
  34. package/dist/api/route-helpers.d.ts +321 -0
  35. package/dist/api/route-helpers.d.ts.map +1 -0
  36. package/dist/api/route-helpers.js +1307 -0
  37. package/dist/api/route-helpers.js.map +1 -0
  38. package/dist/api/routes/ai-seo.d.ts +3 -0
  39. package/dist/api/routes/ai-seo.d.ts.map +1 -0
  40. package/dist/api/routes/ai-seo.js +377 -0
  41. package/dist/api/routes/ai-seo.js.map +1 -0
  42. package/dist/api/routes/ai-settings.d.ts +3 -0
  43. package/dist/api/routes/ai-settings.d.ts.map +1 -0
  44. package/dist/api/routes/ai-settings.js +764 -0
  45. package/dist/api/routes/ai-settings.js.map +1 -0
  46. package/dist/api/routes/auth.d.ts +3 -0
  47. package/dist/api/routes/auth.d.ts.map +1 -0
  48. package/dist/api/routes/auth.js +787 -0
  49. package/dist/api/routes/auth.js.map +1 -0
  50. package/dist/api/routes/collab.d.ts +3 -0
  51. package/dist/api/routes/collab.d.ts.map +1 -0
  52. package/dist/api/routes/collab.js +426 -0
  53. package/dist/api/routes/collab.js.map +1 -0
  54. package/dist/api/routes/dashboard.d.ts +7 -0
  55. package/dist/api/routes/dashboard.d.ts.map +1 -0
  56. package/dist/api/routes/dashboard.js +540 -0
  57. package/dist/api/routes/dashboard.js.map +1 -0
  58. package/dist/api/routes/documents.d.ts +3 -0
  59. package/dist/api/routes/documents.d.ts.map +1 -0
  60. package/dist/api/routes/documents.js +180 -0
  61. package/dist/api/routes/documents.js.map +1 -0
  62. package/dist/api/routes/folders.d.ts +3 -0
  63. package/dist/api/routes/folders.d.ts.map +1 -0
  64. package/dist/api/routes/folders.js +195 -0
  65. package/dist/api/routes/folders.js.map +1 -0
  66. package/dist/api/routes/forms.d.ts +3 -0
  67. package/dist/api/routes/forms.d.ts.map +1 -0
  68. package/dist/api/routes/forms.js +661 -0
  69. package/dist/api/routes/forms.js.map +1 -0
  70. package/dist/api/routes/globals.d.ts +3 -0
  71. package/dist/api/routes/globals.d.ts.map +1 -0
  72. package/dist/api/routes/globals.js +133 -0
  73. package/dist/api/routes/globals.js.map +1 -0
  74. package/dist/api/routes/media.d.ts +3 -0
  75. package/dist/api/routes/media.d.ts.map +1 -0
  76. package/dist/api/routes/media.js +521 -0
  77. package/dist/api/routes/media.js.map +1 -0
  78. package/dist/api/routes/meta.d.ts +3 -0
  79. package/dist/api/routes/meta.d.ts.map +1 -0
  80. package/dist/api/routes/meta.js +96 -0
  81. package/dist/api/routes/meta.js.map +1 -0
  82. package/dist/api/routes/page-templates.d.ts +3 -0
  83. package/dist/api/routes/page-templates.d.ts.map +1 -0
  84. package/dist/api/routes/page-templates.js +265 -0
  85. package/dist/api/routes/page-templates.js.map +1 -0
  86. package/dist/api/routes/presence.d.ts +3 -0
  87. package/dist/api/routes/presence.d.ts.map +1 -0
  88. package/dist/api/routes/presence.js +35 -0
  89. package/dist/api/routes/presence.js.map +1 -0
  90. package/dist/api/routes/preview.d.ts +3 -0
  91. package/dist/api/routes/preview.d.ts.map +1 -0
  92. package/dist/api/routes/preview.js +111 -0
  93. package/dist/api/routes/preview.js.map +1 -0
  94. package/dist/api/routes/redirects.d.ts +3 -0
  95. package/dist/api/routes/redirects.d.ts.map +1 -0
  96. package/dist/api/routes/redirects.js +790 -0
  97. package/dist/api/routes/redirects.js.map +1 -0
  98. package/dist/api/routes/saved-sections.d.ts +3 -0
  99. package/dist/api/routes/saved-sections.d.ts.map +1 -0
  100. package/dist/api/routes/saved-sections.js +1036 -0
  101. package/dist/api/routes/saved-sections.js.map +1 -0
  102. package/dist/api/routes/scheduling.d.ts +3 -0
  103. package/dist/api/routes/scheduling.d.ts.map +1 -0
  104. package/dist/api/routes/scheduling.js +373 -0
  105. package/dist/api/routes/scheduling.js.map +1 -0
  106. package/dist/api/routes/sections.d.ts +3 -0
  107. package/dist/api/routes/sections.d.ts.map +1 -0
  108. package/dist/api/routes/sections.js +500 -0
  109. package/dist/api/routes/sections.js.map +1 -0
  110. package/dist/api/routes/security-center.d.ts +3 -0
  111. package/dist/api/routes/security-center.d.ts.map +1 -0
  112. package/dist/api/routes/security-center.js +71 -0
  113. package/dist/api/routes/security-center.js.map +1 -0
  114. package/dist/api/routes/seo-public.d.ts +14 -0
  115. package/dist/api/routes/seo-public.d.ts.map +1 -0
  116. package/dist/api/routes/seo-public.js +930 -0
  117. package/dist/api/routes/seo-public.js.map +1 -0
  118. package/dist/api/routes/seo.d.ts +8 -0
  119. package/dist/api/routes/seo.d.ts.map +1 -0
  120. package/dist/api/routes/seo.js +848 -0
  121. package/dist/api/routes/seo.js.map +1 -0
  122. package/dist/api/routes/system.d.ts +3 -0
  123. package/dist/api/routes/system.d.ts.map +1 -0
  124. package/dist/api/routes/system.js +340 -0
  125. package/dist/api/routes/system.js.map +1 -0
  126. package/dist/api/routes/url-resolution.d.ts +3 -0
  127. package/dist/api/routes/url-resolution.d.ts.map +1 -0
  128. package/dist/api/routes/url-resolution.js +457 -0
  129. package/dist/api/routes/url-resolution.js.map +1 -0
  130. package/dist/api/routes/users.d.ts +3 -0
  131. package/dist/api/routes/users.d.ts.map +1 -0
  132. package/dist/api/routes/users.js +1162 -0
  133. package/dist/api/routes/users.js.map +1 -0
  134. package/dist/api/routes/webhooks.d.ts +3 -0
  135. package/dist/api/routes/webhooks.d.ts.map +1 -0
  136. package/dist/api/routes/webhooks.js +338 -0
  137. package/dist/api/routes/webhooks.js.map +1 -0
  138. package/dist/auth/invites.d.ts +9 -8
  139. package/dist/auth/invites.d.ts.map +1 -1
  140. package/dist/auth/invites.js.map +1 -1
  141. package/dist/auth/oauth.d.ts +2 -1
  142. package/dist/auth/oauth.d.ts.map +1 -1
  143. package/dist/auth/oauth.js.map +1 -1
  144. package/dist/auth/reset.d.ts +3 -2
  145. package/dist/auth/reset.d.ts.map +1 -1
  146. package/dist/auth/reset.js +5 -2
  147. package/dist/auth/reset.js.map +1 -1
  148. package/dist/auth/session.d.ts +3 -2
  149. package/dist/auth/session.d.ts.map +1 -1
  150. package/dist/auth/session.js.map +1 -1
  151. package/dist/auth/team.d.ts +4 -3
  152. package/dist/auth/team.d.ts.map +1 -1
  153. package/dist/auth/team.js.map +1 -1
  154. package/dist/auth/user-admin.d.ts +6 -5
  155. package/dist/auth/user-admin.d.ts.map +1 -1
  156. package/dist/auth/user-admin.js.map +1 -1
  157. package/dist/content-health/cron.d.ts +2 -1
  158. package/dist/content-health/cron.d.ts.map +1 -1
  159. package/dist/content-health/cron.js.map +1 -1
  160. package/dist/cron/index.d.ts +2 -1
  161. package/dist/cron/index.d.ts.map +1 -1
  162. package/dist/cron/index.js +2 -0
  163. package/dist/cron/index.js.map +1 -1
  164. package/dist/db/client-types.d.ts +75 -0
  165. package/dist/db/client-types.d.ts.map +1 -0
  166. package/dist/db/client-types.js +2 -0
  167. package/dist/db/client-types.js.map +1 -0
  168. package/dist/db/model-types.d.ts +564 -0
  169. package/dist/db/model-types.d.ts.map +1 -0
  170. package/dist/db/model-types.js +14 -0
  171. package/dist/db/model-types.js.map +1 -0
  172. package/dist/diagnostics/api-metrics.d.ts.map +1 -1
  173. package/dist/diagnostics/api-metrics.js.map +1 -1
  174. package/dist/forms/entries.d.ts.map +1 -1
  175. package/dist/forms/entries.js.map +1 -1
  176. package/dist/forms/files.d.ts.map +1 -1
  177. package/dist/forms/files.js.map +1 -1
  178. package/dist/forms/service.d.ts.map +1 -1
  179. package/dist/forms/service.js.map +1 -1
  180. package/dist/forms/submission.d.ts.map +1 -1
  181. package/dist/forms/submission.js.map +1 -1
  182. package/dist/forms/webhooks.d.ts.map +1 -1
  183. package/dist/forms/webhooks.js.map +1 -1
  184. package/dist/graphql/index.d.ts.map +1 -1
  185. package/dist/graphql/index.js.map +1 -1
  186. package/dist/index.d.ts +1 -0
  187. package/dist/index.d.ts.map +1 -1
  188. package/dist/index.js.map +1 -1
  189. package/dist/scheduling/index.d.ts +2 -1
  190. package/dist/scheduling/index.d.ts.map +1 -1
  191. package/dist/scheduling/index.js.map +1 -1
  192. package/dist/search/index.d.ts.map +1 -1
  193. package/dist/search/index.js.map +1 -1
  194. package/dist/security/audit.d.ts.map +1 -1
  195. package/dist/security/audit.js.map +1 -1
  196. package/dist/security/reauth.d.ts +2 -1
  197. package/dist/security/reauth.d.ts.map +1 -1
  198. package/dist/security/reauth.js.map +1 -1
  199. package/dist/seo/audit-runner.d.ts +3 -2
  200. package/dist/seo/audit-runner.d.ts.map +1 -1
  201. package/dist/seo/audit-runner.js.map +1 -1
  202. package/dist/server-site.d.ts +2 -1
  203. package/dist/server-site.d.ts.map +1 -1
  204. package/dist/server-site.js.map +1 -1
  205. package/dist/setup/index.d.ts +4 -3
  206. package/dist/setup/index.d.ts.map +1 -1
  207. package/dist/setup/index.js.map +1 -1
  208. package/dist/webhooks/index.d.ts +5 -5
  209. package/dist/webhooks/index.d.ts.map +1 -1
  210. package/dist/webhooks/index.js +8 -1
  211. package/dist/webhooks/index.js.map +1 -1
  212. package/dist/workflow/index.d.ts.map +1 -1
  213. package/dist/workflow/index.js.map +1 -1
  214. package/package.json +1 -1
@@ -0,0 +1,180 @@
1
+ import { listDocuments, getDocument, createDocument, updateDocument, deleteDocument, } from '../../actions.js';
2
+ import { logEvent } from '../../security/audit.js';
3
+ import { applyFieldAccess } from '../../security/access.js';
4
+ import { ACTUATE_TAG_ROOT, actuateTag, cachedRead } from '../../cache/http.js';
5
+ import { notifyPreviewUpdate } from '../../preview/event-bus.js';
6
+ import { getActuateConfig } from '../../config/runtime.js';
7
+ import { guardedDb } from '../guarded-db.js';
8
+ import { maybePopulate, json, jsonWithCache, errorResponse, internalError, clampPageSize, requireAuth, requireCollectionScope, buildActionContext, } from '../route-helpers.js';
9
+ export function registerDocumentRoutes(router) {
10
+ const db = guardedDb;
11
+ // ---------------------------------------------------------------------------
12
+ // Document routes
13
+ // ---------------------------------------------------------------------------
14
+ router.get('/collections/:slug', async (request, params) => {
15
+ try {
16
+ const auth = await requireAuth(request);
17
+ if (auth.error)
18
+ return auth.error;
19
+ const scopeErr = requireCollectionScope(auth.session, params.slug, 'read');
20
+ if (scopeErr)
21
+ return scopeErr;
22
+ return cachedRead(request, {
23
+ cache: getActuateConfig()?.cache,
24
+ tags: [ACTUATE_TAG_ROOT, actuateTag('collection', params.slug)],
25
+ wrap: jsonWithCache,
26
+ build: async () => {
27
+ const url = new URL(request.url);
28
+ const ctx = buildActionContext(auth.session, db(), url.searchParams.get('locale') ?? undefined);
29
+ const result = await listDocuments({
30
+ collection: params.slug,
31
+ page: Number(url.searchParams.get('page')) || 1,
32
+ pageSize: clampPageSize(url.searchParams.get('pageSize')),
33
+ sort: url.searchParams.get('sort') ?? undefined,
34
+ order: url.searchParams.get('order') ?? undefined,
35
+ status: url.searchParams.get('status') ?? undefined,
36
+ locale: url.searchParams.get('locale') ?? undefined,
37
+ folderId: url.searchParams.get('folderId') ?? undefined,
38
+ // Exact slug filter — powers slug→id resolution for the MCP
39
+ // relationship resolver (WS-C C2). Additive: omitted ⇒ no filter.
40
+ slug: url.searchParams.get('slug') ?? undefined,
41
+ }, ctx);
42
+ const collectionConfig = getActuateConfig()?.collections?.[params.slug];
43
+ const fields = collectionConfig?.fields;
44
+ if (fields && result.docs.length > 0) {
45
+ const user = { id: auth.session.userId, role: auth.session.role };
46
+ result.docs = await Promise.all(result.docs.map(async (doc) => {
47
+ if (doc.data && typeof doc.data === 'object') {
48
+ return {
49
+ ...doc,
50
+ data: await applyFieldAccess('read', fields, doc.data, user),
51
+ };
52
+ }
53
+ return doc;
54
+ }));
55
+ }
56
+ return { data: result };
57
+ },
58
+ });
59
+ }
60
+ catch (err) {
61
+ return internalError(err);
62
+ }
63
+ });
64
+ router.get('/collections/:slug/:id', async (request, params) => {
65
+ try {
66
+ const auth = await requireAuth(request);
67
+ if (auth.error)
68
+ return auth.error;
69
+ const scopeErr = requireCollectionScope(auth.session, params.slug, 'read');
70
+ if (scopeErr)
71
+ return scopeErr;
72
+ return cachedRead(request, {
73
+ cache: getActuateConfig()?.cache,
74
+ tags: [
75
+ ACTUATE_TAG_ROOT,
76
+ actuateTag('collection', params.slug),
77
+ actuateTag('doc', params.id),
78
+ ],
79
+ wrap: jsonWithCache,
80
+ build: async () => {
81
+ const ctx = buildActionContext(auth.session, db());
82
+ const doc = await getDocument(params.slug, params.id, ctx);
83
+ if (!doc) {
84
+ // Returning a Response short-circuits the cache layer — we
85
+ // never cache 404s. The next request gets a fresh DB lookup
86
+ // so a doc that's restored from soft-delete is visible
87
+ // immediately.
88
+ return errorResponse('Document not found', 404);
89
+ }
90
+ // `getDocument` already lifts `_layout` / `_pageSettings` to
91
+ // the top-level page builder envelope and strips internal keys
92
+ // from `data`. Field-level access has been applied as well.
93
+ //
94
+ // Opt-in relation population (?populate=author,relatedPosts |
95
+ // *) replaces stored IDs with reference summaries. The
96
+ // `?populate=` param is part of the cache key (URL-derived),
97
+ // so populated and non-populated reads cache independently.
98
+ const populated = await maybePopulate(request, params.slug, doc, db());
99
+ return { data: populated };
100
+ },
101
+ });
102
+ }
103
+ catch (err) {
104
+ return internalError(err);
105
+ }
106
+ });
107
+ router.post('/collections/:slug', async (request, params) => {
108
+ try {
109
+ const auth = await requireAuth(request);
110
+ if (auth.error)
111
+ return auth.error;
112
+ const scopeErr = requireCollectionScope(auth.session, params.slug, 'create');
113
+ if (scopeErr)
114
+ return scopeErr;
115
+ const body = (await request.json());
116
+ const ctx = buildActionContext(auth.session, db());
117
+ const doc = await createDocument(params.slug, body, ctx);
118
+ await logEvent({
119
+ event: 'document_created',
120
+ userId: auth.session.userId,
121
+ details: { collection: params.slug, documentId: doc?.id },
122
+ });
123
+ return json({ data: doc }, 201);
124
+ }
125
+ catch (err) {
126
+ return internalError(err, 'create document');
127
+ }
128
+ });
129
+ router.put('/collections/:slug/:id', async (request, params) => {
130
+ try {
131
+ const auth = await requireAuth(request);
132
+ if (auth.error)
133
+ return auth.error;
134
+ const scopeErr = requireCollectionScope(auth.session, params.slug, 'update');
135
+ if (scopeErr)
136
+ return scopeErr;
137
+ const body = (await request.json());
138
+ const ctx = buildActionContext(auth.session, db());
139
+ const doc = await updateDocument(params.slug, params.id, body, ctx);
140
+ await logEvent({
141
+ event: 'document_updated',
142
+ userId: auth.session.userId,
143
+ details: { collection: params.slug, documentId: params.id },
144
+ });
145
+ // Push to any open live-preview SSE streams. No-op when no admin is
146
+ // watching the document; the bus drops the call cheaply.
147
+ notifyPreviewUpdate(params.slug, params.id, {
148
+ values: doc.data,
149
+ status: doc.status,
150
+ updatedAt: doc.updatedAt?.toISOString?.(),
151
+ });
152
+ return json({ data: doc });
153
+ }
154
+ catch (err) {
155
+ return internalError(err, 'update document');
156
+ }
157
+ });
158
+ router.delete('/collections/:slug/:id', async (request, params) => {
159
+ try {
160
+ const auth = await requireAuth(request);
161
+ if (auth.error)
162
+ return auth.error;
163
+ const scopeErr = requireCollectionScope(auth.session, params.slug, 'delete');
164
+ if (scopeErr)
165
+ return scopeErr;
166
+ const ctx = buildActionContext(auth.session, db());
167
+ await deleteDocument(params.slug, params.id, ctx);
168
+ await logEvent({
169
+ event: 'document_deleted',
170
+ userId: auth.session.userId,
171
+ details: { collection: params.slug, documentId: params.id },
172
+ });
173
+ return json({ data: { success: true } });
174
+ }
175
+ catch (err) {
176
+ return internalError(err, 'delete document');
177
+ }
178
+ });
179
+ }
180
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/api/routes/documents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ApiRouter } from '../router.js';
2
+ export declare function registerFolderRoutes(router: ApiRouter): void;
3
+ //# sourceMappingURL=folders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.d.ts","sourceRoot":"","sources":["../../../src/api/routes/folders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAY7C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsM5D"}
@@ -0,0 +1,195 @@
1
+ import { guardedDb } from '../guarded-db.js';
2
+ import { json, errorResponse, internalError, hasModel, requireAuth, WRITE_ROLES, requireRole, } from '../route-helpers.js';
3
+ export function registerFolderRoutes(router) {
4
+ const db = guardedDb;
5
+ // ---------------------------------------------------------------------------
6
+ // Folder routes
7
+ // ---------------------------------------------------------------------------
8
+ router.get('/folders', async (request) => {
9
+ try {
10
+ const auth = await requireAuth(request);
11
+ if (auth.error)
12
+ return auth.error;
13
+ const url = new URL(request.url);
14
+ const scope = url.searchParams.get('scope');
15
+ if (!scope)
16
+ return errorResponse('scope query parameter is required', 400);
17
+ const folders = await db().folder.findMany({
18
+ where: { scope },
19
+ orderBy: [{ position: 'asc' }, { name: 'asc' }],
20
+ });
21
+ const buildTree = (parentId) => folders
22
+ .filter((f) => f.parentId === parentId)
23
+ .map((f) => ({ ...f, children: buildTree(f.id) }));
24
+ return json({ data: buildTree(null) });
25
+ }
26
+ catch (err) {
27
+ return internalError(err);
28
+ }
29
+ });
30
+ router.post('/folders', async (request) => {
31
+ try {
32
+ const auth = await requireAuth(request);
33
+ if (auth.error)
34
+ return auth.error;
35
+ const roleErr = requireRole(auth.session.role, WRITE_ROLES);
36
+ if (roleErr)
37
+ return roleErr;
38
+ const body = (await request.json());
39
+ if (!body.name || !body.scope)
40
+ return errorResponse('name and scope are required', 400);
41
+ // A child folder MUST live in the same scope as its parent — without
42
+ // this check, a 'documents' folder could be reparented under a 'media'
43
+ // folder, hiding it from both UIs.
44
+ if (body.parentId) {
45
+ const parent = await db().folder.findUnique({ where: { id: body.parentId } });
46
+ if (!parent)
47
+ return errorResponse('Parent folder not found', 404);
48
+ if (parent.scope !== body.scope) {
49
+ return errorResponse('Parent folder is in a different scope', 400);
50
+ }
51
+ }
52
+ const folder = await db().folder.create({
53
+ data: {
54
+ name: body.name,
55
+ scope: body.scope,
56
+ parentId: body.parentId ?? null,
57
+ },
58
+ });
59
+ return json({ data: folder }, 201);
60
+ }
61
+ catch (err) {
62
+ return internalError(err);
63
+ }
64
+ });
65
+ router.put('/folders/:id', async (request, params) => {
66
+ try {
67
+ const auth = await requireAuth(request);
68
+ if (auth.error)
69
+ return auth.error;
70
+ const roleErr = requireRole(auth.session.role, WRITE_ROLES);
71
+ if (roleErr)
72
+ return roleErr;
73
+ const body = (await request.json());
74
+ const existing = await db().folder.findUnique({ where: { id: params.id } });
75
+ if (!existing)
76
+ return errorResponse('Folder not found', 404);
77
+ // Prevent reparenting into a different scope, and prevent making a folder
78
+ // a descendant of itself (which would create a cycle).
79
+ if (body.parentId !== undefined && body.parentId !== null) {
80
+ if (body.parentId === params.id) {
81
+ return errorResponse('Folder cannot be its own parent', 400);
82
+ }
83
+ const parent = await db().folder.findUnique({ where: { id: body.parentId } });
84
+ if (!parent)
85
+ return errorResponse('Parent folder not found', 404);
86
+ if (parent.scope !== existing.scope) {
87
+ return errorResponse('Parent folder is in a different scope', 400);
88
+ }
89
+ }
90
+ const data = {};
91
+ if (body.name !== undefined)
92
+ data.name = body.name;
93
+ if (body.parentId !== undefined)
94
+ data.parentId = body.parentId;
95
+ if (body.position !== undefined)
96
+ data.position = body.position;
97
+ const folder = await db().folder.update({
98
+ where: { id: params.id },
99
+ data,
100
+ });
101
+ return json({ data: folder });
102
+ }
103
+ catch (err) {
104
+ return internalError(err);
105
+ }
106
+ });
107
+ router.delete('/folders/:id', async (request, params) => {
108
+ try {
109
+ const auth = await requireAuth(request);
110
+ if (auth.error)
111
+ return auth.error;
112
+ const roleErr = requireRole(auth.session.role, WRITE_ROLES);
113
+ if (roleErr)
114
+ return roleErr;
115
+ // We don't cascade-delete the contents — they would silently vanish.
116
+ // Instead, refuse to delete a folder that still has documents, media,
117
+ // or sub-folders inside it.
118
+ const d = db();
119
+ const folder = await d.folder.findUnique({ where: { id: params.id } });
120
+ if (!folder)
121
+ return errorResponse('Folder not found', 404);
122
+ const [docCount, mediaCount, childCount] = await Promise.all([
123
+ hasModel(d, 'document')
124
+ ? d.document.count({ where: { folderId: params.id, deletedAt: null } })
125
+ : 0,
126
+ hasModel(d, 'media') ? d.media.count({ where: { folderId: params.id } }) : 0,
127
+ d.folder.count({ where: { parentId: params.id } }),
128
+ ]);
129
+ if (docCount + mediaCount + childCount > 0) {
130
+ return errorResponse(`Folder is not empty (${docCount} documents, ${mediaCount} media, ${childCount} sub-folders). Move or delete its contents first.`, 409);
131
+ }
132
+ await d.folder.delete({ where: { id: params.id } });
133
+ return json({ data: { success: true } });
134
+ }
135
+ catch (err) {
136
+ return internalError(err);
137
+ }
138
+ });
139
+ router.put('/documents/:id/folder', async (request, params) => {
140
+ try {
141
+ const auth = await requireAuth(request);
142
+ if (auth.error)
143
+ return auth.error;
144
+ const roleErr = requireRole(auth.session.role, WRITE_ROLES);
145
+ if (roleErr)
146
+ return roleErr;
147
+ const body = (await request.json());
148
+ // Confirm the target folder is in the documents scope before moving in.
149
+ if (body.folderId) {
150
+ const target = await db().folder.findUnique({ where: { id: body.folderId } });
151
+ if (!target)
152
+ return errorResponse('Folder not found', 404);
153
+ if (target.scope !== 'documents' && target.scope !== 'collections') {
154
+ return errorResponse('Target folder is not a documents folder', 400);
155
+ }
156
+ }
157
+ await db().document.update({
158
+ where: { id: params.id },
159
+ data: { folderId: body.folderId ?? null },
160
+ });
161
+ return json({ data: { success: true } });
162
+ }
163
+ catch (err) {
164
+ return internalError(err);
165
+ }
166
+ });
167
+ router.put('/media/:id/folder', async (request, params) => {
168
+ try {
169
+ const auth = await requireAuth(request);
170
+ if (auth.error)
171
+ return auth.error;
172
+ const roleErr = requireRole(auth.session.role, WRITE_ROLES);
173
+ if (roleErr)
174
+ return roleErr;
175
+ const body = (await request.json());
176
+ if (body.folderId) {
177
+ const target = await db().folder.findUnique({ where: { id: body.folderId } });
178
+ if (!target)
179
+ return errorResponse('Folder not found', 404);
180
+ if (target.scope !== 'media') {
181
+ return errorResponse('Target folder is not a media folder', 400);
182
+ }
183
+ }
184
+ await db().media.update({
185
+ where: { id: params.id },
186
+ data: { folderId: body.folderId ?? null },
187
+ });
188
+ return json({ data: { success: true } });
189
+ }
190
+ catch (err) {
191
+ return internalError(err);
192
+ }
193
+ });
194
+ }
195
+ //# sourceMappingURL=folders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.js","sourceRoot":"","sources":["../../../src/api/routes/folders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ApiRouter } from '../router.js';
2
+ export declare function registerFormRoutes(router: ApiRouter): void;
3
+ //# sourceMappingURL=forms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../../src/api/routes/forms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AA8D7C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2lB1D"}