@forge-cms/runtime 0.5.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.
Files changed (63) hide show
  1. package/dist/auth-managed.d.ts +19 -0
  2. package/dist/auth-managed.d.ts.map +1 -0
  3. package/dist/auth-managed.js +24 -0
  4. package/dist/auth-managed.js.map +1 -0
  5. package/dist/concurrency.d.ts +8 -0
  6. package/dist/concurrency.d.ts.map +1 -0
  7. package/dist/concurrency.js +15 -0
  8. package/dist/concurrency.js.map +1 -0
  9. package/dist/context.d.ts +5 -0
  10. package/dist/context.d.ts.map +1 -1
  11. package/dist/errors.d.ts +29 -1
  12. package/dist/errors.d.ts.map +1 -1
  13. package/dist/errors.js +38 -0
  14. package/dist/errors.js.map +1 -1
  15. package/dist/files.d.ts +15 -1
  16. package/dist/files.d.ts.map +1 -1
  17. package/dist/files.js +55 -14
  18. package/dist/files.js.map +1 -1
  19. package/dist/globals.d.ts +21 -3
  20. package/dist/globals.d.ts.map +1 -1
  21. package/dist/globals.js +216 -28
  22. package/dist/globals.js.map +1 -1
  23. package/dist/handlers.d.ts +3 -2
  24. package/dist/handlers.d.ts.map +1 -1
  25. package/dist/handlers.js +36 -47
  26. package/dist/handlers.js.map +1 -1
  27. package/dist/index.d.ts +3 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +4 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/localization.d.ts +17 -0
  32. package/dist/localization.d.ts.map +1 -1
  33. package/dist/localization.js +56 -0
  34. package/dist/localization.js.map +1 -1
  35. package/dist/operations.d.ts +51 -12
  36. package/dist/operations.d.ts.map +1 -1
  37. package/dist/operations.js +728 -125
  38. package/dist/operations.js.map +1 -1
  39. package/dist/relation-integrity.d.ts +31 -13
  40. package/dist/relation-integrity.d.ts.map +1 -1
  41. package/dist/relation-integrity.js +62 -6
  42. package/dist/relation-integrity.js.map +1 -1
  43. package/dist/relation-lifecycle.d.ts +95 -0
  44. package/dist/relation-lifecycle.d.ts.map +1 -0
  45. package/dist/relation-lifecycle.js +424 -0
  46. package/dist/relation-lifecycle.js.map +1 -0
  47. package/dist/runtime.d.ts +21 -0
  48. package/dist/runtime.d.ts.map +1 -1
  49. package/dist/runtime.js +112 -20
  50. package/dist/runtime.js.map +1 -1
  51. package/dist/storage-intents.d.ts +96 -0
  52. package/dist/storage-intents.d.ts.map +1 -0
  53. package/dist/storage-intents.js +217 -0
  54. package/dist/storage-intents.js.map +1 -0
  55. package/dist/system-fields.d.ts +27 -0
  56. package/dist/system-fields.d.ts.map +1 -0
  57. package/dist/system-fields.js +74 -0
  58. package/dist/system-fields.js.map +1 -0
  59. package/dist/versions.d.ts +73 -1
  60. package/dist/versions.d.ts.map +1 -1
  61. package/dist/versions.js +204 -17
  62. package/dist/versions.js.map +1 -1
  63. package/package.json +9 -7
package/dist/globals.js CHANGED
@@ -1,12 +1,55 @@
1
1
  import { validateCollection } from '@forge-cms/core';
2
- import { AccessDeniedError, ForgeError, InvalidInputError, NotFoundError, ValidationFailedError } from './errors.js';
2
+ import { isAtomicWriteConditionError, isUniqueConstraintError as isDbUniqueConstraintError } from '@forge-cms/db';
3
+ import { AccessDeniedError, ConcurrentModificationError, ForgeError, InvalidInputError, NotFoundError, ValidationFailedError } from './errors.js';
3
4
  import { documentMatches, resolveAccess } from './access.js';
4
- import { applyFieldDefaults } from './defaults.js';
5
+ import { afterStamp } from './concurrency.js';
6
+ import { applyAutoSlugs, applyFieldDefaults } from './defaults.js';
5
7
  import { statusConstraint } from './read-policy.js';
6
8
  import { populateRecord } from './populate.js';
7
9
  import { runAfterChangeHooks, runAfterOperationHooks, runAfterReadHooks, runBeforeChangeHooks, runBeforeOperationHooks, runBeforeValidateHooks, runFieldHooks } from './hooks.js';
8
10
  import { assertWritableFields, filterReadableFields, FieldAccessError } from './field-access.js';
11
+ import { screenHookOutput, screenUpdateInput } from './system-fields.js';
12
+ import { isLocalizedField, resolveLocalizedDocument, storeLocalizedDocument } from './localization.js';
13
+ import { collectWrittenTargets, targetAssertions, verifyTargetsExist } from './relation-lifecycle.js';
9
14
  const GLOBAL_ID = 'global';
15
+ /**
16
+ * The global options that exist on the shared collection types but can never apply to a singleton that
17
+ * is never created through `create` nor deleted (spec 066): delete hooks, and `create`/`delete` access
18
+ * rules. Refused at startup instead of being accepted and silently ignored. One message per problem.
19
+ * (Localized fields of globals are checked with collections', by `validateLocalizationSchema`.)
20
+ */
21
+ export function validateGlobalSchema(globals) {
22
+ const errors = [];
23
+ for (const global of globals) {
24
+ const label = `Global '${global.slug}'`;
25
+ for (const hook of ['beforeDelete', 'afterDelete']) {
26
+ if ((global.hooks?.[hook]?.length ?? 0) > 0) {
27
+ errors.push(`${label} declares ${hook} hooks, but a global is never deleted, so they could never run (spec 066). Remove them.`);
28
+ }
29
+ }
30
+ for (const rule of ['create', 'delete']) {
31
+ if (global.access?.[rule] !== undefined) {
32
+ errors.push(`${label} declares access.${rule}, but a global only has read and update: its first write is ` +
33
+ `an update and it is never deleted, so this rule could never apply (spec 066). Gate the ` +
34
+ `first write with access.update.`);
35
+ }
36
+ }
37
+ }
38
+ return errors;
39
+ }
40
+ /** The collection-shaped view of a global the shared pipeline stages (hooks, validation, locales) take. */
41
+ function proxyOf(global) {
42
+ return { ...global, upload: false };
43
+ }
44
+ function assertKnownLocale(global, locale) {
45
+ if (locale === undefined)
46
+ return;
47
+ if (!global.locales?.includes(locale)) {
48
+ throw new InvalidInputError(global.locales && global.locales.length > 0
49
+ ? `Unknown locale '${locale}' for global '${global.slug}'; expected one of ${global.locales.map((l) => `'${l}'`).join(', ')}`
50
+ : `Global '${global.slug}' is not localized; locale '${locale}' cannot be written`);
51
+ }
52
+ }
10
53
  function getGlobalOrThrow(ctx, slug) {
11
54
  const global = ctx.getGlobal(slug);
12
55
  if (!global)
@@ -44,7 +87,7 @@ async function prepareGlobalForRead(ctx, global, record, args) {
44
87
  return null;
45
88
  const user = args.user ?? null;
46
89
  const overrideAccess = args.overrideAccess !== false;
47
- const collectionProxy = { ...global, upload: false };
90
+ const collectionProxy = proxyOf(global);
48
91
  let doc = record;
49
92
  if (args.depth === 1) {
50
93
  doc = await populateRecord(doc, collectionProxy, ctx, {
@@ -55,6 +98,9 @@ async function prepareGlobalForRead(ctx, global, record, args) {
55
98
  if (args.overrideAccess === false) {
56
99
  doc = await filterReadableFields(doc, collectionProxy, user);
57
100
  }
101
+ if (args.locale !== undefined) {
102
+ doc = resolveLocalizedDocument(doc, collectionProxy, args.locale);
103
+ }
58
104
  const withFieldHooks = await runFieldHooks(collectionProxy, 'afterRead', {
59
105
  data: doc,
60
106
  operation: 'read',
@@ -71,8 +117,19 @@ export async function getGlobal(ctx, args) {
71
117
  const user = args.user ?? null;
72
118
  const overrideAccess = args.overrideAccess !== false;
73
119
  await runBeforeOperationHooks({ ...global, upload: false }, { operation: 'read', user, overrideAccess });
74
- await checkGlobalAccess(global, 'read', args);
120
+ const decision = await checkGlobalAccess(global, 'read', args);
75
121
  const record = await ctx.adapters.database.findById(`_global_${global.slug}`, GLOBAL_ID);
122
+ // Spec 066: a query-returning read rule is a row-level grant, as on a collection read. A global row
123
+ // it does not match reads as `null` — the same answer as "never configured", confirming nothing.
124
+ if (record && decision.where && !documentMatches(record, decision.where)) {
125
+ await runAfterOperationHooks(proxyOf(global), {
126
+ operation: 'read',
127
+ user,
128
+ overrideAccess,
129
+ result: null
130
+ });
131
+ return null;
132
+ }
76
133
  // Draft visibility (spec 058 §8): a global was previously written but never gated its own
77
134
  // `_status` on read, so an anonymous caller could read a global's unpublished draft content the
78
135
  // exact same way an anonymous single-document read of a `drafts: true` collection cannot. Mirrors
@@ -94,23 +151,39 @@ export async function getGlobal(ctx, args) {
94
151
  return doc;
95
152
  }
96
153
  /**
97
- * Creates or updates the singleton global document. Unlike collections, globals always have
98
- * exactly one document — the first write creates it, subsequent writes update it.
154
+ * Creates or updates the singleton global document. Unlike collections, globals always have exactly one
155
+ * document — the first write creates it, later writes update it.
156
+ *
157
+ * Later writes are **partial**, exactly like a collection `update()` (spec 066): omitted fields keep
158
+ * their stored values (defaults and the draft status apply to the first write only), validation runs on
159
+ * the merged document, and a `locale` write changes that locale of each `localized` field and keeps the
160
+ * others. A query-returning `access.update` rule must match the stored row, and cannot authorize the
161
+ * first write (there is no row to match). Two simultaneous first writes: one commits, the other gets
162
+ * `409 CONCURRENT_MODIFICATION` with nothing written.
99
163
  */
100
164
  export async function updateGlobal(ctx, args) {
101
165
  const global = getGlobalOrThrow(ctx, args.global);
102
166
  const user = args.user ?? null;
103
167
  const overrideAccess = args.overrideAccess !== false;
104
- const collectionProxy = { ...global, upload: false };
168
+ const collectionProxy = proxyOf(global);
169
+ assertKnownLocale(global, args.locale);
105
170
  await runBeforeOperationHooks(collectionProxy, { operation: 'update', user, overrideAccess });
106
171
  const existing = await ctx.adapters.database.findById(`_global_${global.slug}`, GLOBAL_ID);
107
- await checkGlobalAccess(global, 'update', {
172
+ const operation = existing ? 'update' : 'create';
173
+ const decision = await checkGlobalAccess(global, 'update', {
108
174
  ...args,
109
175
  ...(existing !== null && { doc: existing })
110
176
  });
177
+ if (decision.where && !(existing && documentMatches(existing, decision.where))) {
178
+ throw new AccessDeniedError();
179
+ }
180
+ // Spec 063: a global row's `id`/timestamps/`_storageKey` belong to Forge. Echoes of the stored row
181
+ // are dropped; before the first write there is nothing to echo, so any of them is refused.
182
+ const stored = existing ?? {};
183
+ const input = screenUpdateInput(args.data, stored);
111
184
  if (args.overrideAccess === false) {
112
185
  try {
113
- await assertWritableFields(args.data, collectionProxy, user, existing ? 'update' : 'create');
186
+ await assertWritableFields(input, collectionProxy, user, operation);
114
187
  }
115
188
  catch (err) {
116
189
  if (err instanceof FieldAccessError)
@@ -118,33 +191,61 @@ export async function updateGlobal(ctx, args) {
118
191
  throw err;
119
192
  }
120
193
  }
121
- const seeded = applyFieldDefaults(collectionProxy, args.data);
194
+ // A locale write merges into the stored per-locale maps, so it is derived from `existing` and must
195
+ // commit only while the row is still the one it was merged from (compare-and-set below).
196
+ const localized = storeLocalizedDocument(input, collectionProxy, args.locale, existing ?? undefined);
197
+ const mergesLocales = existing !== null &&
198
+ args.locale !== undefined &&
199
+ Object.keys(input).some((name) => {
200
+ const field = global.fields[name];
201
+ return field !== undefined && isLocalizedField(field);
202
+ });
203
+ const seeded = existing
204
+ ? applyAutoSlugs(collectionProxy, localized, existing)
205
+ : applyAutoSlugs(collectionProxy, applyFieldDefaults(collectionProxy, localized));
122
206
  let data = await runRejectableStage(async () => runBeforeValidateHooks(collectionProxy, {
123
- operation: existing ? 'update' : 'create',
207
+ operation,
124
208
  data: await runFieldHooks(collectionProxy, 'beforeValidate', {
125
209
  data: seeded,
126
- operation: existing ? 'update' : 'create',
210
+ ...(existing !== null && { previousData: existing }),
211
+ operation,
127
212
  user,
128
213
  overrideAccess
129
214
  }),
215
+ ...(existing !== null && { previousData: existing }),
130
216
  user,
131
217
  overrideAccess
132
218
  }), 'beforeValidate hook');
133
- if (global.drafts === true && data._status === undefined) {
219
+ data = screenHookOutput(data, stored, 'beforeValidate', `global '${global.slug}'`);
220
+ if (global.drafts === true && !existing && data._status === undefined) {
134
221
  data = { ...data, _status: 'draft' };
135
222
  }
136
223
  if (data._status !== undefined && data._status !== 'draft' && data._status !== 'published') {
137
224
  throw new InvalidInputError(`Invalid status '${String(data._status)}', expected 'draft' or 'published'`);
138
225
  }
139
- const validation = validateCollection(collectionProxy, data);
140
- if (!validation.valid)
141
- throw new ValidationFailedError(validation.errors);
226
+ if (existing) {
227
+ // As a collection update: validate the merged document, report only what the caller can act on.
228
+ const validation = validateCollection(collectionProxy, { ...existing, ...data });
229
+ if (!validation.valid) {
230
+ const relevant = validation.errors.filter((e) => {
231
+ const top = e.field.split('.')[0] ?? e.field;
232
+ return data[top] !== undefined || existing[top] === undefined;
233
+ });
234
+ if (relevant.length > 0)
235
+ throw new ValidationFailedError(relevant);
236
+ }
237
+ }
238
+ else {
239
+ const validation = validateCollection(collectionProxy, data);
240
+ if (!validation.valid)
241
+ throw new ValidationFailedError(validation.errors);
242
+ }
142
243
  data = await runRejectableStage(async () => runBeforeChangeHooks(collectionProxy, {
143
- operation: existing ? 'update' : 'create',
244
+ operation,
144
245
  data: await runFieldHooks(collectionProxy, 'beforeChange', {
145
246
  data,
146
247
  ...(existing !== null && { previousData: existing }),
147
- operation: existing ? 'update' : 'create',
248
+ operation,
148
249
  user,
149
250
  overrideAccess
150
251
  }),
@@ -152,16 +253,22 @@ export async function updateGlobal(ctx, args) {
152
253
  user,
153
254
  overrideAccess
154
255
  }), 'beforeChange hook');
155
- const globalCollection = `_global_${global.slug}`;
156
- let record;
157
- if (existing) {
158
- record = await ctx.adapters.database.update(globalCollection, GLOBAL_ID, data);
159
- }
160
- else {
161
- record = await ctx.adapters.database.create(globalCollection, { ...data, id: GLOBAL_ID });
162
- }
256
+ data = screenHookOutput(data, stored, 'beforeChange', `global '${global.slug}'`);
257
+ // A global's relation/upload targets must exist, now and when it commits (spec 064 §4) — a global
258
+ // reference restricts deletion of its target, so it must never be written pointing at nothing.
259
+ const targets = collectWrittenTargets(global.fields, data, existing ?? undefined);
260
+ if (targets.size > 0)
261
+ await verifyTargetsExist(ctx, targets);
262
+ const record = await writeGlobal(ctx, {
263
+ global,
264
+ data,
265
+ existing,
266
+ compareAndSet: mergesLocales,
267
+ accessWhere: decision.where,
268
+ assertions: targets.size > 0 ? targetAssertions(targets) : []
269
+ });
163
270
  await runAfterChangeHooks(collectionProxy, {
164
- operation: existing ? 'update' : 'create',
271
+ operation,
165
272
  data,
166
273
  ...(existing !== null && { previousData: existing }),
167
274
  result: record,
@@ -169,7 +276,9 @@ export async function updateGlobal(ctx, args) {
169
276
  user,
170
277
  overrideAccess
171
278
  });
172
- const doc = await prepareGlobalForRead(ctx, global, record, args);
279
+ // Being allowed to write the global is not permission to read it back (spec 068).
280
+ const readable = args.overrideAccess !== false || (await canReadGlobal(global, record, user));
281
+ const doc = readable ? await prepareGlobalForRead(ctx, global, record, args) : { id: GLOBAL_ID };
173
282
  const result = doc ?? record;
174
283
  await runAfterOperationHooks(collectionProxy, {
175
284
  operation: 'update',
@@ -179,4 +288,83 @@ export async function updateGlobal(ctx, args) {
179
288
  });
180
289
  return result;
181
290
  }
291
+ /** The read gate `getGlobal` applies, as a yes/no for the row just written. */
292
+ async function canReadGlobal(global, record, user) {
293
+ let decision;
294
+ try {
295
+ decision = await checkGlobalAccess(global, 'read', { user, overrideAccess: false });
296
+ }
297
+ catch (err) {
298
+ if (err instanceof AccessDeniedError)
299
+ return false;
300
+ throw err;
301
+ }
302
+ if (decision.where && !documentMatches(record, decision.where))
303
+ return false;
304
+ const status = statusConstraint(proxyOf(global), undefined, user, false, 'all');
305
+ return !status || documentMatches(record, status);
306
+ }
307
+ /**
308
+ * Persists a prepared global write. The first write is a `create` of the fixed `global` row: of two
309
+ * simultaneous first writers, the row's primary key lets exactly one commit, and the other becomes a
310
+ * `409` instead of leaking the internal table's unique-constraint error (spec 066). A write carrying
311
+ * relation-target assertions (spec 064 §4), or a locale merge that must not overwrite a concurrent one
312
+ * (`compareAndSet`, on `updated_at`), is one `atomicWrite`; a failed condition is a `409`, nothing written.
313
+ */
314
+ async function writeGlobal(ctx, input) {
315
+ const { global, data, existing, assertions } = input;
316
+ const table = `_global_${global.slug}`;
317
+ const database = ctx.adapters.database;
318
+ const concurrent = (message) => new ConcurrentModificationError(global.slug, GLOBAL_ID, message);
319
+ const conditions = [
320
+ ...(input.compareAndSet && existing ? [{ updated_at: existing.updated_at }] : []),
321
+ ...(input.accessWhere !== undefined ? [input.accessWhere] : [])
322
+ ];
323
+ const condition = conditions.length === 0
324
+ ? undefined
325
+ : conditions.length === 1
326
+ ? conditions[0]
327
+ : { and: conditions };
328
+ const write = !existing
329
+ ? { type: 'create', collection: table, data: { ...data, id: GLOBAL_ID } }
330
+ : condition !== undefined
331
+ ? {
332
+ type: 'updateIf',
333
+ collection: table,
334
+ id: GLOBAL_ID,
335
+ data,
336
+ condition: { targetMatches: condition },
337
+ requireApplied: true
338
+ }
339
+ : { type: 'update', collection: table, id: GLOBAL_ID, data };
340
+ if (input.compareAndSet && existing)
341
+ await afterStamp(existing.updated_at);
342
+ try {
343
+ if (assertions.length === 0 && write.type === 'create') {
344
+ return await database.create(table, write.data);
345
+ }
346
+ if (assertions.length === 0 && write.type === 'update') {
347
+ return await database.update(table, GLOBAL_ID, write.data);
348
+ }
349
+ const results = await database.atomicWrite([...assertions, write]);
350
+ const written = results[assertions.length];
351
+ if (written?.type === 'create' || written?.type === 'update')
352
+ return written.record;
353
+ if (written?.type === 'updateIf' && written.applied)
354
+ return written.record;
355
+ throw new Error('atomicWrite returned no global record');
356
+ }
357
+ catch (err) {
358
+ if (!existing && isDbUniqueConstraintError(err) && err.collection === table) {
359
+ throw concurrent(`Global '${global.slug}' was first written by another request at the same time; nothing was ` +
360
+ `written. Reload and try again.`);
361
+ }
362
+ if (isAtomicWriteConditionError(err)) {
363
+ throw concurrent(`Global '${global.slug}' was changed by another request while this write was in progress (another ` +
364
+ `locale was edited, it no longer matches the caller's update access, or a document it references ` +
365
+ `was deleted); nothing was written. Reload and try again.`);
366
+ }
367
+ throw err;
368
+ }
369
+ }
182
370
  //# sourceMappingURL=globals.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"globals.js","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"globals.js","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { ApiContext } from '@forge-cms/api';
2
- import type { AnyForgeCmsRuntime } from './runtime.js';
3
- import type { UserRole } from '@forge-cms/auth';
2
+ import type { AnyForgeCmsRuntime, ForgeCmsRuntime } from './runtime.js';
3
+ import type { AuthUser, UserRole } from '@forge-cms/auth';
4
4
  import * as operations from './operations.js';
5
5
  declare const DEFAULT_LIMIT = 50;
6
6
  declare const MAX_LIMIT = 500;
@@ -13,6 +13,7 @@ export interface HandlerOptions<TEnv = unknown> {
13
13
  mimeTypes?: string[];
14
14
  };
15
15
  }
16
+ export declare function resolveOptionalUser<TEnv>(context: ApiContext<TEnv>, runtime: ForgeCmsRuntime<TEnv>): Promise<AuthUser | null>;
16
17
  export declare function handleList<TEnv = unknown>(context: ApiContext<TEnv>, options: HandlerOptions<TEnv>): Promise<Response>;
17
18
  export declare function handleRead<TEnv = unknown>(context: ApiContext<TEnv>, options: HandlerOptions<TEnv>): Promise<Response>;
18
19
  export declare function handleCreate<TEnv = unknown>(context: ApiContext<TEnv>, options: HandlerOptions<TEnv>): Promise<Response>;
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
package/dist/handlers.js CHANGED
@@ -3,6 +3,7 @@ import { ForgeAuthError, hasAnyRole } from '@forge-cms/auth';
3
3
  import * as operations from './operations.js';
4
4
  import { AccessDeniedError, InvalidInputError, InvalidQueryError, isForgeError, toApiErrorBody } from './errors.js';
5
5
  import { assertCsrfSafe } from './csrf.js';
6
+ import { assertNotAuthManaged } from './auth-managed.js';
6
7
  const WHERE_OPERATORS = new Set([
7
8
  'eq',
8
9
  'ne',
@@ -240,7 +241,7 @@ async function authorize(context, runtime, allowedRoles) {
240
241
  }
241
242
  return { success: true, user };
242
243
  }
243
- async function resolveOptionalUser(context, runtime) {
244
+ export async function resolveOptionalUser(context, runtime) {
244
245
  try {
245
246
  return await runtime.adapters.auth.requireAuth(context.request);
246
247
  }
@@ -361,7 +362,12 @@ export async function handleRead(context, options) {
361
362
  return toErrorResponse(err, user);
362
363
  }
363
364
  }
364
- async function buildMultipartBody(context, runtime, collection, uploadConfig) {
365
+ /**
366
+ * Parses a multipart create: the `file` part (checked against the handler's size/type limits) and every
367
+ * other string part that names a declared field. Storing the object is the Local API's job
368
+ * (`operations.uploadFile`), so its durable lifecycle lives in one place (spec 067).
369
+ */
370
+ async function parseMultipartBody(context, collection, uploadConfig) {
365
371
  const formData = await context.request.formData();
366
372
  const file = formData.get('file');
367
373
  if (!(file instanceof File)) {
@@ -375,26 +381,13 @@ async function buildMultipartBody(context, runtime, collection, uploadConfig) {
375
381
  throw new InvalidInputError(`File type '${file.type}' is not allowed. Allowed types: ${uploadConfig.mimeTypes.join(', ')}`);
376
382
  }
377
383
  }
378
- const key = `${collection.slug}/${crypto.randomUUID()}-${file.name}`;
379
- await runtime.adapters.storage.put({ key, body: file, contentType: file.type });
380
- const url = await runtime.adapters.storage.getPublicUrl(key);
381
- const data = { _storageKey: key };
382
- const derived = {
383
- filename: file.name,
384
- url,
385
- contentType: file.type,
386
- filesize: file.size
387
- };
388
- for (const [name, value] of Object.entries(derived)) {
389
- if (collection.fields[name])
390
- data[name] = value;
391
- }
384
+ const fields = {};
392
385
  formData.forEach((value, name) => {
393
386
  if (name !== 'file' && typeof value === 'string' && collection.fields[name]) {
394
- data[name] = value;
387
+ fields[name] = value;
395
388
  }
396
389
  });
397
- return { data, storageKey: key };
390
+ return { file, fields };
398
391
  }
399
392
  async function readJsonBody(request) {
400
393
  try {
@@ -410,39 +403,31 @@ export async function handleCreate(context, options) {
410
403
  return resolved;
411
404
  const { collection, collectionSlug, user } = resolved;
412
405
  try {
406
+ // Checked before any multipart parsing so a create on an auth-managed upload-enabled collection
407
+ // (`operations.create` would refuse it anyway) never uploads an object to storage first — spec 061,
408
+ // reviewed finding: refusing only inside `runtime.create` left a real, if compensated, storage
409
+ // write on the happy path, and an orphaned object if the compensating delete itself failed.
410
+ assertNotAuthManaged(options.runtime, collectionSlug);
413
411
  const contentType = context.request.headers.get('content-type') ?? '';
414
- let data;
415
- let storageKey;
412
+ const locale = parseLocale(new URL(context.request.url));
413
+ const createArgs = {
414
+ collection: collectionSlug,
415
+ user,
416
+ overrideAccess: false,
417
+ ...(locale !== undefined && { locale })
418
+ };
419
+ let doc;
416
420
  if (collection.upload === true && contentType.includes('multipart/form-data')) {
417
- const result = await buildMultipartBody(context, options.runtime, collection, options.upload);
418
- data = result.data;
419
- storageKey = result.storageKey;
421
+ const { file, fields } = await parseMultipartBody(context, collection, options.upload);
422
+ doc = await operations.uploadFile(options.runtime, { ...createArgs, data: fields }, file);
420
423
  }
421
424
  else {
422
- data = await readJsonBody(context.request);
423
- }
424
- try {
425
- const locale = parseLocale(new URL(context.request.url));
426
- const doc = await options.runtime.create({
427
- collection: collectionSlug,
428
- data,
429
- user,
430
- overrideAccess: false,
431
- ...(locale !== undefined && { locale })
425
+ doc = await options.runtime.create({
426
+ ...createArgs,
427
+ data: await readJsonBody(context.request)
432
428
  });
433
- return jsonResponse({ data: doc }, 201);
434
- }
435
- catch (createErr) {
436
- if (storageKey) {
437
- try {
438
- await options.runtime.adapters.storage.delete(storageKey);
439
- }
440
- catch (cleanupErr) {
441
- getLogger().error(`Failed to clean up storage object '${storageKey}' after document creation failure`, cleanupErr);
442
- }
443
- }
444
- throw createErr;
445
429
  }
430
+ return jsonResponse({ data: doc }, 201);
446
431
  }
447
432
  catch (err) {
448
433
  return toErrorResponse(err, user);
@@ -524,10 +509,12 @@ export async function handleGlobalRead(context, options) {
524
509
  return resolved;
525
510
  const { globalSlug, user } = resolved;
526
511
  try {
512
+ const locale = parseLocale(new URL(context.request.url));
527
513
  const doc = await options.runtime.getGlobalDocument({
528
514
  global: globalSlug,
529
515
  user,
530
- overrideAccess: false
516
+ overrideAccess: false,
517
+ ...(locale !== undefined && { locale })
531
518
  });
532
519
  if (!doc) {
533
520
  return errorResponse('NOT_FOUND', `Global '${globalSlug}' has not been configured yet`, 404);
@@ -544,11 +531,13 @@ export async function handleGlobalUpdate(context, options) {
544
531
  return resolved;
545
532
  const { globalSlug, user } = resolved;
546
533
  try {
534
+ const locale = parseLocale(new URL(context.request.url));
547
535
  const doc = await options.runtime.updateGlobalDocument({
548
536
  global: globalSlug,
549
537
  data: await readJsonBody(context.request),
550
538
  user,
551
- overrideAccess: false
539
+ overrideAccess: false,
540
+ ...(locale !== undefined && { locale })
552
541
  });
553
542
  return jsonResponse({ data: doc });
554
543
  }