@kywi-software/core 0.4.0 → 0.6.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.
- package/dist/admin/field-components.d.ts.map +1 -1
- package/dist/admin/field-components.js +55 -0
- package/dist/admin/field-components.js.map +1 -1
- package/dist/admin/form-builder.js +10 -1
- package/dist/admin/form-builder.js.map +1 -1
- package/dist/admin/form-helpers.d.ts +1 -1
- package/dist/admin/form-helpers.d.ts.map +1 -1
- package/dist/admin/form-helpers.js +21 -0
- package/dist/admin/form-helpers.js.map +1 -1
- package/dist/admin/layout-editor/component-actions.d.ts +43 -1
- package/dist/admin/layout-editor/component-actions.d.ts.map +1 -1
- package/dist/admin/layout-editor/component-actions.js +59 -1
- package/dist/admin/layout-editor/component-actions.js.map +1 -1
- package/dist/admin/layout-editor/editor-canvas.d.ts.map +1 -1
- package/dist/admin/layout-editor/editor-canvas.js +1 -1
- package/dist/admin/layout-editor/editor-canvas.js.map +1 -1
- package/dist/admin/layout-editor/editor-state.d.ts +4 -0
- package/dist/admin/layout-editor/editor-state.d.ts.map +1 -1
- package/dist/admin/layout-editor/editor-state.js +17 -0
- package/dist/admin/layout-editor/editor-state.js.map +1 -1
- package/dist/admin/layout-editor/index.d.ts +1 -1
- package/dist/admin/layout-editor/index.d.ts.map +1 -1
- package/dist/admin/layout-editor/index.js +1 -1
- package/dist/admin/layout-editor/index.js.map +1 -1
- package/dist/admin/layout-editor/layout-editor.d.ts.map +1 -1
- package/dist/admin/layout-editor/layout-editor.js +95 -2
- package/dist/admin/layout-editor/layout-editor.js.map +1 -1
- package/dist/admin/layout-editor/overlay-shell.d.ts.map +1 -1
- package/dist/admin/layout-editor/overlay-shell.js +8 -0
- package/dist/admin/layout-editor/overlay-shell.js.map +1 -1
- package/dist/admin/layout-editor/props-panel.d.ts +12 -2
- package/dist/admin/layout-editor/props-panel.d.ts.map +1 -1
- package/dist/admin/layout-editor/props-panel.js +30 -14
- package/dist/admin/layout-editor/props-panel.js.map +1 -1
- package/dist/admin/layout-editor/section-overlay.d.ts +6 -1
- package/dist/admin/layout-editor/section-overlay.d.ts.map +1 -1
- package/dist/admin/layout-editor/section-overlay.js +11 -2
- package/dist/admin/layout-editor/section-overlay.js.map +1 -1
- package/dist/admin/layout-editor/section-template-picker.d.ts +8 -1
- package/dist/admin/layout-editor/section-template-picker.d.ts.map +1 -1
- package/dist/admin/layout-editor/section-template-picker.js +31 -2
- package/dist/admin/layout-editor/section-template-picker.js.map +1 -1
- package/dist/admin/server.d.ts +1 -0
- package/dist/admin/server.d.ts.map +1 -1
- package/dist/admin/server.js +7 -0
- package/dist/admin/server.js.map +1 -1
- package/dist/admin/surfaces/contentTypes/content-types-designer.d.ts.map +1 -1
- package/dist/admin/surfaces/contentTypes/content-types-designer.js +12 -2
- package/dist/admin/surfaces/contentTypes/content-types-designer.js.map +1 -1
- package/dist/admin/surfaces/dashboard/dashboard-index.d.ts.map +1 -1
- package/dist/admin/surfaces/dashboard/dashboard-index.js +23 -1
- package/dist/admin/surfaces/dashboard/dashboard-index.js.map +1 -1
- package/dist/admin/webhook-manager.d.ts.map +1 -1
- package/dist/admin/webhook-manager.js +1 -0
- package/dist/admin/webhook-manager.js.map +1 -1
- package/dist/api/admin-features-routes.d.ts.map +1 -1
- package/dist/api/admin-features-routes.js +7 -1
- package/dist/api/admin-features-routes.js.map +1 -1
- package/dist/api/audience-preview-routes.d.ts.map +1 -1
- package/dist/api/audience-preview-routes.js +20 -2
- package/dist/api/audience-preview-routes.js.map +1 -1
- package/dist/api/audience-routes.d.ts.map +1 -1
- package/dist/api/audience-routes.js +44 -3
- package/dist/api/audience-routes.js.map +1 -1
- package/dist/api/auth-routes.d.ts.map +1 -1
- package/dist/api/auth-routes.js +16 -0
- package/dist/api/auth-routes.js.map +1 -1
- package/dist/api/auth.d.ts.map +1 -1
- package/dist/api/auth.js +34 -1
- package/dist/api/auth.js.map +1 -1
- package/dist/api/bulk-routes.d.ts.map +1 -1
- package/dist/api/bulk-routes.js +44 -12
- package/dist/api/bulk-routes.js.map +1 -1
- package/dist/api/category-routes.d.ts.map +1 -1
- package/dist/api/category-routes.js +10 -1
- package/dist/api/category-routes.js.map +1 -1
- package/dist/api/changeset-routes.d.ts +9 -0
- package/dist/api/changeset-routes.d.ts.map +1 -1
- package/dist/api/changeset-routes.js +13 -2
- package/dist/api/changeset-routes.js.map +1 -1
- package/dist/api/comment-routes.d.ts.map +1 -1
- package/dist/api/comment-routes.js +27 -1
- package/dist/api/comment-routes.js.map +1 -1
- package/dist/api/component-routes.d.ts.map +1 -1
- package/dist/api/component-routes.js +16 -1
- package/dist/api/component-routes.js.map +1 -1
- package/dist/api/content-routes.d.ts.map +1 -1
- package/dist/api/content-routes.js +59 -20
- package/dist/api/content-routes.js.map +1 -1
- package/dist/api/content-schemas.d.ts.map +1 -1
- package/dist/api/content-schemas.js +39 -0
- package/dist/api/content-schemas.js.map +1 -1
- package/dist/api/content-type-routes.d.ts.map +1 -1
- package/dist/api/content-type-routes.js +25 -5
- package/dist/api/content-type-routes.js.map +1 -1
- package/dist/api/dashboard-routes.d.ts.map +1 -1
- package/dist/api/dashboard-routes.js +4 -1
- package/dist/api/dashboard-routes.js.map +1 -1
- package/dist/api/experiment-routes.d.ts.map +1 -1
- package/dist/api/experiment-routes.js +24 -2
- package/dist/api/experiment-routes.js.map +1 -1
- package/dist/api/feed-routes.d.ts +4 -4
- package/dist/api/feed-routes.d.ts.map +1 -1
- package/dist/api/feed-routes.js +12 -2
- package/dist/api/feed-routes.js.map +1 -1
- package/dist/api/form-routes.d.ts +18 -0
- package/dist/api/form-routes.d.ts.map +1 -1
- package/dist/api/form-routes.js +207 -14
- package/dist/api/form-routes.js.map +1 -1
- package/dist/api/group-routes.d.ts.map +1 -1
- package/dist/api/group-routes.js +27 -0
- package/dist/api/group-routes.js.map +1 -1
- package/dist/api/index.d.ts +9 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +25 -2
- package/dist/api/index.js.map +1 -1
- package/dist/api/layout-routes.d.ts.map +1 -1
- package/dist/api/layout-routes.js +13 -1
- package/dist/api/layout-routes.js.map +1 -1
- package/dist/api/media-routes.d.ts.map +1 -1
- package/dist/api/media-routes.js +19 -0
- package/dist/api/media-routes.js.map +1 -1
- package/dist/api/scheduler-routes.d.ts +10 -0
- package/dist/api/scheduler-routes.d.ts.map +1 -1
- package/dist/api/scheduler-routes.js +13 -2
- package/dist/api/scheduler-routes.js.map +1 -1
- package/dist/api/search-routes.d.ts.map +1 -1
- package/dist/api/search-routes.js +11 -2
- package/dist/api/search-routes.js.map +1 -1
- package/dist/api/section-template-routes.d.ts.map +1 -1
- package/dist/api/section-template-routes.js +16 -1
- package/dist/api/section-template-routes.js.map +1 -1
- package/dist/api/site-context.d.ts +30 -1
- package/dist/api/site-context.d.ts.map +1 -1
- package/dist/api/site-context.js +41 -0
- package/dist/api/site-context.js.map +1 -1
- package/dist/api/tag-routes.d.ts.map +1 -1
- package/dist/api/tag-routes.js +10 -1
- package/dist/api/tag-routes.js.map +1 -1
- package/dist/api/translation-routes.d.ts.map +1 -1
- package/dist/api/translation-routes.js +19 -4
- package/dist/api/translation-routes.js.map +1 -1
- package/dist/api/user-routes.d.ts.map +1 -1
- package/dist/api/user-routes.js +13 -0
- package/dist/api/user-routes.js.map +1 -1
- package/dist/api/version-routes.d.ts.map +1 -1
- package/dist/api/version-routes.js +1 -0
- package/dist/api/version-routes.js.map +1 -1
- package/dist/api/webhook-routes.d.ts.map +1 -1
- package/dist/api/webhook-routes.js +31 -2
- package/dist/api/webhook-routes.js.map +1 -1
- package/dist/api/workflow-routes.d.ts.map +1 -1
- package/dist/api/workflow-routes.js +45 -1
- package/dist/api/workflow-routes.js.map +1 -1
- package/dist/auth/tokens.d.ts.map +1 -1
- package/dist/auth/tokens.js +14 -1
- package/dist/auth/tokens.js.map +1 -1
- package/dist/config/types.d.ts +29 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/db/bulk-queries.d.ts +8 -0
- package/dist/db/bulk-queries.d.ts.map +1 -1
- package/dist/db/bulk-queries.js +16 -0
- package/dist/db/bulk-queries.js.map +1 -1
- package/dist/db/changeset-queries.d.ts +27 -1
- package/dist/db/changeset-queries.d.ts.map +1 -1
- package/dist/db/changeset-queries.js +56 -2
- package/dist/db/changeset-queries.js.map +1 -1
- package/dist/db/content-permission-dedupe.d.ts +24 -0
- package/dist/db/content-permission-dedupe.d.ts.map +1 -0
- package/dist/db/content-permission-dedupe.js +69 -0
- package/dist/db/content-permission-dedupe.js.map +1 -0
- package/dist/db/content-permission-queries.d.ts +8 -0
- package/dist/db/content-permission-queries.d.ts.map +1 -1
- package/dist/db/content-permission-queries.js +29 -1
- package/dist/db/content-permission-queries.js.map +1 -1
- package/dist/db/content-queries.d.ts +7 -0
- package/dist/db/content-queries.d.ts.map +1 -1
- package/dist/db/content-queries.js +9 -0
- package/dist/db/content-queries.js.map +1 -1
- package/dist/db/content-type-queries.d.ts.map +1 -1
- package/dist/db/content-type-queries.js +3 -1
- package/dist/db/content-type-queries.js.map +1 -1
- package/dist/db/dynamic-schema.d.ts.map +1 -1
- package/dist/db/dynamic-schema.js +1 -0
- package/dist/db/dynamic-schema.js.map +1 -1
- package/dist/db/index.d.ts +1 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +3 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/schema-apply.d.ts.map +1 -1
- package/dist/db/schema-apply.js +1 -0
- package/dist/db/schema-apply.js.map +1 -1
- package/dist/db/schema-field-queries.d.ts +2 -0
- package/dist/db/schema-field-queries.d.ts.map +1 -1
- package/dist/db/schema-field-queries.js +4 -0
- package/dist/db/schema-field-queries.js.map +1 -1
- package/dist/db/site-membership-queries.d.ts +6 -0
- package/dist/db/site-membership-queries.d.ts.map +1 -1
- package/dist/db/site-membership-queries.js +9 -0
- package/dist/db/site-membership-queries.js.map +1 -1
- package/dist/db/user-search.d.ts +8 -0
- package/dist/db/user-search.d.ts.map +1 -1
- package/dist/db/user-search.js +14 -8
- package/dist/db/user-search.js.map +1 -1
- package/dist/db/workflow-queries.d.ts +1 -0
- package/dist/db/workflow-queries.d.ts.map +1 -1
- package/dist/db/workflow-queries.js +24 -0
- package/dist/db/workflow-queries.js.map +1 -1
- package/dist/forms/types.d.ts +5 -0
- package/dist/forms/types.d.ts.map +1 -1
- package/dist/forms/validation.d.ts +20 -0
- package/dist/forms/validation.d.ts.map +1 -1
- package/dist/forms/validation.js +45 -2
- package/dist/forms/validation.js.map +1 -1
- package/dist/hooks/ax-invalidation.d.ts.map +1 -1
- package/dist/hooks/ax-invalidation.js +1 -0
- package/dist/hooks/ax-invalidation.js.map +1 -1
- package/dist/hooks/dispatch.d.ts +1 -0
- package/dist/hooks/dispatch.d.ts.map +1 -1
- package/dist/hooks/dispatch.js +6 -0
- package/dist/hooks/dispatch.js.map +1 -1
- package/dist/hooks/webhook-dispatch.d.ts.map +1 -1
- package/dist/hooks/webhook-dispatch.js +1 -0
- package/dist/hooks/webhook-dispatch.js.map +1 -1
- package/dist/layout/index.d.ts +1 -1
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/renderer.d.ts +15 -2
- package/dist/layout/renderer.d.ts.map +1 -1
- package/dist/layout/renderer.js +49 -3
- package/dist/layout/renderer.js.map +1 -1
- package/dist/layout/types.d.ts +9 -0
- package/dist/layout/types.d.ts.map +1 -1
- package/dist/layout/types.js +5 -0
- package/dist/layout/types.js.map +1 -1
- package/dist/schema/base.d.ts +74 -0
- package/dist/schema/base.d.ts.map +1 -1
- package/dist/schema/base.js +16 -0
- package/dist/schema/base.js.map +1 -1
- package/dist/schema/content-permissions.d.ts.map +1 -1
- package/dist/schema/content-permissions.js +23 -2
- package/dist/schema/content-permissions.js.map +1 -1
- package/dist/schema/mapper.d.ts.map +1 -1
- package/dist/schema/mapper.js +1 -0
- package/dist/schema/mapper.js.map +1 -1
- package/dist/schema/mysql-tables.d.ts +68 -0
- package/dist/schema/mysql-tables.d.ts.map +1 -1
- package/dist/schema/mysql-tables.js +7 -0
- package/dist/schema/mysql-tables.js.map +1 -1
- package/dist/scope/kywi-form.d.ts.map +1 -1
- package/dist/scope/kywi-form.js +51 -6
- package/dist/scope/kywi-form.js.map +1 -1
- package/dist/scope/kywi-wizard-form.d.ts.map +1 -1
- package/dist/scope/kywi-wizard-form.js +29 -3
- package/dist/scope/kywi-wizard-form.js.map +1 -1
- package/dist/versioning/scheduler.d.ts +10 -2
- package/dist/versioning/scheduler.d.ts.map +1 -1
- package/dist/versioning/scheduler.js +13 -5
- package/dist/versioning/scheduler.js.map +1 -1
- package/package.json +7 -4
package/dist/api/form-routes.js
CHANGED
|
@@ -3,8 +3,13 @@ import { resolveAuth } from './auth.js';
|
|
|
3
3
|
import { hasMinRole } from '../auth/roles.js';
|
|
4
4
|
import { getContentBySlug } from '../db/content-queries.js';
|
|
5
5
|
import { createFormSubmission, listFormSubmissions, listFormSubmissionCounts, deleteFormSubmission, updateFormSubmissionStatus, } from '../db/form-queries.js';
|
|
6
|
-
import { resolveSiteId } from './site-context.js';
|
|
7
|
-
import { buildFormValidationSchema } from '../forms/validation.js';
|
|
6
|
+
import { resolveSiteId, assertSiteAccess } from './site-context.js';
|
|
7
|
+
import { buildFormValidationSchema, validateFileConstraints } from '../forms/validation.js';
|
|
8
|
+
import { createMediaRecord } from '../db/media-queries.js';
|
|
9
|
+
import { checkUploadAllowed } from '../media/upload-allowlist.js';
|
|
10
|
+
import { randomUUID } from 'node:crypto';
|
|
11
|
+
/** Default hard ceiling (MB) for a form file upload when media config omits one. */
|
|
12
|
+
const DEFAULT_MAX_UPLOAD_MB = 10;
|
|
8
13
|
import { renderEmailTemplate, FORM_NOTIFICATION_TEMPLATE, FORM_CONFIRMATION_TEMPLATE } from '../email/templates.js';
|
|
9
14
|
import { generateCsrfToken, verifyCsrfToken } from '../forms/csrf.js';
|
|
10
15
|
import { verifyRecaptcha } from '../forms/recaptcha.js';
|
|
@@ -22,6 +27,41 @@ export function checkHoneypot(body) {
|
|
|
22
27
|
// If the honeypot field is filled, this is likely a bot.
|
|
23
28
|
return val !== undefined && val !== null && val !== '';
|
|
24
29
|
}
|
|
30
|
+
// ─── Multipart parsing (file-upload forms) ───────────────────────────────────
|
|
31
|
+
/** A FormData value is a file part when it exposes a Blob/File shape. */
|
|
32
|
+
function isFileEntry(value) {
|
|
33
|
+
return (typeof value === 'object' &&
|
|
34
|
+
value !== null &&
|
|
35
|
+
typeof value.arrayBuffer === 'function' &&
|
|
36
|
+
'size' in value &&
|
|
37
|
+
'name' in value);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Split a multipart FormData into scalar/text fields and file parts. Text keys
|
|
41
|
+
* seen more than once collapse into an array (matching how multiSelect posts).
|
|
42
|
+
* Empty file inputs (size 0, no name) are treated as "no file selected".
|
|
43
|
+
*/
|
|
44
|
+
export function parseMultipartFormData(form) {
|
|
45
|
+
const fields = {};
|
|
46
|
+
const files = {};
|
|
47
|
+
form.forEach((value, key) => {
|
|
48
|
+
if (isFileEntry(value)) {
|
|
49
|
+
if (value.size === 0 && value.name === '')
|
|
50
|
+
return; // empty file input
|
|
51
|
+
files[key] = value; // single file per field; last wins
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const s = String(value);
|
|
55
|
+
if (key in fields) {
|
|
56
|
+
const existing = fields[key];
|
|
57
|
+
fields[key] = Array.isArray(existing) ? [...existing, s] : [existing, s];
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
fields[key] = s;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
return { fields, files };
|
|
64
|
+
}
|
|
25
65
|
// ─── reCAPTCHA ─────────────────────────────────────────────────────────────
|
|
26
66
|
/**
|
|
27
67
|
* True when the form declares a reCAPTCHA field (flat or in any step). Only such
|
|
@@ -73,8 +113,23 @@ export function registerFormRoutes(router, ctx) {
|
|
|
73
113
|
// submission against the wrong row and hiding it from the form's Submissions
|
|
74
114
|
// view. Typing the lookup to 'form' fixes that silent misattribution
|
|
75
115
|
// (kywi-cms#39).
|
|
76
|
-
|
|
77
|
-
|
|
116
|
+
//
|
|
117
|
+
// `publishedOnly` additionally restricts the lookup to status='published' —
|
|
118
|
+
// used by the public resolve/submit/draft-progress endpoints so a draft form
|
|
119
|
+
// is neither resolvable nor submittable by an unauthenticated visitor
|
|
120
|
+
// (kywi-cms#66). Editor+ callers pass `publishedOnly: false` to preview drafts.
|
|
121
|
+
async function getFormBySlug(slug, siteId, opts) {
|
|
122
|
+
return getContentBySlug(db, null, slug, siteId, {
|
|
123
|
+
baseType: 'form',
|
|
124
|
+
...(opts?.publishedOnly ? { status: 'published' } : {}),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// A request may preview a draft form only when authenticated as editor+.
|
|
128
|
+
// Everyone else (including unauthenticated requests) is restricted to
|
|
129
|
+
// published forms (kywi-cms#66).
|
|
130
|
+
async function resolvePublishedOnly(req) {
|
|
131
|
+
const auth = await authenticate(req);
|
|
132
|
+
return !(auth.user && hasMinRole(auth.user.role, 'editor'));
|
|
78
133
|
}
|
|
79
134
|
// Resolve the effective reCAPTCHA config for a site: an explicit ctx override
|
|
80
135
|
// (config/programmatic) wins; otherwise the per-site keys saved in Settings →
|
|
@@ -114,7 +169,8 @@ export function registerFormRoutes(router, ctx) {
|
|
|
114
169
|
router.get('/forms/:slug', async (req, params) => {
|
|
115
170
|
const slug = params.slug;
|
|
116
171
|
const siteId = resolveSiteId(req, config, ctx.siteIdMap);
|
|
117
|
-
const
|
|
172
|
+
const publishedOnly = await resolvePublishedOnly(req);
|
|
173
|
+
const form = await getFormBySlug(slug, siteId, { publishedOnly });
|
|
118
174
|
if (!form)
|
|
119
175
|
return notFound('Form not found');
|
|
120
176
|
const f = form;
|
|
@@ -137,7 +193,8 @@ export function registerFormRoutes(router, ctx) {
|
|
|
137
193
|
router.post('/forms/:slug/submit', async (req, params) => {
|
|
138
194
|
const slug = params.slug;
|
|
139
195
|
const siteId = resolveSiteId(req, config, ctx.siteIdMap);
|
|
140
|
-
const
|
|
196
|
+
const publishedOnly = await resolvePublishedOnly(req);
|
|
197
|
+
const formContent = await getFormBySlug(slug, siteId, { publishedOnly });
|
|
141
198
|
if (!formContent)
|
|
142
199
|
return notFound('Form not found');
|
|
143
200
|
// CSRF validation (double-submit cookie pattern)
|
|
@@ -167,14 +224,45 @@ export function registerFormRoutes(router, ctx) {
|
|
|
167
224
|
return jsonError('FORBIDDEN', result.error ?? 'reCAPTCHA failed', 403);
|
|
168
225
|
}
|
|
169
226
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
227
|
+
// Body parse: forms with file fields submit multipart/form-data (file bytes
|
|
228
|
+
// + text fields); everything else stays JSON, byte-identical to before.
|
|
229
|
+
const contentType = (req.headers.get('content-type') ?? '').toLowerCase();
|
|
230
|
+
const isMultipart = contentType.includes('multipart/form-data');
|
|
231
|
+
// Hard upload ceiling (bytes) — the same default cap the media route uses.
|
|
232
|
+
// Applies to file uploads regardless of any per-field maxSizeMb, so an
|
|
233
|
+
// unauthenticated multipart submit can't buffer an unbounded body.
|
|
234
|
+
const maxUploadBytes = (config.media?.maxUploadSizeMb ?? DEFAULT_MAX_UPLOAD_MB) * 1024 * 1024;
|
|
235
|
+
let bodyObj;
|
|
236
|
+
let fileEntries = {};
|
|
237
|
+
if (isMultipart) {
|
|
238
|
+
// Reject an oversize body up front (before buffering it) when the client
|
|
239
|
+
// declares Content-Length. The per-file byte check below is the backstop
|
|
240
|
+
// for chunked/transfer-encoded requests that omit it.
|
|
241
|
+
const contentLength = Number(req.headers.get('content-length') ?? '');
|
|
242
|
+
if (Number.isFinite(contentLength) && contentLength > maxUploadBytes) {
|
|
243
|
+
return jsonError('PAYLOAD_TOO_LARGE', `Upload exceeds the maximum size of ${config.media?.maxUploadSizeMb ?? DEFAULT_MAX_UPLOAD_MB}MB`, 413);
|
|
244
|
+
}
|
|
245
|
+
let form;
|
|
246
|
+
try {
|
|
247
|
+
form = await req.formData();
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return jsonError('BAD_REQUEST', 'Invalid multipart body', 400);
|
|
251
|
+
}
|
|
252
|
+
const parsed = parseMultipartFormData(form);
|
|
253
|
+
bodyObj = parsed.fields;
|
|
254
|
+
fileEntries = parsed.files;
|
|
173
255
|
}
|
|
174
|
-
|
|
175
|
-
|
|
256
|
+
else {
|
|
257
|
+
let body;
|
|
258
|
+
try {
|
|
259
|
+
body = await req.json();
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
return jsonError('BAD_REQUEST', 'Invalid JSON body', 400);
|
|
263
|
+
}
|
|
264
|
+
bodyObj = body;
|
|
176
265
|
}
|
|
177
|
-
const bodyObj = body;
|
|
178
266
|
// Honeypot check
|
|
179
267
|
if (checkHoneypot(bodyObj)) {
|
|
180
268
|
// Silently accept but do not persist — bot protection
|
|
@@ -187,6 +275,23 @@ export function registerFormRoutes(router, ctx) {
|
|
|
187
275
|
// body — so a client cannot inject arbitrary extra keys into the stored
|
|
188
276
|
// submission record. Forms with no declared fields fall back to cleanData.
|
|
189
277
|
const formFields = formContent.formFields;
|
|
278
|
+
// Multipart carries every field as a string (or repeated-key array); coerce
|
|
279
|
+
// checkbox → boolean and multiSelect → array so the validation schema sees
|
|
280
|
+
// the same shapes the JSON path produces (otherwise a file+checkbox or
|
|
281
|
+
// file+multiSelect form would always fail validation).
|
|
282
|
+
if (isMultipart && formFields && Array.isArray(formFields)) {
|
|
283
|
+
for (const field of formFields) {
|
|
284
|
+
if (!(field.name in cleanData))
|
|
285
|
+
continue;
|
|
286
|
+
const raw = cleanData[field.name];
|
|
287
|
+
if (field.type === 'checkbox') {
|
|
288
|
+
cleanData[field.name] = raw === true || raw === 'true' || raw === 'on';
|
|
289
|
+
}
|
|
290
|
+
else if (field.type === 'multiSelect') {
|
|
291
|
+
cleanData[field.name] = Array.isArray(raw) ? raw : [raw];
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
190
295
|
let dataToStore = cleanData;
|
|
191
296
|
if (formFields && Array.isArray(formFields) && formFields.length > 0) {
|
|
192
297
|
const schema = buildFormValidationSchema(formFields);
|
|
@@ -196,6 +301,80 @@ export function registerFormRoutes(router, ctx) {
|
|
|
196
301
|
}
|
|
197
302
|
dataToStore = parsed.data;
|
|
198
303
|
}
|
|
304
|
+
// File-upload fields: enforce accept/maxSizeMb on the uploaded bytes, then
|
|
305
|
+
// persist through the existing media pipeline (storage.write +
|
|
306
|
+
// createMediaRecord) and store the media id/URL in the submission. Without a
|
|
307
|
+
// storage provider configured, constraints are still enforced and only
|
|
308
|
+
// name/size/type metadata is retained.
|
|
309
|
+
if (formFields && Array.isArray(formFields)) {
|
|
310
|
+
for (const field of formFields) {
|
|
311
|
+
if (field.type !== 'file')
|
|
312
|
+
continue;
|
|
313
|
+
const file = fileEntries[field.name];
|
|
314
|
+
if (!file) {
|
|
315
|
+
if (field.required) {
|
|
316
|
+
return jsonError('VALIDATION_ERROR', 'Validation failed', 400, [
|
|
317
|
+
{ path: field.name, message: 'This field is required' },
|
|
318
|
+
]);
|
|
319
|
+
}
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
const check = validateFileConstraints(field, { name: file.name, size: file.size, type: file.type });
|
|
323
|
+
if (!check.ok) {
|
|
324
|
+
return check.code === 'size'
|
|
325
|
+
? jsonError('PAYLOAD_TOO_LARGE', check.message, 413, [{ path: field.name, message: check.message }])
|
|
326
|
+
: jsonError('VALIDATION_ERROR', check.message, 400, [{ path: field.name, message: check.message }]);
|
|
327
|
+
}
|
|
328
|
+
const mimeType = file.type || 'application/octet-stream';
|
|
329
|
+
// Media upload allowlist — the SAME extension+MIME gate every media-route
|
|
330
|
+
// write runs (media-routes.ts). A form file field without an `accept`
|
|
331
|
+
// constraint would otherwise let an anonymous submitter host a
|
|
332
|
+
// client-typed .html/.svg served inline at GET /media/:id/file (stored
|
|
333
|
+
// XSS). Enforced before storing, on the metadata-only path too.
|
|
334
|
+
const allowed = checkUploadAllowed(file.name, mimeType, config.media);
|
|
335
|
+
if (!allowed.ok) {
|
|
336
|
+
return jsonError('UNSUPPORTED_MEDIA_TYPE', allowed.reason, 400, [{ path: field.name, message: allowed.reason }]);
|
|
337
|
+
}
|
|
338
|
+
const buffer = Buffer.from(await file.arrayBuffer());
|
|
339
|
+
// Re-check against actual byte length: the per-field maxSizeMb AND the
|
|
340
|
+
// hard media ceiling (file.size is client-reported; a chunked request may
|
|
341
|
+
// omit Content-Length, so this is the authoritative size gate).
|
|
342
|
+
const maxSizeMb = field.validation?.maxSizeMb;
|
|
343
|
+
if (maxSizeMb !== undefined && buffer.byteLength > maxSizeMb * 1024 * 1024) {
|
|
344
|
+
const message = `File exceeds the maximum size of ${maxSizeMb}MB`;
|
|
345
|
+
return jsonError('PAYLOAD_TOO_LARGE', message, 413, [{ path: field.name, message }]);
|
|
346
|
+
}
|
|
347
|
+
if (buffer.byteLength > maxUploadBytes) {
|
|
348
|
+
const message = `File exceeds the maximum size of ${config.media?.maxUploadSizeMb ?? DEFAULT_MAX_UPLOAD_MB}MB`;
|
|
349
|
+
return jsonError('PAYLOAD_TOO_LARGE', message, 413, [{ path: field.name, message }]);
|
|
350
|
+
}
|
|
351
|
+
if (ctx.storage) {
|
|
352
|
+
const mediaId = randomUUID();
|
|
353
|
+
const storageKey = `${siteId}/forms/${mediaId}/${file.name}`;
|
|
354
|
+
await ctx.storage.write(storageKey, buffer);
|
|
355
|
+
const record = await createMediaRecord(db, {
|
|
356
|
+
siteId,
|
|
357
|
+
filename: file.name,
|
|
358
|
+
originalFilename: file.name,
|
|
359
|
+
mimeType,
|
|
360
|
+
fileSize: buffer.byteLength,
|
|
361
|
+
storageKey,
|
|
362
|
+
});
|
|
363
|
+
dataToStore[field.name] = {
|
|
364
|
+
mediaId: record.id,
|
|
365
|
+
// siteId is required — GET /media/:id/file resolves the file per-site,
|
|
366
|
+
// so a bare /media/:id/file 404s on any non-default site.
|
|
367
|
+
url: `/media/${record.id}/file?siteId=${encodeURIComponent(siteId)}`,
|
|
368
|
+
filename: file.name,
|
|
369
|
+
size: buffer.byteLength,
|
|
370
|
+
type: mimeType,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
dataToStore[field.name] = { filename: file.name, size: buffer.byteLength, type: mimeType };
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
199
378
|
// onBeforeFormSubmitSave hook
|
|
200
379
|
const hookPayload = {
|
|
201
380
|
formContentId: formContent.id,
|
|
@@ -273,7 +452,8 @@ export function registerFormRoutes(router, ctx) {
|
|
|
273
452
|
router.post('/forms/:slug/drafts', async (req, params) => {
|
|
274
453
|
const slug = params.slug;
|
|
275
454
|
const siteId = resolveSiteId(req, config, ctx.siteIdMap);
|
|
276
|
-
const
|
|
455
|
+
const publishedOnly = await resolvePublishedOnly(req);
|
|
456
|
+
const formContent = await getFormBySlug(slug, siteId, { publishedOnly });
|
|
277
457
|
if (!formContent)
|
|
278
458
|
return notFound('Form not found');
|
|
279
459
|
let body;
|
|
@@ -324,7 +504,8 @@ export function registerFormRoutes(router, ctx) {
|
|
|
324
504
|
const slug = params.slug;
|
|
325
505
|
const token = params.token;
|
|
326
506
|
const siteId = resolveSiteId(req, config, ctx.siteIdMap);
|
|
327
|
-
const
|
|
507
|
+
const publishedOnly = await resolvePublishedOnly(req);
|
|
508
|
+
const formContent = await getFormBySlug(slug, siteId, { publishedOnly });
|
|
328
509
|
if (!formContent)
|
|
329
510
|
return notFound('Form not found');
|
|
330
511
|
const formContentId = formContent.id;
|
|
@@ -356,6 +537,9 @@ export function registerFormRoutes(router, ctx) {
|
|
|
356
537
|
return forbidden();
|
|
357
538
|
const slug = params.slug;
|
|
358
539
|
const siteId = resolveSiteId(req, config, ctx.siteIdMap);
|
|
540
|
+
const siteDenied = assertSiteAccess(auth.user, siteId);
|
|
541
|
+
if (siteDenied)
|
|
542
|
+
return siteDenied;
|
|
359
543
|
const formContent = await getFormBySlug(slug, siteId);
|
|
360
544
|
if (!formContent)
|
|
361
545
|
return notFound('Form not found');
|
|
@@ -379,6 +563,9 @@ export function registerFormRoutes(router, ctx) {
|
|
|
379
563
|
if (gate.error)
|
|
380
564
|
return gate.error;
|
|
381
565
|
const siteId = resolveSiteId(req, config, ctx.siteIdMap);
|
|
566
|
+
const siteDenied = assertSiteAccess(gate.user, siteId);
|
|
567
|
+
if (siteDenied)
|
|
568
|
+
return siteDenied;
|
|
382
569
|
const counts = await listFormSubmissionCounts(db, siteId);
|
|
383
570
|
return jsonOk(counts);
|
|
384
571
|
});
|
|
@@ -388,6 +575,9 @@ export function registerFormRoutes(router, ctx) {
|
|
|
388
575
|
if (gate.error)
|
|
389
576
|
return gate.error;
|
|
390
577
|
const siteId = resolveSiteId(req, config, ctx.siteIdMap);
|
|
578
|
+
const siteDenied = assertSiteAccess(gate.user, siteId);
|
|
579
|
+
if (siteDenied)
|
|
580
|
+
return siteDenied;
|
|
391
581
|
const formContent = await getFormBySlug(params.slug, siteId);
|
|
392
582
|
if (!formContent)
|
|
393
583
|
return notFound('Form not found');
|
|
@@ -402,6 +592,9 @@ export function registerFormRoutes(router, ctx) {
|
|
|
402
592
|
if (gate.error)
|
|
403
593
|
return gate.error;
|
|
404
594
|
const siteId = resolveSiteId(req, config, ctx.siteIdMap);
|
|
595
|
+
const siteDenied = assertSiteAccess(gate.user, siteId);
|
|
596
|
+
if (siteDenied)
|
|
597
|
+
return siteDenied;
|
|
405
598
|
const formContent = await getFormBySlug(params.slug, siteId);
|
|
406
599
|
if (!formContent)
|
|
407
600
|
return notFound('Form not found');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-routes.js","sourceRoot":"","sources":["../../src/api/form-routes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"form-routes.js","sourceRoot":"","sources":["../../src/api/form-routes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAE3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,oFAAoF;AACpF,MAAM,qBAAqB,GAAG,EAAE,CAAA;AAEhC,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAA;AACnH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AA4B/D,SAAS,mBAAmB,CAAC,YAA2B;IACtD,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAA;IAC9B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACrD,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;AAC3B,CAAC;AAED,gFAAgF;AAEhF,MAAM,cAAc,GAAG,UAAU,CAAA;AAEjC,MAAM,UAAU,aAAa,CAAC,IAA6B;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,CAAA;IAChC,yDAAyD;IACzD,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,CAAA;AACxD,CAAC;AAED,gFAAgF;AAEhF,yEAAyE;AACzE,SAAS,WAAW,CAAC,KAAyB;IAC5C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAAmC,CAAC,WAAW,KAAK,UAAU;QACtE,MAAM,IAAI,KAAK;QACf,MAAM,IAAI,KAAK,CAChB,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAc;IAInD,MAAM,MAAM,GAA4B,EAAE,CAAA;IAC1C,MAAM,KAAK,GAAyB,EAAE,CAAA;IACtC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC1B,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE;gBAAE,OAAM,CAAC,mBAAmB;YACrE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA,CAAC,mCAAmC;YACtD,OAAM;QACR,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QACvB,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAC1E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;IACF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AAC1B,CAAC;AAED,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAa;IACjD,MAAM,CAAC,GAAG,IAAqD,CAAA;IAC/D,MAAM,WAAW,GAAG,CAAC,CAAU,EAAE,EAAE,CAAE,CAAuB,EAAE,IAAI,KAAK,WAAW,CAAA;IAClF,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAA;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,SAAwC,EAAE,CAAC;YAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBAAE,OAAO,IAAI,CAAA;QAC/E,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAQD,MAAM,cAAc,GAAG,IAAI,GAAG,EAA0B,CAAA;AAExD,MAAM,UAAU,aAAa,CAC3B,EAAU,EACV,YAAoB,EACpB,QAAgB,EAChB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACpC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7C,OAAO,KAAK,CAAA;IACd,CAAC;IAED,oBAAoB;IACpB,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAA;IACrE,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,IAAI,YAAY;QAAE,OAAO,IAAI,CAAA;IACxD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC1B,OAAO,KAAK,CAAA;AACd,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,mBAAmB;IACjC,cAAc,CAAC,KAAK,EAAE,CAAA;AACxB,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,GAAqB;IACtE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;IACtC,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,EAAE,YAAY,IAAI,EAAE,CAAA;IACtD,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,EAAE,QAAQ,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;IAE1D,KAAK,UAAU,YAAY,CAAC,GAAY;QACtC,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;IACtE,CAAC;IAED,gFAAgF;IAChF,gFAAgF;IAChF,4EAA4E;IAC5E,6EAA6E;IAC7E,qEAAqE;IACrE,iBAAiB;IACjB,EAAE;IACF,4EAA4E;IAC5E,6EAA6E;IAC7E,sEAAsE;IACtE,gFAAgF;IAChF,KAAK,UAAU,aAAa,CAC1B,IAAY,EACZ,MAAc,EACd,IAAkC;QAElC,OAAO,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;YAC9C,QAAQ,EAAE,MAAM;YAChB,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC,CAAA;IACJ,CAAC;IAED,yEAAyE;IACzE,sEAAsE;IACtE,iCAAiC;IACjC,KAAK,UAAU,oBAAoB,CAAC,GAAY;QAC9C,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAA;QACpC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED,8EAA8E;IAC9E,8EAA8E;IAC9E,+EAA+E;IAC/E,2EAA2E;IAC3E,uBAAuB;IACvB,KAAK,UAAU,sBAAsB,CAAC,MAAc;QAClD,IAAI,GAAG,CAAC,eAAe;YAAE,OAAO,GAAG,CAAC,eAAe,CAAA;QACnD,MAAM,QAAQ,GAAG,CAAC,MAAM,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAEtD,CAAA;QACR,IAAI,QAAQ,EAAE,gBAAgB,IAAI,QAAQ,EAAE,eAAe,EAAE,CAAC;YAC5D,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,gBAAgB,EAAE,SAAS,EAAE,QAAQ,CAAC,eAAe,EAAE,CAAA;QACpF,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,iDAAiD;IACjD,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAA;QACjC,MAAM,MAAM,GAAG,aAAa,KAAK,gDAAgD,CAAA;QACjF,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;YAC7C,MAAM,EAAE,GAAG;YACX,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,MAAM;aACrB;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,6EAA6E;IAC7E,8EAA8E;IAC9E,gFAAgF;IAChF,yEAAyE;IACzE,+EAA+E;IAC/E,6EAA6E;IAC7E,wEAAwE;IACxE,+EAA+E;IAC/E,6EAA6E;IAC7E,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAK,CAAA;QACzB,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;QACxD,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAA;QACrD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,CAAC,CAAA;QACjE,IAAI,CAAC,IAAI;YAAE,OAAO,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QAE5C,MAAM,CAAC,GAAG,IAAW,CAAA;QACrB,MAAM,IAAI,GAA4B;YACpC,IAAI;YACJ,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;YACtB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;YACvD,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YAChF,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI;YACxC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,IAAI;SACnC,CAAA;QACD,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAA;YACtD,IAAI,SAAS;gBAAE,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAA;QAC1D,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,8CAA8C;IAC9C,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAK,CAAA;QACzB,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;QACxD,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAA;QAErD,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,CAAC,CAAA;QACxE,IAAI,CAAC,WAAW;YAAE,OAAO,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QAEnD,iDAAiD;QACjD,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;QACjE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QAClD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;YAC3E,OAAO,SAAS,CAAC,WAAW,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAA;QAC1D,CAAC;QAED,uBAAuB;QACvB,MAAM,KAAK,GACT,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;YACzD,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;YAC5B,IAAI,CAAA;QACN,IAAI,KAAK,IAAI,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC1D,OAAO,SAAS,CAAC,cAAc,EAAE,+CAA+C,EAAE,GAAG,CAAC,CAAA;QACxF,CAAC;QAED,4EAA4E;QAC5E,wEAAwE;QACxE,6EAA6E;QAC7E,IAAI,qBAAqB,CAAC,WAAW,CAAC,EAAE,CAAC;YACvC,MAAM,eAAe,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAA;YAC5D,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;gBAC3D,IAAI,CAAC,cAAc;oBAAE,OAAO,SAAS,CAAC,aAAa,EAAE,0BAA0B,EAAE,GAAG,CAAC,CAAA;gBACrF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,cAAc,EAAE,eAAe,CAAC,CAAA;gBACrE,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,IAAI,kBAAkB,EAAE,GAAG,CAAC,CAAA;YAC7F,CAAC;QACH,CAAC;QAED,4EAA4E;QAC5E,wEAAwE;QACxE,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QACzE,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAA;QAE/D,2EAA2E;QAC3E,uEAAuE;QACvE,mEAAmE;QACnE,MAAM,cAAc,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,IAAI,qBAAqB,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;QAE7F,IAAI,OAAgC,CAAA;QACpC,IAAI,WAAW,GAAyB,EAAE,CAAA;QAC1C,IAAI,WAAW,EAAE,CAAC;YAChB,yEAAyE;YACzE,yEAAyE;YACzE,sDAAsD;YACtD,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAA;YACrE,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,cAAc,EAAE,CAAC;gBACrE,OAAO,SAAS,CAAC,mBAAmB,EAAE,sCAAsC,MAAM,CAAC,KAAK,EAAE,eAAe,IAAI,qBAAqB,IAAI,EAAE,GAAG,CAAC,CAAA;YAC9I,CAAC;YACD,IAAI,IAAc,CAAA;YAClB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAA;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC,aAAa,EAAE,wBAAwB,EAAE,GAAG,CAAC,CAAA;YAChE,CAAC;YACD,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAA;YAC3C,OAAO,GAAG,MAAM,CAAC,MAAM,CAAA;YACvB,WAAW,GAAG,MAAM,CAAC,KAAK,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,IAAa,CAAA;YACjB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC,aAAa,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAA;YAC3D,CAAC;YACD,OAAO,GAAG,IAA+B,CAAA;QAC3C,CAAC;QAED,iBAAiB;QACjB,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,sDAAsD;YACtD,OAAO,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,GAAG,CAAC,CAAA;QACxE,CAAC;QAED,+DAA+D;QAC/D,MAAM,EAAE,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,CAAA;QAEvD,4EAA4E;QAC5E,0EAA0E;QAC1E,wEAAwE;QACxE,2EAA2E;QAC3E,MAAM,UAAU,GAAI,WAAmB,CAAC,UAA+C,CAAA;QAEvF,4EAA4E;QAC5E,2EAA2E;QAC3E,uEAAuE;QACvE,uDAAuD;QACvD,IAAI,WAAW,IAAI,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3D,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;gBAC/B,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC;oBAAE,SAAQ;gBACxC,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACjC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC9B,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,IAAI,CAAA;gBACxE,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBACxC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;gBAC1D,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,WAAW,GAA4B,SAAS,CAAA;QACpD,IAAI,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrE,MAAM,MAAM,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAA;YACpD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;YAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,SAAS,CACd,kBAAkB,EAClB,mBAAmB,EACnB,GAAG,EACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAC/E,CAAA;YACH,CAAC;YACD,WAAW,GAAG,MAAM,CAAC,IAA+B,CAAA;QACtD,CAAC;QAED,2EAA2E;QAC3E,+DAA+D;QAC/D,6EAA6E;QAC7E,uEAAuE;QACvE,uCAAuC;QACvC,IAAI,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5C,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;gBAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;oBAAE,SAAQ;gBACnC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACpC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBACnB,OAAO,SAAS,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,GAAG,EAAE;4BAC7D,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,wBAAwB,EAAE;yBACxD,CAAC,CAAA;oBACJ,CAAC;oBACD,SAAQ;gBACV,CAAC;gBAED,MAAM,KAAK,GAAG,uBAAuB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;gBACnG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;oBACd,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM;wBAC1B,CAAC,CAAC,SAAS,CAAC,mBAAmB,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;wBACpG,CAAC,CAAC,SAAS,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;gBACvG,CAAC;gBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,0BAA0B,CAAA;gBAExD,0EAA0E;gBAC1E,sEAAsE;gBACtE,+DAA+D;gBAC/D,uEAAuE;gBACvE,gEAAgE;gBAChE,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;gBACrE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;oBAChB,OAAO,SAAS,CAAC,wBAAwB,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;gBAClH,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;gBACpD,uEAAuE;gBACvE,0EAA0E;gBAC1E,gEAAgE;gBAChE,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,EAAE,SAAS,CAAA;gBAC7C,IAAI,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;oBAC3E,MAAM,OAAO,GAAG,oCAAoC,SAAS,IAAI,CAAA;oBACjE,OAAO,SAAS,CAAC,mBAAmB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;gBACtF,CAAC;gBACD,IAAI,MAAM,CAAC,UAAU,GAAG,cAAc,EAAE,CAAC;oBACvC,MAAM,OAAO,GAAG,oCAAoC,MAAM,CAAC,KAAK,EAAE,eAAe,IAAI,qBAAqB,IAAI,CAAA;oBAC9G,OAAO,SAAS,CAAC,mBAAmB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;gBACtF,CAAC;gBAED,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBAChB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;oBAC5B,MAAM,UAAU,GAAG,GAAG,MAAM,UAAU,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAA;oBAC5D,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;oBAC3C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE;wBACzC,MAAM;wBACN,QAAQ,EAAE,IAAI,CAAC,IAAI;wBACnB,gBAAgB,EAAE,IAAI,CAAC,IAAI;wBAC3B,QAAQ;wBACR,QAAQ,EAAE,MAAM,CAAC,UAAU;wBAC3B,UAAU;qBACX,CAAC,CAAA;oBACF,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;wBACxB,OAAO,EAAE,MAAM,CAAC,EAAE;wBAClB,uEAAuE;wBACvE,0DAA0D;wBAC1D,GAAG,EAAE,UAAU,MAAM,CAAC,EAAE,gBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE;wBACpE,QAAQ,EAAE,IAAI,CAAC,IAAI;wBACnB,IAAI,EAAE,MAAM,CAAC,UAAU;wBACvB,IAAI,EAAE,QAAQ;qBACf,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;gBAC5F,CAAC;YACH,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,MAAM,WAAW,GAA0B;YACzC,aAAa,EAAG,WAAmB,CAAC,EAAY;YAChD,MAAM;YACN,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,KAAK;SACjB,CAAA;QACD,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACrB,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAA;QACpE,CAAC;QAED,MAAM,UAAU,GAA+C;YAC7D,MAAM;YACN,aAAa,EAAG,WAAmB,CAAC,EAAY;YAChD,IAAI,EAAE,WAAW;SAClB,CAAA;QACD,IAAI,KAAK;YAAE,UAAU,CAAC,SAAS,GAAG,KAAK,CAAA;QAEvC,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;QAE7D,6BAA6B;QAC7B,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACrB,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,uBAAuB,EAAE;gBACnD,GAAG,WAAW;gBACd,YAAY,EAAE,UAAU,CAAC,EAAE;aAC5B,CAAC,CAAA;QACJ,CAAC;QAED,4BAA4B;QAC5B,MAAM,YAAY,GAAI,WAAmB,CAAC,YAAkC,CAAA;QAC5E,IAAI,YAAY,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACzE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;qBAC/C,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,cAAc,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;qBAC7D,IAAI,CAAC,EAAE,CAAC,CAAA;gBACX,MAAM,IAAI,GAAG,mBAAmB,CAAC,0BAA0B,EAAE;oBAC3D,QAAQ,EAAE,MAAM,CAAE,WAAmB,CAAC,KAAK,IAAI,MAAM,CAAC;oBACtD,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,MAAM;oBACzC,cAAc;oBACd,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACtC,CAAC,CAAA;gBACF,MAAM,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;oBAC3B,EAAE,EAAE,MAAM;oBACV,OAAO,EAAE,mBAAoB,WAAmB,CAAC,KAAK,EAAE;oBACxD,IAAI;iBACL,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,MAAM,cAAc,GAAG,WAAW,CAAC,KAA2B,CAAA;QAC9D,IAAI,cAAc,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,MAAM,CAAE,WAAmB,CAAC,KAAK,IAAI,MAAM,CAAC,CAAA;YAC9D,MAAM,cAAc,GAAI,WAAmB,CAAC,cAAoC,CAAA;YAChF,MAAM,IAAI,GAAG,mBAAmB,CAAC,0BAA0B,EAAE;gBAC3D,QAAQ,EAAE,SAAS;gBACnB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,MAAM;gBACzC,mBAAmB,EAAE,cAAc,IAAI,wDAAwD;aAChG,CAAC,CAAA;YACF,MAAM,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;gBAC3B,EAAE,EAAE,CAAC,cAAc,CAAC;gBACpB,OAAO,EAAE,wBAAwB,SAAS,EAAE;gBAC5C,IAAI;aACL,CAAC,CAAA;QACJ,CAAC;QAED,2DAA2D;QAC3D,MAAM,cAAc,GAAI,WAAmB,CAAC,cAAoC,CAAA;QAChF,MAAM,WAAW,GAAI,WAAmB,CAAC,WAAiC,CAAA;QAC1E,MAAM,YAAY,GAA4B,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,CAAA;QACnE,IAAI,cAAc;YAAE,YAAY,CAAC,cAAc,GAAG,cAAc,CAAA;QAChE,IAAI,WAAW;YAAE,YAAY,CAAC,WAAW,GAAG,WAAW,CAAA;QAEvD,OAAO,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,8EAA8E;IAE9E,oDAAoD;IACpD,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAK,CAAA;QACzB,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;QACxD,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAA;QACrD,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,CAAC,CAAA;QACxE,IAAI,CAAC,WAAW;YAAE,OAAO,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QAEnD,IAAI,IAAa,CAAA;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC,aAAa,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAA;QAC3D,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAIpC,CAAA;QAED,IAAI,CAAC,IAAI,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,SAAS,CAAC,aAAa,EAAE,6BAA6B,EAAE,GAAG,CAAC,CAAA;QACrE,CAAC;QAED,MAAM,aAAa,GAAI,WAAmB,CAAC,EAAY,CAAA;QAEvD,gEAAgE;QAChE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAA;QAE9D,IAAI,KAAK,EAAE,CAAC;YACV,wBAAwB;YACxB,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;YACtE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;YAC/C,MAAM,QAAQ,GAAG,MAAM,EAAE;iBACtB,MAAM,EAAE;iBACR,IAAI,CAAC,wBAAwB,CAAC;iBAC9B,KAAK,CAAC,GAAG,CACR,EAAE,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC,EACzC,EAAE,CAAC,wBAAwB,CAAC,aAAa,EAAE,aAAa,CAAC,CAC1D,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YAExB,IAAI,CAAC,QAAQ;gBAAE,OAAO,QAAQ,CAAC,iBAAiB,CAAC,CAAA;YAEjD,MAAM,EAAE;iBACL,MAAM,CAAC,wBAAwB,CAAC;iBAChC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAW,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;iBAC9D,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;YAEtD,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAA;QAC/C,CAAC;QAED,mBAAmB;QACnB,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;QAC3D,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;QACtE,MAAM,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC;YAC/C,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAW;YACvB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAA;QAEF,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,mDAAmD;IACnD,MAAM,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAK,CAAA;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAM,CAAA;QAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;QACxD,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAA;QACrD,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,CAAC,CAAA;QACxE,IAAI,CAAC,WAAW;YAAE,OAAO,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QAEnD,MAAM,aAAa,GAAI,WAAmB,CAAC,EAAY,CAAA;QACvD,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;QACtE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;QAE/C,MAAM,KAAK,GAAG,MAAM,EAAE;aACnB,MAAM,EAAE;aACR,IAAI,CAAC,wBAAwB,CAAC;aAC9B,KAAK,CAAC,GAAG,CACR,EAAE,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC,EACzC,EAAE,CAAC,wBAAwB,CAAC,aAAa,EAAE,aAAa,CAAC,CAC1D,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAExB,IAAI,CAAC,KAAK;YAAE,OAAO,QAAQ,CAAC,iBAAiB,CAAC,CAAA;QAE9C,mBAAmB;QACnB,IAAI,IAAI,IAAI,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,OAAO,SAAS,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAA;QACpD,CAAC;QAED,OAAO,MAAM,CAAC;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,+DAA+D;IAC/D,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAA;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,YAAY,EAAE,CAAA;QACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;YAAE,OAAO,SAAS,EAAE,CAAA;QAEhE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAK,CAAA;QACzB,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;QACxD,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACtD,IAAI,UAAU;YAAE,OAAO,UAAU,CAAA;QAEjC,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACrD,IAAI,CAAC,WAAW;YAAE,OAAO,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QAEnD,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,EAAE,EAAG,WAAmB,CAAC,EAAY,CAAC,CAAA;QACpF,OAAO,MAAM,CAAC,WAAW,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,gFAAgF;IAEhF,4DAA4D;IAC5D,KAAK,UAAU,gBAAgB,CAAC,GAAY;QAC1C,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAA;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAc,EAAE,CAAA;QAC5D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAc,EAAE,CAAA;QACvF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAA;IAC5B,CAAC;IAED,0EAA0E;IAC1E,+EAA+E;IAC/E,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QACjC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;QACxD,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACtD,IAAI,UAAU;YAAE,OAAO,UAAU,CAAA;QACjC,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QACzD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,4EAA4E;IAC5E,MAAM,CAAC,MAAM,CAAC,8BAA8B,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAClE,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QACjC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;QACxD,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACtD,IAAI,UAAU;YAAE,OAAO,UAAU,CAAA;QACjC,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,IAAK,EAAE,MAAM,CAAC,CAAA;QAC7D,IAAI,CAAC,WAAW;YAAE,OAAO,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QACnD,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAG,WAAmB,CAAC,EAAY,EAAE,MAAM,CAAC,EAAG,CAAC,CAAA;QACxF,IAAI,CAAC,EAAE;YAAE,OAAO,QAAQ,CAAC,sBAAsB,CAAC,CAAA;QAChD,OAAO,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,qFAAqF;IACrF,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACjE,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QACjC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;QACxD,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACtD,IAAI,UAAU;YAAE,OAAO,UAAU,CAAA;QACjC,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,IAAK,EAAE,MAAM,CAAC,CAAA;QAC7D,IAAI,CAAC,WAAW;YAAE,OAAO,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QAEnD,IAAI,IAAa,CAAA;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC,aAAa,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAA;QAC3D,CAAC;QACD,MAAM,MAAM,GAAI,IAA6B,CAAC,MAAM,CAAA;QACpD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACpF,OAAO,SAAS,CAAC,aAAa,EAAE,qDAAqD,EAAE,GAAG,CAAC,CAAA;QAC7F,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,0BAA0B,CAAC,EAAE,EAAG,WAAmB,CAAC,EAAY,EAAE,MAAM,CAAC,EAAG,EAAE,MAAM,CAAC,CAAA;QACtG,IAAI,CAAC,EAAE;YAAE,OAAO,QAAQ,CAAC,sBAAsB,CAAC,CAAA;QAChD,OAAO,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-routes.d.ts","sourceRoot":"","sources":["../../src/api/group-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"group-routes.d.ts","sourceRoot":"","sources":["../../src/api/group-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,oBAAoB,CAAA;AAiBjE,UAAU,iBAAiB;IACzB,MAAM,EAAE,UAAU,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;CACnB;AAeD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,IAAI,CA2KhF"}
|
package/dist/api/group-routes.js
CHANGED
|
@@ -4,6 +4,7 @@ import { listGroups, getGroupById, createGroup, updateGroup, deleteGroup, addUse
|
|
|
4
4
|
import { resolveAuth } from './auth.js';
|
|
5
5
|
import { hasMinRole } from '../auth/roles.js';
|
|
6
6
|
import { resolveSiteId } from '../db/site-queries.js';
|
|
7
|
+
import { assertSiteAccess } from './site-context.js';
|
|
7
8
|
const createGroupSchema = z.object({
|
|
8
9
|
name: z.string().min(1, 'Name is required'),
|
|
9
10
|
type: z.enum(['public', 'private']).optional(),
|
|
@@ -32,6 +33,9 @@ export function registerGroupRoutes(router, ctx) {
|
|
|
32
33
|
// The config `sites[0].id` is a human-readable slug (e.g. "default"), while
|
|
33
34
|
// group rows store the site's DB UUID. Resolve so seeded groups are found.
|
|
34
35
|
const siteId = (await resolveSiteId(db, requestedSiteId)) ?? requestedSiteId;
|
|
36
|
+
const siteDenied = assertSiteAccess(auth.user, siteId);
|
|
37
|
+
if (siteDenied)
|
|
38
|
+
return siteDenied;
|
|
35
39
|
const groups = await listGroups(db, siteId);
|
|
36
40
|
return jsonOk(groups);
|
|
37
41
|
});
|
|
@@ -56,6 +60,9 @@ export function registerGroupRoutes(router, ctx) {
|
|
|
56
60
|
const { name, type, defaultRole, siteId } = parsed.data;
|
|
57
61
|
const requestedSiteId = siteId ?? config.sites[0].id;
|
|
58
62
|
const resolvedSiteId = (await resolveSiteId(db, requestedSiteId)) ?? requestedSiteId;
|
|
63
|
+
const siteDenied = assertSiteAccess(auth.user, resolvedSiteId);
|
|
64
|
+
if (siteDenied)
|
|
65
|
+
return siteDenied;
|
|
59
66
|
const group = await createGroup(db, {
|
|
60
67
|
siteId: resolvedSiteId,
|
|
61
68
|
name,
|
|
@@ -95,6 +102,13 @@ export function registerGroupRoutes(router, ctx) {
|
|
|
95
102
|
return validationError(parsed.error.errors.map(e => ({ path: e.path.join('.'), message: e.message })));
|
|
96
103
|
}
|
|
97
104
|
const updateData = Object.fromEntries(Object.entries(parsed.data).filter(([, v]) => v !== undefined));
|
|
105
|
+
// #73: id-keyed mutation — authorize against the group's own site first.
|
|
106
|
+
const existing = await getGroupById(db, params.id);
|
|
107
|
+
if (!existing)
|
|
108
|
+
return notFound('Group not found');
|
|
109
|
+
const siteDenied = assertSiteAccess(auth.user, existing.siteId);
|
|
110
|
+
if (siteDenied)
|
|
111
|
+
return siteDenied;
|
|
98
112
|
const updated = await updateGroup(db, params.id, updateData);
|
|
99
113
|
if (!updated)
|
|
100
114
|
return notFound('Group not found');
|
|
@@ -107,6 +121,13 @@ export function registerGroupRoutes(router, ctx) {
|
|
|
107
121
|
return unauthorized();
|
|
108
122
|
if (!hasMinRole(auth.user.role, 'siteAdmin'))
|
|
109
123
|
return forbidden();
|
|
124
|
+
// #73: id-keyed mutation — authorize against the group's own site first.
|
|
125
|
+
const existing = await getGroupById(db, params.id);
|
|
126
|
+
if (!existing)
|
|
127
|
+
return notFound('Group not found');
|
|
128
|
+
const siteDenied = assertSiteAccess(auth.user, existing.siteId);
|
|
129
|
+
if (siteDenied)
|
|
130
|
+
return siteDenied;
|
|
110
131
|
const deleted = await deleteGroup(db, params.id);
|
|
111
132
|
if (!deleted)
|
|
112
133
|
return notFound('Group not found');
|
|
@@ -135,6 +156,9 @@ export function registerGroupRoutes(router, ctx) {
|
|
|
135
156
|
const group = await getGroupById(db, params.id);
|
|
136
157
|
if (!group)
|
|
137
158
|
return notFound('Group not found');
|
|
159
|
+
const siteDenied = assertSiteAccess(auth.user, group.siteId);
|
|
160
|
+
if (siteDenied)
|
|
161
|
+
return siteDenied;
|
|
138
162
|
await addUserToGroup(db, params.userId, params.id);
|
|
139
163
|
return jsonOk({ added: true });
|
|
140
164
|
});
|
|
@@ -148,6 +172,9 @@ export function registerGroupRoutes(router, ctx) {
|
|
|
148
172
|
const group = await getGroupById(db, params.id);
|
|
149
173
|
if (!group)
|
|
150
174
|
return notFound('Group not found');
|
|
175
|
+
const siteDenied = assertSiteAccess(auth.user, group.siteId);
|
|
176
|
+
if (siteDenied)
|
|
177
|
+
return siteDenied;
|
|
151
178
|
await removeUserFromGroup(db, params.userId, params.id);
|
|
152
179
|
return jsonOk({ removed: true });
|
|
153
180
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-routes.js","sourceRoot":"","sources":["../../src/api/group-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACrG,OAAO,EACL,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"group-routes.js","sourceRoot":"","sources":["../../src/api/group-routes.ts"],"names":[],"mappings":"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"}
|
package/dist/api/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ResourceBundles } from '../i18n/types.js';
|
|
2
|
+
import { type ResolveChangesetType } from '../db/changeset-queries.js';
|
|
2
3
|
import type { KywiConfig } from '../config/types.js';
|
|
3
4
|
import type { KywiDb } from '../db/client.js';
|
|
4
5
|
import type { StorageProvider } from '../media/types.js';
|
|
@@ -62,6 +63,14 @@ export interface KywiApiOptions {
|
|
|
62
63
|
}
|
|
63
64
|
export interface KywiApiHandler {
|
|
64
65
|
handle(req: Request, pathSegments: string[]): Promise<Response>;
|
|
66
|
+
/**
|
|
67
|
+
* The config-derived changeset type-resolver (#63). A host that starts an
|
|
68
|
+
* in-process scheduler has no access to the handler's contentTypeMap/
|
|
69
|
+
* customTableMap, so it cannot make scheduled changeset publishes round-trip
|
|
70
|
+
* custom fields on its own. Exposing the resolver lets a host wire it in:
|
|
71
|
+
* `startScheduler(db, { resolveType: handler.resolveChangesetType, … })`.
|
|
72
|
+
*/
|
|
73
|
+
resolveChangesetType: ResolveChangesetType;
|
|
65
74
|
}
|
|
66
75
|
export declare function createKywiApiHandler(options: KywiApiOptions): Promise<KywiApiHandler>;
|
|
67
76
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/api/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AA4BvD,OAAO,KAAK,EAAE,UAAU,EAAmD,MAAM,oBAAoB,CAAA;AACrG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,sBAAsB,CAAA;AACpC,cAAc,WAAW,CAAA;AACzB,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,8BAA8B,CAAA;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAA;AAChF,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACtE,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,aAAa,CAAC,EAAE,iBAAiB,CAAA;IACjC,mFAAmF;IACnF,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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"}
|
package/dist/api/index.js
CHANGED
|
@@ -68,6 +68,7 @@ import { buildCustomFieldTable } from '../db/dynamic-schema.js';
|
|
|
68
68
|
import { loadAdminFields } from '../db/schema-field-queries.js';
|
|
69
69
|
import { loadAdminTypes } from '../db/content-type-queries.js';
|
|
70
70
|
import { resolveSiteId as resolveSiteIdFromDb } from '../db/site-queries.js';
|
|
71
|
+
import { buildChangesetTypeResolver } from '../db/changeset-queries.js';
|
|
71
72
|
export { Router } from './router.js';
|
|
72
73
|
export * from './response.js';
|
|
73
74
|
export * from './pagination.js';
|
|
@@ -166,6 +167,22 @@ export async function createKywiApiHandler(options) {
|
|
|
166
167
|
await cacheProvider.invalidatePattern(`nav:${siteId}:*`);
|
|
167
168
|
}
|
|
168
169
|
});
|
|
170
|
+
// Unpublish fires its own dedicated event (afterUpdate no longer fires on
|
|
171
|
+
// unpublish), so mirror the afterUpdate invalidation here — otherwise the
|
|
172
|
+
// public site keeps serving the just-unpublished node from stale cache.
|
|
173
|
+
hookRegistry.on('content:afterUnpublish', async (payload) => {
|
|
174
|
+
const p = payload;
|
|
175
|
+
const siteId = String(p.content.siteId ?? '');
|
|
176
|
+
const id = String(p.content.id ?? '');
|
|
177
|
+
const slug = p.content.slug ? String(p.content.slug) : undefined;
|
|
178
|
+
if (siteId && id) {
|
|
179
|
+
await cacheProvider.delete(contentKey(siteId, id));
|
|
180
|
+
if (slug)
|
|
181
|
+
await cacheProvider.delete(contentSlugKey(siteId, slug));
|
|
182
|
+
await cacheProvider.invalidatePattern(`feed:${siteId}:*`);
|
|
183
|
+
await cacheProvider.invalidatePattern(`nav:${siteId}:*`);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
169
186
|
hookRegistry.on('content:afterDelete', async (payload) => {
|
|
170
187
|
const p = payload;
|
|
171
188
|
const siteId = String(p.content.siteId ?? '');
|
|
@@ -336,7 +353,7 @@ export async function createKywiApiHandler(options) {
|
|
|
336
353
|
if (storage) {
|
|
337
354
|
registerMediaRoutes(router, { config, db, authSecret, storage });
|
|
338
355
|
}
|
|
339
|
-
registerFormRoutes(router, { config, db, authSecret, siteIdMap });
|
|
356
|
+
registerFormRoutes(router, { config, db, authSecret, siteIdMap, ...(storage ? { storage } : {}) });
|
|
340
357
|
registerSiteAdminRoutes(router, db, authSecret, hookRegistry);
|
|
341
358
|
registerAdminFeaturesRoutes(router, { config, db, authSecret });
|
|
342
359
|
registerDashboardRoutes(router, { config, db, authSecret, siteIdMap });
|
|
@@ -458,10 +475,13 @@ export async function createKywiApiHandler(options) {
|
|
|
458
475
|
db,
|
|
459
476
|
authSecret,
|
|
460
477
|
defaultSiteId: config.sites[0]?.id,
|
|
478
|
+
contentTypeMap,
|
|
479
|
+
customTableMap,
|
|
461
480
|
invalidateContent: invalidateContentCache,
|
|
462
481
|
});
|
|
463
482
|
// GAP-12-E: admin trigger for the background scheduler sweep (external cron).
|
|
464
|
-
|
|
483
|
+
// Maps let a scheduled changeset publish round-trip custom fields (#63).
|
|
484
|
+
registerSchedulerRoutes(router, { db, authSecret, contentTypeMap, customTableMap });
|
|
465
485
|
// Password reset routes
|
|
466
486
|
if (emailProvider) {
|
|
467
487
|
registerPasswordResetRoutes(router, { config, db, emailProvider });
|
|
@@ -496,6 +516,9 @@ export async function createKywiApiHandler(options) {
|
|
|
496
516
|
}
|
|
497
517
|
return response;
|
|
498
518
|
},
|
|
519
|
+
// Same live maps the changeset/scheduler routes use, so a host-started
|
|
520
|
+
// scheduler round-trips custom fields (#63) and reloads stay correct.
|
|
521
|
+
resolveChangesetType: buildChangesetTypeResolver(contentTypeMap, customTableMap),
|
|
499
522
|
};
|
|
500
523
|
}
|
|
501
524
|
//# sourceMappingURL=index.js.map
|