@forge-cms/runtime 0.0.1
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/LICENSE +21 -0
- package/README.md +14 -0
- package/dist/access.d.ts +30 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +64 -0
- package/dist/access.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +16 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/defaults.d.ts +20 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +73 -0
- package/dist/defaults.js.map +1 -0
- package/dist/describe.d.ts +54 -0
- package/dist/describe.d.ts.map +1 -0
- package/dist/describe.js +88 -0
- package/dist/describe.js.map +1 -0
- package/dist/errors.d.ts +39 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +68 -0
- package/dist/errors.js.map +1 -0
- package/dist/field-access.d.ts +14 -0
- package/dist/field-access.d.ts.map +1 -0
- package/dist/field-access.js +49 -0
- package/dist/field-access.js.map +1 -0
- package/dist/files.d.ts +24 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +46 -0
- package/dist/files.js.map +1 -0
- package/dist/globals.d.ts +24 -0
- package/dist/globals.d.ts.map +1 -0
- package/dist/globals.js +161 -0
- package/dist/globals.js.map +1 -0
- package/dist/handlers.d.ts +37 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +611 -0
- package/dist/handlers.js.map +1 -0
- package/dist/hooks.d.ts +60 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +193 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/localization.d.ts +52 -0
- package/dist/localization.d.ts.map +1 -0
- package/dist/localization.js +163 -0
- package/dist/localization.js.map +1 -0
- package/dist/operations.d.ts +70 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +402 -0
- package/dist/operations.js.map +1 -0
- package/dist/populate.d.ts +6 -0
- package/dist/populate.d.ts.map +1 -0
- package/dist/populate.js +65 -0
- package/dist/populate.js.map +1 -0
- package/dist/relation-integrity.d.ts +39 -0
- package/dist/relation-integrity.d.ts.map +1 -0
- package/dist/relation-integrity.js +150 -0
- package/dist/relation-integrity.js.map +1 -0
- package/dist/runtime.d.ts +61 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +155 -0
- package/dist/runtime.js.map +1 -0
- package/dist/versions.d.ts +51 -0
- package/dist/versions.d.ts.map +1 -0
- package/dist/versions.js +122 -0
- package/dist/versions.js.map +1 -0
- package/package.json +56 -0
package/dist/handlers.js
ADDED
|
@@ -0,0 +1,611 @@
|
|
|
1
|
+
import { getLogger } from '@forge-cms/core';
|
|
2
|
+
import { hasAnyRole } from '@forge-cms/auth';
|
|
3
|
+
import * as operations from './operations.js';
|
|
4
|
+
import { AccessDeniedError, InvalidInputError, InvalidQueryError, isForgeError, toApiErrorBody } from './errors.js';
|
|
5
|
+
const WHERE_OPERATORS = new Set(['eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'contains']);
|
|
6
|
+
const SYSTEM_SORT_FIELDS = new Set(['id', 'created_at', 'updated_at']);
|
|
7
|
+
const RESERVED_QUERY_PARAMS = new Set([
|
|
8
|
+
'limit',
|
|
9
|
+
'offset',
|
|
10
|
+
'sort',
|
|
11
|
+
'order',
|
|
12
|
+
'depth',
|
|
13
|
+
'status',
|
|
14
|
+
'locale'
|
|
15
|
+
]);
|
|
16
|
+
const WHERE_KEY_PATTERN = /^(.+)\[(\w+)\]$/;
|
|
17
|
+
const DEFAULT_LIMIT = 50;
|
|
18
|
+
const MAX_LIMIT = 500;
|
|
19
|
+
function jsonResponse(data, status = 200) {
|
|
20
|
+
return new Response(JSON.stringify(data), {
|
|
21
|
+
status,
|
|
22
|
+
headers: { 'content-type': 'application/json' }
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function errorResponse(code, message, status, details) {
|
|
26
|
+
return jsonResponse({ error: { code, message, ...(details !== undefined && { details }) } }, status);
|
|
27
|
+
}
|
|
28
|
+
function toErrorResponse(err, user) {
|
|
29
|
+
if (err instanceof AccessDeniedError && user === null) {
|
|
30
|
+
return errorResponse('UNAUTHORIZED', 'Unauthorized', 401);
|
|
31
|
+
}
|
|
32
|
+
if (isForgeError(err)) {
|
|
33
|
+
const body = toApiErrorBody(err);
|
|
34
|
+
return jsonResponse(body, err.status);
|
|
35
|
+
}
|
|
36
|
+
getLogger().error('Unexpected error in request handler', err);
|
|
37
|
+
return errorResponse('INTERNAL_ERROR', 'An unexpected error occurred', 500);
|
|
38
|
+
}
|
|
39
|
+
// --- request parsing -------------------------------------------------------------------------
|
|
40
|
+
function coerceScalar(collection, key, value) {
|
|
41
|
+
const field = collection.fields[key];
|
|
42
|
+
if (!field)
|
|
43
|
+
return value;
|
|
44
|
+
switch (field.kind) {
|
|
45
|
+
case 'number': {
|
|
46
|
+
const num = Number(value);
|
|
47
|
+
if (Number.isNaN(num))
|
|
48
|
+
throw new InvalidInputError(`Invalid filter value for field '${key}'`);
|
|
49
|
+
return num;
|
|
50
|
+
}
|
|
51
|
+
case 'boolean': {
|
|
52
|
+
if (value !== 'true' && value !== 'false') {
|
|
53
|
+
throw new InvalidInputError(`Invalid filter value for field '${key}'`);
|
|
54
|
+
}
|
|
55
|
+
return value === 'true';
|
|
56
|
+
}
|
|
57
|
+
default:
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function assertValidFilterField(collection, key) {
|
|
62
|
+
if (!SYSTEM_SORT_FIELDS.has(key) && !collection.fields[key]) {
|
|
63
|
+
throw new InvalidQueryError(`Unknown filter field '${key}' for collection '${collection.slug}'`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function parseWhere(collection, url) {
|
|
67
|
+
const where = {};
|
|
68
|
+
url.searchParams.forEach((value, rawKey) => {
|
|
69
|
+
if (RESERVED_QUERY_PARAMS.has(rawKey))
|
|
70
|
+
return;
|
|
71
|
+
const match = WHERE_KEY_PATTERN.exec(rawKey);
|
|
72
|
+
if (!match) {
|
|
73
|
+
assertValidFilterField(collection, rawKey);
|
|
74
|
+
where[rawKey] = coerceScalar(collection, rawKey, value);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const [, key, operator] = match;
|
|
78
|
+
if (!key || !operator || !WHERE_OPERATORS.has(operator)) {
|
|
79
|
+
throw new InvalidQueryError(`Invalid filter operator in '${rawKey}'`);
|
|
80
|
+
}
|
|
81
|
+
assertValidFilterField(collection, key);
|
|
82
|
+
if (operator === 'in') {
|
|
83
|
+
where[key] = {
|
|
84
|
+
...(isOperatorObject(where[key]) && where[key]),
|
|
85
|
+
in: value.split(',').map((v) => coerceScalar(collection, key, v))
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
else if (operator === 'eq') {
|
|
89
|
+
where[key] = coerceScalar(collection, key, value);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
where[key] = {
|
|
93
|
+
...(isOperatorObject(where[key]) && where[key]),
|
|
94
|
+
[operator]: coerceScalar(collection, key, value)
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
return where;
|
|
99
|
+
}
|
|
100
|
+
function isOperatorObject(value) {
|
|
101
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
102
|
+
}
|
|
103
|
+
function parseSort(collection, url) {
|
|
104
|
+
const sortParam = url.searchParams.get('sort');
|
|
105
|
+
if (!sortParam)
|
|
106
|
+
return {};
|
|
107
|
+
if (!SYSTEM_SORT_FIELDS.has(sortParam) && !collection.fields[sortParam]) {
|
|
108
|
+
throw new InvalidQueryError(`Unknown sort field '${sortParam}' for collection '${collection.slug}'`);
|
|
109
|
+
}
|
|
110
|
+
const orderParam = url.searchParams.get('order');
|
|
111
|
+
if (orderParam === null)
|
|
112
|
+
return { sort: sortParam };
|
|
113
|
+
if (orderParam !== 'asc' && orderParam !== 'desc') {
|
|
114
|
+
throw new InvalidQueryError(`Invalid sort order '${orderParam}', expected 'asc' or 'desc'`);
|
|
115
|
+
}
|
|
116
|
+
return { sort: sortParam, order: orderParam };
|
|
117
|
+
}
|
|
118
|
+
function parseDepth(url) {
|
|
119
|
+
const raw = url.searchParams.get('depth');
|
|
120
|
+
if (raw === null || raw === '0')
|
|
121
|
+
return 0;
|
|
122
|
+
if (raw === '1')
|
|
123
|
+
return 1;
|
|
124
|
+
throw new InvalidQueryError(`Invalid depth '${raw}', expected '0' or '1'`);
|
|
125
|
+
}
|
|
126
|
+
function parseStatus(url) {
|
|
127
|
+
const raw = url.searchParams.get('status');
|
|
128
|
+
if (raw === null)
|
|
129
|
+
return undefined;
|
|
130
|
+
if (raw === 'draft' || raw === 'published' || raw === 'all')
|
|
131
|
+
return raw;
|
|
132
|
+
throw new InvalidQueryError(`Invalid status '${raw}', expected 'draft', 'published', or 'all'`);
|
|
133
|
+
}
|
|
134
|
+
function parseLocale(url) {
|
|
135
|
+
const raw = url.searchParams.get('locale');
|
|
136
|
+
return raw ?? undefined;
|
|
137
|
+
}
|
|
138
|
+
function parseStrictInt(url, name, opts) {
|
|
139
|
+
if (!url.searchParams.has(name))
|
|
140
|
+
return undefined;
|
|
141
|
+
const raw = url.searchParams.get(name);
|
|
142
|
+
if (!/^-?\d+$/.test(raw)) {
|
|
143
|
+
throw new InvalidQueryError(`Invalid ${name} value '${raw}', expected an integer`);
|
|
144
|
+
}
|
|
145
|
+
const parsed = Number(raw);
|
|
146
|
+
if (!Number.isFinite(parsed)) {
|
|
147
|
+
throw new InvalidQueryError(`Invalid ${name} value '${raw}'`);
|
|
148
|
+
}
|
|
149
|
+
if (parsed < opts.min) {
|
|
150
|
+
throw new InvalidQueryError(`${name} must be >= ${opts.min}, got ${parsed}`);
|
|
151
|
+
}
|
|
152
|
+
if (opts.max !== undefined && parsed > opts.max) {
|
|
153
|
+
throw new InvalidQueryError(`${name} must be <= ${opts.max}, got ${parsed}`);
|
|
154
|
+
}
|
|
155
|
+
return parsed;
|
|
156
|
+
}
|
|
157
|
+
function parseLimit(url) {
|
|
158
|
+
return parseStrictInt(url, 'limit', { min: 0, max: MAX_LIMIT });
|
|
159
|
+
}
|
|
160
|
+
function parseOffset(url) {
|
|
161
|
+
return parseStrictInt(url, 'offset', { min: 0 });
|
|
162
|
+
}
|
|
163
|
+
async function authorize(context, runtime, allowedRoles) {
|
|
164
|
+
let user;
|
|
165
|
+
try {
|
|
166
|
+
user = await runtime.adapters.auth.requireAuth(context.request);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return { success: false, response: errorResponse('UNAUTHORIZED', 'Unauthorized', 401) };
|
|
170
|
+
}
|
|
171
|
+
if (allowedRoles !== undefined && !hasAnyRole(user, allowedRoles)) {
|
|
172
|
+
return { success: false, response: errorResponse('FORBIDDEN', 'Forbidden', 403) };
|
|
173
|
+
}
|
|
174
|
+
return { success: true, user };
|
|
175
|
+
}
|
|
176
|
+
async function resolveOptionalUser(context, runtime) {
|
|
177
|
+
try {
|
|
178
|
+
return await runtime.adapters.auth.requireAuth(context.request);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async function resolveRequest(context, options, operation, needsId) {
|
|
185
|
+
const { runtime, requireAuth: requireAuthFlag, allowedRoles } = options;
|
|
186
|
+
const collectionSlug = context.params?.['collection'];
|
|
187
|
+
if (!collectionSlug)
|
|
188
|
+
return errorResponse('INVALID_INPUT', 'Missing collection parameter', 400);
|
|
189
|
+
if (needsId && !context.params?.['id']) {
|
|
190
|
+
return errorResponse('INVALID_INPUT', 'Missing collection or id parameter', 400);
|
|
191
|
+
}
|
|
192
|
+
const collection = runtime.getCollection(collectionSlug);
|
|
193
|
+
if (!collection)
|
|
194
|
+
return errorResponse('NOT_FOUND', `Collection '${collectionSlug}' not found`, 404);
|
|
195
|
+
const routeRoles = collection.access?.[operation] === undefined ? allowedRoles : undefined;
|
|
196
|
+
const mustAuth = requireAuthFlag === true || routeRoles !== undefined;
|
|
197
|
+
let user = null;
|
|
198
|
+
if (mustAuth) {
|
|
199
|
+
const result = await authorize(context, runtime, routeRoles);
|
|
200
|
+
if (!result.success)
|
|
201
|
+
return result.response;
|
|
202
|
+
user = result.user;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
user = await resolveOptionalUser(context, runtime);
|
|
206
|
+
}
|
|
207
|
+
return { collection, collectionSlug, user };
|
|
208
|
+
}
|
|
209
|
+
// --- handlers --------------------------------------------------------------------------------
|
|
210
|
+
export async function handleList(context, options) {
|
|
211
|
+
const resolved = await resolveRequest(context, options, 'read', false);
|
|
212
|
+
if (resolved instanceof Response)
|
|
213
|
+
return resolved;
|
|
214
|
+
const { collection, collectionSlug, user } = resolved;
|
|
215
|
+
try {
|
|
216
|
+
const url = new URL(context.request.url);
|
|
217
|
+
const where = parseWhere(collection, url);
|
|
218
|
+
const { sort, order } = parseSort(collection, url);
|
|
219
|
+
const limit = parseLimit(url);
|
|
220
|
+
const offset = parseOffset(url);
|
|
221
|
+
const locale = parseLocale(url);
|
|
222
|
+
const result = await options.runtime.find({
|
|
223
|
+
collection: collectionSlug,
|
|
224
|
+
user,
|
|
225
|
+
overrideAccess: false,
|
|
226
|
+
depth: parseDepth(url),
|
|
227
|
+
...(Object.keys(where).length > 0 && { where }),
|
|
228
|
+
...(limit !== undefined && { limit }),
|
|
229
|
+
...(offset !== undefined && { offset }),
|
|
230
|
+
...(sort !== undefined && { sort }),
|
|
231
|
+
...(order !== undefined && { order }),
|
|
232
|
+
...(parseStatus(url) !== undefined && { status: parseStatus(url) }),
|
|
233
|
+
...(locale !== undefined && { locale })
|
|
234
|
+
});
|
|
235
|
+
return jsonResponse({
|
|
236
|
+
data: result.docs,
|
|
237
|
+
meta: {
|
|
238
|
+
collection: collectionSlug,
|
|
239
|
+
count: result.docs.length,
|
|
240
|
+
limit: result.limit,
|
|
241
|
+
offset: result.offset,
|
|
242
|
+
totalDocs: result.totalDocs,
|
|
243
|
+
page: result.page,
|
|
244
|
+
totalPages: result.totalPages,
|
|
245
|
+
hasNextPage: result.hasNextPage,
|
|
246
|
+
hasPrevPage: result.hasPrevPage
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
return toErrorResponse(err, user);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
export async function handleRead(context, options) {
|
|
255
|
+
const resolved = await resolveRequest(context, options, 'read', true);
|
|
256
|
+
if (resolved instanceof Response)
|
|
257
|
+
return resolved;
|
|
258
|
+
const { collectionSlug, user } = resolved;
|
|
259
|
+
try {
|
|
260
|
+
const url = new URL(context.request.url);
|
|
261
|
+
const status = parseStatus(url);
|
|
262
|
+
const locale = parseLocale(url);
|
|
263
|
+
const doc = await options.runtime.findByID({
|
|
264
|
+
collection: collectionSlug,
|
|
265
|
+
id: context.params['id'],
|
|
266
|
+
user,
|
|
267
|
+
overrideAccess: false,
|
|
268
|
+
depth: parseDepth(url),
|
|
269
|
+
...(status !== undefined && { status }),
|
|
270
|
+
...(locale !== undefined && { locale })
|
|
271
|
+
});
|
|
272
|
+
return jsonResponse({ data: doc });
|
|
273
|
+
}
|
|
274
|
+
catch (err) {
|
|
275
|
+
return toErrorResponse(err, user);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
async function buildMultipartBody(context, runtime, collection, uploadConfig) {
|
|
279
|
+
const formData = await context.request.formData();
|
|
280
|
+
const file = formData.get('file');
|
|
281
|
+
if (!(file instanceof File)) {
|
|
282
|
+
throw new InvalidInputError('Missing or invalid "file" part in multipart body');
|
|
283
|
+
}
|
|
284
|
+
if (uploadConfig?.maxFileSize !== undefined && file.size > uploadConfig.maxFileSize) {
|
|
285
|
+
throw new InvalidInputError(`File size ${file.size} exceeds maximum allowed size of ${uploadConfig.maxFileSize} bytes`);
|
|
286
|
+
}
|
|
287
|
+
if (uploadConfig?.mimeTypes !== undefined && uploadConfig.mimeTypes.length > 0) {
|
|
288
|
+
if (!uploadConfig.mimeTypes.includes(file.type)) {
|
|
289
|
+
throw new InvalidInputError(`File type '${file.type}' is not allowed. Allowed types: ${uploadConfig.mimeTypes.join(', ')}`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
const key = `${collection.slug}/${crypto.randomUUID()}-${file.name}`;
|
|
293
|
+
await runtime.adapters.storage.put({ key, body: file, contentType: file.type });
|
|
294
|
+
const url = await runtime.adapters.storage.getPublicUrl(key);
|
|
295
|
+
const data = { _storageKey: key };
|
|
296
|
+
const derived = {
|
|
297
|
+
filename: file.name,
|
|
298
|
+
url,
|
|
299
|
+
contentType: file.type,
|
|
300
|
+
filesize: file.size
|
|
301
|
+
};
|
|
302
|
+
for (const [name, value] of Object.entries(derived)) {
|
|
303
|
+
if (collection.fields[name])
|
|
304
|
+
data[name] = value;
|
|
305
|
+
}
|
|
306
|
+
formData.forEach((value, name) => {
|
|
307
|
+
if (name !== 'file' && typeof value === 'string' && collection.fields[name]) {
|
|
308
|
+
data[name] = value;
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
return { data, storageKey: key };
|
|
312
|
+
}
|
|
313
|
+
async function readJsonBody(request) {
|
|
314
|
+
try {
|
|
315
|
+
return (await request.json());
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
throw new InvalidInputError('Invalid JSON body');
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
export async function handleCreate(context, options) {
|
|
322
|
+
const resolved = await resolveRequest(context, options, 'create', false);
|
|
323
|
+
if (resolved instanceof Response)
|
|
324
|
+
return resolved;
|
|
325
|
+
const { collection, collectionSlug, user } = resolved;
|
|
326
|
+
try {
|
|
327
|
+
const contentType = context.request.headers.get('content-type') ?? '';
|
|
328
|
+
let data;
|
|
329
|
+
let storageKey;
|
|
330
|
+
if (collection.upload === true && contentType.includes('multipart/form-data')) {
|
|
331
|
+
const result = await buildMultipartBody(context, options.runtime, collection, options.upload);
|
|
332
|
+
data = result.data;
|
|
333
|
+
storageKey = result.storageKey;
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
data = await readJsonBody(context.request);
|
|
337
|
+
}
|
|
338
|
+
try {
|
|
339
|
+
const locale = parseLocale(new URL(context.request.url));
|
|
340
|
+
const doc = await options.runtime.create({
|
|
341
|
+
collection: collectionSlug,
|
|
342
|
+
data,
|
|
343
|
+
user,
|
|
344
|
+
overrideAccess: false,
|
|
345
|
+
...(locale !== undefined && { locale })
|
|
346
|
+
});
|
|
347
|
+
return jsonResponse({ data: doc }, 201);
|
|
348
|
+
}
|
|
349
|
+
catch (createErr) {
|
|
350
|
+
if (storageKey) {
|
|
351
|
+
try {
|
|
352
|
+
await options.runtime.adapters.storage.delete(storageKey);
|
|
353
|
+
}
|
|
354
|
+
catch (cleanupErr) {
|
|
355
|
+
getLogger().error(`Failed to clean up storage object '${storageKey}' after document creation failure`, cleanupErr);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
throw createErr;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
catch (err) {
|
|
362
|
+
return toErrorResponse(err, user);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
export async function handleUpdate(context, options) {
|
|
366
|
+
const resolved = await resolveRequest(context, options, 'update', true);
|
|
367
|
+
if (resolved instanceof Response)
|
|
368
|
+
return resolved;
|
|
369
|
+
const { collectionSlug, user } = resolved;
|
|
370
|
+
try {
|
|
371
|
+
const locale = parseLocale(new URL(context.request.url));
|
|
372
|
+
const doc = await options.runtime.update({
|
|
373
|
+
collection: collectionSlug,
|
|
374
|
+
id: context.params['id'],
|
|
375
|
+
data: await readJsonBody(context.request),
|
|
376
|
+
user,
|
|
377
|
+
overrideAccess: false,
|
|
378
|
+
...(locale !== undefined && { locale })
|
|
379
|
+
});
|
|
380
|
+
return jsonResponse({ data: doc });
|
|
381
|
+
}
|
|
382
|
+
catch (err) {
|
|
383
|
+
return toErrorResponse(err, user);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
export async function handleDelete(context, options) {
|
|
387
|
+
const resolved = await resolveRequest(context, options, 'delete', true);
|
|
388
|
+
if (resolved instanceof Response)
|
|
389
|
+
return resolved;
|
|
390
|
+
const { collection, collectionSlug, user } = resolved;
|
|
391
|
+
try {
|
|
392
|
+
const existing = collection.upload === true
|
|
393
|
+
? await options.runtime.adapters.database.findById(collectionSlug, context.params['id'])
|
|
394
|
+
: null;
|
|
395
|
+
await options.runtime.delete({
|
|
396
|
+
collection: collectionSlug,
|
|
397
|
+
id: context.params['id'],
|
|
398
|
+
user,
|
|
399
|
+
overrideAccess: false
|
|
400
|
+
});
|
|
401
|
+
if (existing && typeof existing.url === 'string') {
|
|
402
|
+
const storageKey = existing._storageKey ??
|
|
403
|
+
extractKeyFromUrl(existing.url, collectionSlug);
|
|
404
|
+
if (storageKey) {
|
|
405
|
+
try {
|
|
406
|
+
await options.runtime.adapters.storage.delete(storageKey);
|
|
407
|
+
}
|
|
408
|
+
catch (cleanupErr) {
|
|
409
|
+
getLogger().error(`Failed to clean up storage object '${storageKey}' after document deletion`, cleanupErr);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return new Response(null, { status: 204 });
|
|
414
|
+
}
|
|
415
|
+
catch (err) {
|
|
416
|
+
return toErrorResponse(err, user);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
function extractKeyFromUrl(url, collectionSlug) {
|
|
420
|
+
const prefix = `/api/media/${collectionSlug}/`;
|
|
421
|
+
const idx = url.indexOf(prefix);
|
|
422
|
+
if (idx === -1)
|
|
423
|
+
return null;
|
|
424
|
+
return url.slice(idx + '/api/media/'.length);
|
|
425
|
+
}
|
|
426
|
+
async function resolveGlobalRequest(context, options, operation) {
|
|
427
|
+
const { runtime, requireAuth: requireAuthFlag, allowedRoles } = options;
|
|
428
|
+
const globalSlug = context.params?.['global'];
|
|
429
|
+
if (!globalSlug)
|
|
430
|
+
return errorResponse('INVALID_INPUT', 'Missing global parameter', 400);
|
|
431
|
+
const global = runtime.getGlobal(globalSlug);
|
|
432
|
+
if (!global)
|
|
433
|
+
return errorResponse('NOT_FOUND', `Global '${globalSlug}' not found`, 404);
|
|
434
|
+
const routeRoles = global.access?.[operation] === undefined ? allowedRoles : undefined;
|
|
435
|
+
const mustAuth = requireAuthFlag === true || routeRoles !== undefined;
|
|
436
|
+
let user = null;
|
|
437
|
+
if (mustAuth) {
|
|
438
|
+
const result = await authorize(context, runtime, routeRoles);
|
|
439
|
+
if (!result.success)
|
|
440
|
+
return result.response;
|
|
441
|
+
user = result.user;
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
user = await resolveOptionalUser(context, runtime);
|
|
445
|
+
}
|
|
446
|
+
return { globalSlug, user };
|
|
447
|
+
}
|
|
448
|
+
export async function handleGlobalRead(context, options) {
|
|
449
|
+
const resolved = await resolveGlobalRequest(context, options, 'read');
|
|
450
|
+
if (resolved instanceof Response)
|
|
451
|
+
return resolved;
|
|
452
|
+
const { globalSlug, user } = resolved;
|
|
453
|
+
try {
|
|
454
|
+
const doc = await options.runtime.getGlobalDocument({
|
|
455
|
+
global: globalSlug,
|
|
456
|
+
user,
|
|
457
|
+
overrideAccess: false
|
|
458
|
+
});
|
|
459
|
+
if (!doc) {
|
|
460
|
+
return errorResponse('NOT_FOUND', `Global '${globalSlug}' has not been configured yet`, 404);
|
|
461
|
+
}
|
|
462
|
+
return jsonResponse({ data: doc });
|
|
463
|
+
}
|
|
464
|
+
catch (err) {
|
|
465
|
+
return toErrorResponse(err, user);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
export async function handleGlobalUpdate(context, options) {
|
|
469
|
+
const resolved = await resolveGlobalRequest(context, options, 'update');
|
|
470
|
+
if (resolved instanceof Response)
|
|
471
|
+
return resolved;
|
|
472
|
+
const { globalSlug, user } = resolved;
|
|
473
|
+
try {
|
|
474
|
+
const doc = await options.runtime.updateGlobalDocument({
|
|
475
|
+
global: globalSlug,
|
|
476
|
+
data: await readJsonBody(context.request),
|
|
477
|
+
user,
|
|
478
|
+
overrideAccess: false
|
|
479
|
+
});
|
|
480
|
+
return jsonResponse({ data: doc });
|
|
481
|
+
}
|
|
482
|
+
catch (err) {
|
|
483
|
+
return toErrorResponse(err, user);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
// --- versions -------------------------------------------------------------------------------
|
|
487
|
+
export async function handleListVersions(context, options) {
|
|
488
|
+
const resolved = await resolveRequest(context, options, 'read', true);
|
|
489
|
+
if (resolved instanceof Response)
|
|
490
|
+
return resolved;
|
|
491
|
+
const { collectionSlug, user } = resolved;
|
|
492
|
+
try {
|
|
493
|
+
const url = new URL(context.request.url);
|
|
494
|
+
const limit = parseLimit(url);
|
|
495
|
+
const offset = parseOffset(url);
|
|
496
|
+
const versions = await options.runtime.listVersions({
|
|
497
|
+
collection: collectionSlug,
|
|
498
|
+
documentId: context.params['id'],
|
|
499
|
+
user,
|
|
500
|
+
overrideAccess: false,
|
|
501
|
+
...(limit !== undefined && { limit }),
|
|
502
|
+
...(offset !== undefined && { offset })
|
|
503
|
+
});
|
|
504
|
+
return jsonResponse({ data: versions });
|
|
505
|
+
}
|
|
506
|
+
catch (err) {
|
|
507
|
+
return toErrorResponse(err, user);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
export async function handleGetVersion(context, options) {
|
|
511
|
+
const resolved = await resolveRequest(context, options, 'read', false);
|
|
512
|
+
if (resolved instanceof Response)
|
|
513
|
+
return resolved;
|
|
514
|
+
const { collectionSlug, user } = resolved;
|
|
515
|
+
try {
|
|
516
|
+
const versionId = context.params?.['versionId'];
|
|
517
|
+
if (!versionId) {
|
|
518
|
+
return errorResponse('INVALID_INPUT', 'Missing versionId parameter', 400);
|
|
519
|
+
}
|
|
520
|
+
const version = await options.runtime.getVersion({
|
|
521
|
+
collection: collectionSlug,
|
|
522
|
+
versionId,
|
|
523
|
+
user,
|
|
524
|
+
overrideAccess: false
|
|
525
|
+
});
|
|
526
|
+
return jsonResponse({ data: version });
|
|
527
|
+
}
|
|
528
|
+
catch (err) {
|
|
529
|
+
return toErrorResponse(err, user);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
export async function handleRestoreVersion(context, options) {
|
|
533
|
+
const resolved = await resolveRequest(context, options, 'update', false);
|
|
534
|
+
if (resolved instanceof Response)
|
|
535
|
+
return resolved;
|
|
536
|
+
const { collectionSlug, user } = resolved;
|
|
537
|
+
try {
|
|
538
|
+
const versionId = context.params?.['versionId'];
|
|
539
|
+
if (!versionId) {
|
|
540
|
+
return errorResponse('INVALID_INPUT', 'Missing versionId parameter', 400);
|
|
541
|
+
}
|
|
542
|
+
const record = await options.runtime.restoreVersion({
|
|
543
|
+
collection: collectionSlug,
|
|
544
|
+
versionId,
|
|
545
|
+
user,
|
|
546
|
+
overrideAccess: false
|
|
547
|
+
});
|
|
548
|
+
return jsonResponse({ data: record });
|
|
549
|
+
}
|
|
550
|
+
catch (err) {
|
|
551
|
+
return toErrorResponse(err, user);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Generates a preview of a document by merging stored data with unsaved changes.
|
|
556
|
+
* Useful for live preview in the admin UI before saving.
|
|
557
|
+
*/
|
|
558
|
+
export async function handlePreview(context, options) {
|
|
559
|
+
const collectionSlug = context.params?.['collection'];
|
|
560
|
+
if (!collectionSlug) {
|
|
561
|
+
return errorResponse('INVALID_INPUT', 'Missing collection parameter', 400);
|
|
562
|
+
}
|
|
563
|
+
const collection = options.runtime.getCollection(collectionSlug);
|
|
564
|
+
if (!collection) {
|
|
565
|
+
return errorResponse('NOT_FOUND', `Collection '${collectionSlug}' not found`, 404);
|
|
566
|
+
}
|
|
567
|
+
let user = null;
|
|
568
|
+
try {
|
|
569
|
+
user = await options.runtime.adapters.auth.requireAuth(context.request);
|
|
570
|
+
}
|
|
571
|
+
catch {
|
|
572
|
+
// Preview might be allowed without auth for draft preview
|
|
573
|
+
if (!options.allowDraftPreview) {
|
|
574
|
+
return errorResponse('UNAUTHORIZED', 'Unauthorized', 401);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
try {
|
|
578
|
+
const body = (await context.request.json().catch(() => ({})));
|
|
579
|
+
const documentId = context.params?.['id'];
|
|
580
|
+
const depth = parseDepth(new URL(context.request.url));
|
|
581
|
+
let previewData;
|
|
582
|
+
let existing = null;
|
|
583
|
+
if (documentId) {
|
|
584
|
+
// Preview existing document with changes
|
|
585
|
+
existing = await options.runtime.adapters.database.findById(collectionSlug, documentId);
|
|
586
|
+
if (!existing) {
|
|
587
|
+
return errorResponse('NOT_FOUND', `Document '${documentId}' not found`, 404);
|
|
588
|
+
}
|
|
589
|
+
previewData = { ...existing, ...body };
|
|
590
|
+
}
|
|
591
|
+
else {
|
|
592
|
+
// Preview new document
|
|
593
|
+
previewData = body;
|
|
594
|
+
}
|
|
595
|
+
// Apply field defaults and auto-slugs
|
|
596
|
+
const { applyFieldDefaults, applyAutoSlugs } = await import('./defaults.js');
|
|
597
|
+
previewData = applyAutoSlugs(collection, applyFieldDefaults(collection, previewData), existing ?? undefined);
|
|
598
|
+
// Populate relations if depth > 0
|
|
599
|
+
if (depth > 0) {
|
|
600
|
+
const { populateRecord } = await import('./populate.js');
|
|
601
|
+
previewData = await populateRecord(previewData, collection, options.runtime);
|
|
602
|
+
}
|
|
603
|
+
return jsonResponse({ data: previewData });
|
|
604
|
+
}
|
|
605
|
+
catch (err) {
|
|
606
|
+
return toErrorResponse(err, user);
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
export { operations };
|
|
610
|
+
export { DEFAULT_LIMIT, MAX_LIMIT };
|
|
611
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
|