@byline/core 0.9.3

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 (283) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +17 -0
  3. package/dist/@types/admin-types.d.ts +275 -0
  4. package/dist/@types/admin-types.d.ts.map +1 -0
  5. package/dist/@types/admin-types.js +18 -0
  6. package/dist/@types/admin-types.js.map +1 -0
  7. package/dist/@types/collection-types.d.ts +816 -0
  8. package/dist/@types/collection-types.d.ts.map +1 -0
  9. package/dist/@types/collection-types.js +217 -0
  10. package/dist/@types/collection-types.js.map +1 -0
  11. package/dist/@types/db-types.d.ts +463 -0
  12. package/dist/@types/db-types.d.ts.map +1 -0
  13. package/dist/@types/db-types.js +2 -0
  14. package/dist/@types/db-types.js.map +1 -0
  15. package/dist/@types/field-data-types.d.ts +147 -0
  16. package/dist/@types/field-data-types.d.ts.map +1 -0
  17. package/dist/@types/field-data-types.js +38 -0
  18. package/dist/@types/field-data-types.js.map +1 -0
  19. package/dist/@types/field-types.d.ts +579 -0
  20. package/dist/@types/field-types.d.ts.map +1 -0
  21. package/dist/@types/field-types.js +32 -0
  22. package/dist/@types/field-types.js.map +1 -0
  23. package/dist/@types/index.d.ts +18 -0
  24. package/dist/@types/index.d.ts.map +1 -0
  25. package/dist/@types/index.js +18 -0
  26. package/dist/@types/index.js.map +1 -0
  27. package/dist/@types/populate-types.d.ts +54 -0
  28. package/dist/@types/populate-types.d.ts.map +1 -0
  29. package/dist/@types/populate-types.js +9 -0
  30. package/dist/@types/populate-types.js.map +1 -0
  31. package/dist/@types/query-predicate.d.ts +74 -0
  32. package/dist/@types/query-predicate.d.ts.map +1 -0
  33. package/dist/@types/query-predicate.js +9 -0
  34. package/dist/@types/query-predicate.js.map +1 -0
  35. package/dist/@types/site-config.d.ts +212 -0
  36. package/dist/@types/site-config.d.ts.map +1 -0
  37. package/dist/@types/site-config.js +9 -0
  38. package/dist/@types/site-config.js.map +1 -0
  39. package/dist/@types/storage-types.d.ts +86 -0
  40. package/dist/@types/storage-types.d.ts.map +1 -0
  41. package/dist/@types/storage-types.js +9 -0
  42. package/dist/@types/storage-types.js.map +1 -0
  43. package/dist/@types/store-types.d.ts +134 -0
  44. package/dist/@types/store-types.d.ts.map +1 -0
  45. package/dist/@types/store-types.js +24 -0
  46. package/dist/@types/store-types.js.map +1 -0
  47. package/dist/@types/type-utils.d.ts +17 -0
  48. package/dist/@types/type-utils.d.ts.map +1 -0
  49. package/dist/@types/type-utils.js +9 -0
  50. package/dist/@types/type-utils.js.map +1 -0
  51. package/dist/auth/apply-before-read.d.ts +36 -0
  52. package/dist/auth/apply-before-read.d.ts.map +1 -0
  53. package/dist/auth/apply-before-read.js +68 -0
  54. package/dist/auth/apply-before-read.js.map +1 -0
  55. package/dist/auth/apply-before-read.test.node.d.ts +9 -0
  56. package/dist/auth/apply-before-read.test.node.d.ts.map +1 -0
  57. package/dist/auth/apply-before-read.test.node.js +144 -0
  58. package/dist/auth/apply-before-read.test.node.js.map +1 -0
  59. package/dist/auth/assert-actor-can-perform.d.ts +39 -0
  60. package/dist/auth/assert-actor-can-perform.d.ts.map +1 -0
  61. package/dist/auth/assert-actor-can-perform.js +64 -0
  62. package/dist/auth/assert-actor-can-perform.js.map +1 -0
  63. package/dist/auth/assert-actor-can-perform.test.node.d.ts +9 -0
  64. package/dist/auth/assert-actor-can-perform.test.node.d.ts.map +1 -0
  65. package/dist/auth/assert-actor-can-perform.test.node.js +119 -0
  66. package/dist/auth/assert-actor-can-perform.test.node.js.map +1 -0
  67. package/dist/auth/index.d.ts +11 -0
  68. package/dist/auth/index.d.ts.map +1 -0
  69. package/dist/auth/index.js +11 -0
  70. package/dist/auth/index.js.map +1 -0
  71. package/dist/auth/register-collection-abilities.d.ts +40 -0
  72. package/dist/auth/register-collection-abilities.d.ts.map +1 -0
  73. package/dist/auth/register-collection-abilities.js +87 -0
  74. package/dist/auth/register-collection-abilities.js.map +1 -0
  75. package/dist/auth/register-collection-abilities.test.node.d.ts +9 -0
  76. package/dist/auth/register-collection-abilities.test.node.d.ts.map +1 -0
  77. package/dist/auth/register-collection-abilities.test.node.js +124 -0
  78. package/dist/auth/register-collection-abilities.test.node.js.map +1 -0
  79. package/dist/config/config.d.ts +10 -0
  80. package/dist/config/config.d.ts.map +1 -0
  81. package/dist/config/config.js +108 -0
  82. package/dist/config/config.js.map +1 -0
  83. package/dist/config/routes.d.ts +16 -0
  84. package/dist/config/routes.d.ts.map +1 -0
  85. package/dist/config/routes.js +26 -0
  86. package/dist/config/routes.js.map +1 -0
  87. package/dist/config/validate-admin-configs.d.ts +33 -0
  88. package/dist/config/validate-admin-configs.d.ts.map +1 -0
  89. package/dist/config/validate-admin-configs.js +250 -0
  90. package/dist/config/validate-admin-configs.js.map +1 -0
  91. package/dist/config/validate-admin-configs.test.node.d.ts +9 -0
  92. package/dist/config/validate-admin-configs.test.node.d.ts.map +1 -0
  93. package/dist/config/validate-admin-configs.test.node.js +224 -0
  94. package/dist/config/validate-admin-configs.test.node.js.map +1 -0
  95. package/dist/config/validate-collections.d.ts +33 -0
  96. package/dist/config/validate-collections.d.ts.map +1 -0
  97. package/dist/config/validate-collections.js +70 -0
  98. package/dist/config/validate-collections.js.map +1 -0
  99. package/dist/config/validate-collections.test.node.d.ts +9 -0
  100. package/dist/config/validate-collections.test.node.d.ts.map +1 -0
  101. package/dist/config/validate-collections.test.node.js +149 -0
  102. package/dist/config/validate-collections.test.node.js.map +1 -0
  103. package/dist/core.d.ts +89 -0
  104. package/dist/core.d.ts.map +1 -0
  105. package/dist/core.js +99 -0
  106. package/dist/core.js.map +1 -0
  107. package/dist/defaults/default-values.d.ts +13 -0
  108. package/dist/defaults/default-values.d.ts.map +1 -0
  109. package/dist/defaults/default-values.js +60 -0
  110. package/dist/defaults/default-values.js.map +1 -0
  111. package/dist/index.d.ts +20 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +36 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/lib/errors.d.ts +98 -0
  116. package/dist/lib/errors.d.ts.map +1 -0
  117. package/dist/lib/errors.js +134 -0
  118. package/dist/lib/errors.js.map +1 -0
  119. package/dist/lib/logger.d.ts +62 -0
  120. package/dist/lib/logger.d.ts.map +1 -0
  121. package/dist/lib/logger.js +120 -0
  122. package/dist/lib/logger.js.map +1 -0
  123. package/dist/lib/registry.d.ts +65 -0
  124. package/dist/lib/registry.d.ts.map +1 -0
  125. package/dist/lib/registry.js +133 -0
  126. package/dist/lib/registry.js.map +1 -0
  127. package/dist/logger/index.d.ts +3 -0
  128. package/dist/logger/index.d.ts.map +1 -0
  129. package/dist/logger/index.js +3 -0
  130. package/dist/logger/index.js.map +1 -0
  131. package/dist/patches/apply-patches.d.ts +21 -0
  132. package/dist/patches/apply-patches.d.ts.map +1 -0
  133. package/dist/patches/apply-patches.js +357 -0
  134. package/dist/patches/apply-patches.js.map +1 -0
  135. package/dist/patches/index.d.ts +3 -0
  136. package/dist/patches/index.d.ts.map +1 -0
  137. package/dist/patches/index.js +4 -0
  138. package/dist/patches/index.js.map +1 -0
  139. package/dist/patches/patch-types.d.ts +82 -0
  140. package/dist/patches/patch-types.d.ts.map +1 -0
  141. package/dist/patches/patch-types.js +3 -0
  142. package/dist/patches/patch-types.js.map +1 -0
  143. package/dist/patches/patch.test.node.d.ts +2 -0
  144. package/dist/patches/patch.test.node.d.ts.map +1 -0
  145. package/dist/patches/patch.test.node.js +193 -0
  146. package/dist/patches/patch.test.node.js.map +1 -0
  147. package/dist/query/parse-where.d.ts +100 -0
  148. package/dist/query/parse-where.d.ts.map +1 -0
  149. package/dist/query/parse-where.js +352 -0
  150. package/dist/query/parse-where.js.map +1 -0
  151. package/dist/query/parse-where.test.node.d.ts +9 -0
  152. package/dist/query/parse-where.test.node.d.ts.map +1 -0
  153. package/dist/query/parse-where.test.node.js +581 -0
  154. package/dist/query/parse-where.test.node.js.map +1 -0
  155. package/dist/schemas/zod/builder.d.ts +466 -0
  156. package/dist/schemas/zod/builder.d.ts.map +1 -0
  157. package/dist/schemas/zod/builder.js +276 -0
  158. package/dist/schemas/zod/builder.js.map +1 -0
  159. package/dist/schemas/zod/cache.d.ts +14 -0
  160. package/dist/schemas/zod/cache.d.ts.map +1 -0
  161. package/dist/schemas/zod/cache.js +40 -0
  162. package/dist/schemas/zod/cache.js.map +1 -0
  163. package/dist/schemas/zod/index.d.ts +4 -0
  164. package/dist/schemas/zod/index.d.ts.map +1 -0
  165. package/dist/schemas/zod/index.js +4 -0
  166. package/dist/schemas/zod/index.js.map +1 -0
  167. package/dist/schemas/zod/types.d.ts +13 -0
  168. package/dist/schemas/zod/types.d.ts.map +1 -0
  169. package/dist/schemas/zod/types.js +2 -0
  170. package/dist/schemas/zod/types.js.map +1 -0
  171. package/dist/services/collection-bootstrap.d.ts +46 -0
  172. package/dist/services/collection-bootstrap.d.ts.map +1 -0
  173. package/dist/services/collection-bootstrap.js +108 -0
  174. package/dist/services/collection-bootstrap.js.map +1 -0
  175. package/dist/services/collection-bootstrap.test.node.d.ts +9 -0
  176. package/dist/services/collection-bootstrap.test.node.d.ts.map +1 -0
  177. package/dist/services/collection-bootstrap.test.node.js +208 -0
  178. package/dist/services/collection-bootstrap.test.node.js.map +1 -0
  179. package/dist/services/document-lifecycle.d.ts +245 -0
  180. package/dist/services/document-lifecycle.d.ts.map +1 -0
  181. package/dist/services/document-lifecycle.js +481 -0
  182. package/dist/services/document-lifecycle.js.map +1 -0
  183. package/dist/services/document-lifecycle.test.node.d.ts +9 -0
  184. package/dist/services/document-lifecycle.test.node.d.ts.map +1 -0
  185. package/dist/services/document-lifecycle.test.node.js +781 -0
  186. package/dist/services/document-lifecycle.test.node.js.map +1 -0
  187. package/dist/services/document-read.d.ts +26 -0
  188. package/dist/services/document-read.d.ts.map +1 -0
  189. package/dist/services/document-read.js +60 -0
  190. package/dist/services/document-read.js.map +1 -0
  191. package/dist/services/field-upload.d.ts +100 -0
  192. package/dist/services/field-upload.d.ts.map +1 -0
  193. package/dist/services/field-upload.js +328 -0
  194. package/dist/services/field-upload.js.map +1 -0
  195. package/dist/services/field-upload.test.node.d.ts +9 -0
  196. package/dist/services/field-upload.test.node.d.ts.map +1 -0
  197. package/dist/services/field-upload.test.node.js +337 -0
  198. package/dist/services/field-upload.test.node.js.map +1 -0
  199. package/dist/services/index.d.ts +10 -0
  200. package/dist/services/index.d.ts.map +1 -0
  201. package/dist/services/index.js +11 -0
  202. package/dist/services/index.js.map +1 -0
  203. package/dist/services/populate.d.ts +299 -0
  204. package/dist/services/populate.d.ts.map +1 -0
  205. package/dist/services/populate.js +484 -0
  206. package/dist/services/populate.js.map +1 -0
  207. package/dist/services/populate.test.node.d.ts +9 -0
  208. package/dist/services/populate.test.node.d.ts.map +1 -0
  209. package/dist/services/populate.test.node.js +910 -0
  210. package/dist/services/populate.test.node.js.map +1 -0
  211. package/dist/services/relation-projection.d.ts +52 -0
  212. package/dist/services/relation-projection.d.ts.map +1 -0
  213. package/dist/services/relation-projection.js +81 -0
  214. package/dist/services/relation-projection.js.map +1 -0
  215. package/dist/services/richtext-populate.d.ts +87 -0
  216. package/dist/services/richtext-populate.d.ts.map +1 -0
  217. package/dist/services/richtext-populate.js +189 -0
  218. package/dist/services/richtext-populate.js.map +1 -0
  219. package/dist/services/richtext-populate.test.node.d.ts +9 -0
  220. package/dist/services/richtext-populate.test.node.d.ts.map +1 -0
  221. package/dist/services/richtext-populate.test.node.js +197 -0
  222. package/dist/services/richtext-populate.test.node.js.map +1 -0
  223. package/dist/storage/collection-fingerprint.d.ts +21 -0
  224. package/dist/storage/collection-fingerprint.d.ts.map +1 -0
  225. package/dist/storage/collection-fingerprint.js +172 -0
  226. package/dist/storage/collection-fingerprint.js.map +1 -0
  227. package/dist/storage/collection-fingerprint.test.node.d.ts +9 -0
  228. package/dist/storage/collection-fingerprint.test.node.d.ts.map +1 -0
  229. package/dist/storage/collection-fingerprint.test.node.js +256 -0
  230. package/dist/storage/collection-fingerprint.test.node.js.map +1 -0
  231. package/dist/storage/field-store-map.d.ts +59 -0
  232. package/dist/storage/field-store-map.d.ts.map +1 -0
  233. package/dist/storage/field-store-map.js +75 -0
  234. package/dist/storage/field-store-map.js.map +1 -0
  235. package/dist/storage/field-store-map.test.node.d.ts +9 -0
  236. package/dist/storage/field-store-map.test.node.d.ts.map +1 -0
  237. package/dist/storage/field-store-map.test.node.js +117 -0
  238. package/dist/storage/field-store-map.test.node.js.map +1 -0
  239. package/dist/storage/index.d.ts +10 -0
  240. package/dist/storage/index.d.ts.map +1 -0
  241. package/dist/storage/index.js +10 -0
  242. package/dist/storage/index.js.map +1 -0
  243. package/dist/utils/normalise-dates.d.ts +15 -0
  244. package/dist/utils/normalise-dates.d.ts.map +1 -0
  245. package/dist/utils/normalise-dates.js +22 -0
  246. package/dist/utils/normalise-dates.js.map +1 -0
  247. package/dist/utils/slugify.d.ts +56 -0
  248. package/dist/utils/slugify.d.ts.map +1 -0
  249. package/dist/utils/slugify.js +91 -0
  250. package/dist/utils/slugify.js.map +1 -0
  251. package/dist/utils/slugify.test.node.d.ts +9 -0
  252. package/dist/utils/slugify.test.node.d.ts.map +1 -0
  253. package/dist/utils/slugify.test.node.js +86 -0
  254. package/dist/utils/slugify.test.node.js.map +1 -0
  255. package/dist/utils/storage-utils.d.ts +36 -0
  256. package/dist/utils/storage-utils.d.ts.map +1 -0
  257. package/dist/utils/storage-utils.js +38 -0
  258. package/dist/utils/storage-utils.js.map +1 -0
  259. package/dist/utils/utils.general.d.ts +64 -0
  260. package/dist/utils/utils.general.d.ts.map +1 -0
  261. package/dist/utils/utils.general.js +219 -0
  262. package/dist/utils/utils.general.js.map +1 -0
  263. package/dist/validation/index.d.ts +9 -0
  264. package/dist/validation/index.d.ts.map +1 -0
  265. package/dist/validation/index.js +9 -0
  266. package/dist/validation/index.js.map +1 -0
  267. package/dist/validation/shared.d.ts +36 -0
  268. package/dist/validation/shared.d.ts.map +1 -0
  269. package/dist/validation/shared.js +42 -0
  270. package/dist/validation/shared.js.map +1 -0
  271. package/dist/workflow/index.d.ts +2 -0
  272. package/dist/workflow/index.d.ts.map +1 -0
  273. package/dist/workflow/index.js +3 -0
  274. package/dist/workflow/index.js.map +1 -0
  275. package/dist/workflow/workflow.d.ts +40 -0
  276. package/dist/workflow/workflow.d.ts.map +1 -0
  277. package/dist/workflow/workflow.js +96 -0
  278. package/dist/workflow/workflow.js.map +1 -0
  279. package/dist/workflow/workflow.test.node.d.ts +2 -0
  280. package/dist/workflow/workflow.test.node.d.ts.map +1 -0
  281. package/dist/workflow/workflow.test.node.js +198 -0
  282. package/dist/workflow/workflow.test.node.js.map +1 -0
  283. package/package.json +88 -0
@@ -0,0 +1,481 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+ import { normalizeCollectionHook, } from '../@types/index.js';
9
+ import { assertActorCanPerform } from '../auth/assert-actor-can-perform.js';
10
+ import { ERR_CONFLICT, ERR_INVALID_TRANSITION, ERR_NOT_FOUND, ERR_PATCH_FAILED, ERR_VALIDATION, } from '../lib/errors.js';
11
+ import { withLogContext } from '../lib/logger.js';
12
+ import { applyPatches } from '../patches/index.js';
13
+ import { normaliseDateFields } from '../utils/normalise-dates.js';
14
+ import { slugify } from '../utils/slugify.js';
15
+ import { getUploadFields } from '../utils/storage-utils.js';
16
+ import { getDefaultStatus, getWorkflow, validateStatusTransition } from '../workflow/workflow.js';
17
+ // ---------------------------------------------------------------------------
18
+ // Internal helpers
19
+ // ---------------------------------------------------------------------------
20
+ /**
21
+ * Safely invoke an optional hook slot, awaiting the result if it returns a
22
+ * Promise. When the slot is an array of functions they are executed
23
+ * sequentially in order.
24
+ */
25
+ async function invokeHook(hook, ctx) {
26
+ const fns = normalizeCollectionHook(hook);
27
+ for (const fn of fns) {
28
+ await fn(ctx);
29
+ }
30
+ }
31
+ /** Extract `id` from the document object returned by `createDocumentVersion`. */
32
+ function extractVersionId(document) {
33
+ return document?.id ?? document?.document_version_id ?? '';
34
+ }
35
+ /** Extract the logical document id from the document object returned by `createDocumentVersion`. */
36
+ function extractDocumentId(document) {
37
+ return document?.document_id ?? '';
38
+ }
39
+ /**
40
+ * Derive a `documentVersions.path` value at create time.
41
+ *
42
+ * 1. `definition.useAsPath` set → slugify the named source field's value
43
+ * in the default content locale.
44
+ * 2. Source field absent / empty → fall back to `crypto.randomUUID()`.
45
+ *
46
+ * Caller passes explicit overrides separately; this helper only handles
47
+ * the auto-derivation cascade.
48
+ */
49
+ function derivePath(definition, data, defaultLocale, slugifier) {
50
+ if (definition.useAsPath != null) {
51
+ const sourceValue = data[definition.useAsPath];
52
+ if (sourceValue != null) {
53
+ const asString = sourceValue instanceof Date ? sourceValue.toISOString() : String(sourceValue);
54
+ if (asString.length > 0) {
55
+ const slug = slugifier(asString, {
56
+ locale: defaultLocale,
57
+ collectionPath: definition.path,
58
+ });
59
+ if (slug.length > 0)
60
+ return slug;
61
+ }
62
+ }
63
+ }
64
+ return crypto.randomUUID();
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // Lifecycle functions
68
+ // ---------------------------------------------------------------------------
69
+ /**
70
+ * Create a new document.
71
+ *
72
+ * Flow:
73
+ * 1. Default-locale enforcement: reject if `params.locale` is anything
74
+ * other than the configured default content locale (a brand-new
75
+ * document's canonical `path` lives in the default locale).
76
+ * 2. `normaliseDateFields(data)`
77
+ * 3. `hooks.beforeCreate({ data, collectionPath })`
78
+ * 4. Resolve `path` — explicit `params.path` → derive via `useAsPath`
79
+ * → UUID fallback.
80
+ * 5. `db.commands.documents.createDocumentVersion(...)` (action = 'create')
81
+ * 6. `hooks.afterCreate({ data, collectionPath, documentId, documentVersionId })`
82
+ */
83
+ export async function createDocument(ctx, params) {
84
+ return withLogContext({ domain: 'services', module: 'lifecycle', function: 'createDocument' }, async () => {
85
+ const { db, definition, collectionId, collectionPath, defaultLocale } = ctx;
86
+ assertActorCanPerform(ctx.requestContext, collectionPath, 'create');
87
+ const slugifier = ctx.slugifier ?? slugify;
88
+ const hooks = definition.hooks;
89
+ const data = params.data;
90
+ if (params.locale != null && params.locale !== defaultLocale) {
91
+ throw ERR_VALIDATION({
92
+ message: `documents must be created in the default content locale ('${defaultLocale}'); received '${params.locale}'. Create the default-locale version first, then add localised versions via update.`,
93
+ details: { defaultLocale, providedLocale: params.locale, collectionPath },
94
+ }).log(ctx.logger);
95
+ }
96
+ normaliseDateFields(data);
97
+ await invokeHook(hooks?.beforeCreate, { data, collectionPath });
98
+ const explicitPath = typeof params.path === 'string' && params.path.length > 0 ? params.path : null;
99
+ const resolvedPath = explicitPath ?? derivePath(definition, data, defaultLocale, slugifier);
100
+ const result = await db.commands.documents.createDocumentVersion({
101
+ collectionId,
102
+ collectionVersion: ctx.collectionVersion,
103
+ collectionConfig: definition,
104
+ action: 'create',
105
+ documentData: data,
106
+ path: resolvedPath,
107
+ status: params.status ?? data.status,
108
+ locale: params.locale ?? defaultLocale,
109
+ });
110
+ const documentId = extractDocumentId(result.document);
111
+ const documentVersionId = extractVersionId(result.document);
112
+ await invokeHook(hooks?.afterCreate, {
113
+ data,
114
+ collectionPath,
115
+ documentId,
116
+ documentVersionId,
117
+ });
118
+ return { documentId, documentVersionId };
119
+ });
120
+ }
121
+ /**
122
+ * Update a document via full replacement (PUT semantics).
123
+ *
124
+ * Unlike the previous implementation, this now fetches the current version
125
+ * from storage to provide a real `originalData` to hooks.
126
+ *
127
+ * Flow:
128
+ * 1. Fetch current document via `getDocumentById({ reconstruct: true })`
129
+ * 2. `normaliseDateFields(data)`
130
+ * 3. `hooks.beforeUpdate({ data, originalData, collectionPath })`
131
+ * 4. `db.commands.documents.createDocumentVersion(...)` (action = 'update')
132
+ * 5. `hooks.afterUpdate({ data, originalData, collectionPath, documentId, documentVersionId })`
133
+ */
134
+ export async function updateDocument(ctx, params) {
135
+ return withLogContext({ domain: 'services', module: 'lifecycle', function: 'updateDocument' }, async () => {
136
+ const { db, definition, collectionId, collectionPath, defaultLocale } = ctx;
137
+ assertActorCanPerform(ctx.requestContext, collectionPath, 'update');
138
+ const hooks = definition.hooks;
139
+ const data = params.data;
140
+ // Fetch the real original so hooks get accurate originalData (fixes the
141
+ // PUT handler bug where originalData === data).
142
+ const latest = await db.queries.documents.getDocumentById({
143
+ collection_id: collectionId,
144
+ document_id: params.documentId,
145
+ locale: params.locale ?? defaultLocale,
146
+ reconstruct: true,
147
+ });
148
+ const originalData = latest ?? {};
149
+ normaliseDateFields(data);
150
+ await invokeHook(hooks?.beforeUpdate, { data, originalData, collectionPath });
151
+ const defaultStatus = getDefaultStatus(definition);
152
+ const explicitPath = typeof params.path === 'string' && params.path.length > 0 ? params.path : null;
153
+ const resolvedPath = explicitPath ?? originalData.path ?? crypto.randomUUID();
154
+ const result = await db.commands.documents.createDocumentVersion({
155
+ documentId: params.documentId,
156
+ collectionId,
157
+ collectionVersion: ctx.collectionVersion,
158
+ collectionConfig: definition,
159
+ action: 'update',
160
+ documentData: data,
161
+ path: resolvedPath,
162
+ status: defaultStatus,
163
+ locale: params.locale ?? defaultLocale,
164
+ previousVersionId: originalData.document_version_id,
165
+ });
166
+ const documentId = extractDocumentId(result.document) || params.documentId;
167
+ const documentVersionId = extractVersionId(result.document);
168
+ await invokeHook(hooks?.afterUpdate, {
169
+ data,
170
+ originalData,
171
+ collectionPath,
172
+ documentId,
173
+ documentVersionId,
174
+ });
175
+ return { documentId, documentVersionId };
176
+ });
177
+ }
178
+ /**
179
+ * Update a document via patch application.
180
+ *
181
+ * Flow:
182
+ * 1. Fetch current document via `getDocumentById({ reconstruct: true })`
183
+ * 2. Optimistic concurrency check on `documentVersionId`
184
+ * 3. `applyPatches(definition, originalData, patches)` → `nextData`
185
+ * 4. `normaliseDateFields(nextData)`
186
+ * 5. `hooks.beforeUpdate({ data: nextData, originalData, collectionPath })`
187
+ * 6. `db.commands.documents.createDocumentVersion(...)` (action = 'update')
188
+ * 7. `hooks.afterUpdate({ data: nextData, originalData, collectionPath, documentId, documentVersionId })`
189
+ *
190
+ * @throws {BylineError} ERR_CONFLICT if the supplied `documentVersionId` does not match the current version.
191
+ * @throws {BylineError} ERR_PATCH_FAILED if `applyPatches` fails.
192
+ */
193
+ export async function updateDocumentWithPatches(ctx, params) {
194
+ return withLogContext({ domain: 'services', module: 'lifecycle', function: 'updateDocumentWithPatches' }, async () => {
195
+ const { db, definition, collectionId, collectionPath, defaultLocale } = ctx;
196
+ assertActorCanPerform(ctx.requestContext, collectionPath, 'update');
197
+ const hooks = definition.hooks;
198
+ // 1. Fetch current document.
199
+ const latest = await db.queries.documents.getDocumentById({
200
+ collection_id: collectionId,
201
+ document_id: params.documentId,
202
+ locale: params.locale ?? defaultLocale,
203
+ reconstruct: true,
204
+ });
205
+ if (latest == null) {
206
+ throw ERR_NOT_FOUND({
207
+ message: 'document not found',
208
+ details: { documentId: params.documentId },
209
+ }).log(ctx.logger);
210
+ }
211
+ const originalData = latest;
212
+ // 2. Optimistic concurrency check.
213
+ if (params.documentVersionId &&
214
+ params.documentVersionId !== originalData.document_version_id) {
215
+ throw ERR_CONFLICT({
216
+ message: 'document has been modified since you loaded it',
217
+ details: {
218
+ currentVersionId: originalData.document_version_id,
219
+ yourVersionId: params.documentVersionId,
220
+ },
221
+ }).log(ctx.logger);
222
+ }
223
+ // 3. Apply patches (patches operate on flat field data, not the full envelope).
224
+ const { doc: patchedDocument, errors } = applyPatches(definition, originalData.fields ?? {}, params.patches);
225
+ if (errors.length > 0) {
226
+ throw ERR_PATCH_FAILED({
227
+ message: `failed to apply patches: ${errors.map((e) => e.message).join('; ')}`,
228
+ details: { errors },
229
+ }).log(ctx.logger);
230
+ }
231
+ const nextData = patchedDocument;
232
+ // 4. Normalise dates.
233
+ normaliseDateFields(nextData);
234
+ // 5. beforeUpdate hook.
235
+ await invokeHook(hooks?.beforeUpdate, { data: nextData, originalData, collectionPath });
236
+ // 6. Persist.
237
+ const defaultStatus = getDefaultStatus(definition);
238
+ const explicitPath = typeof params.path === 'string' && params.path.length > 0 ? params.path : null;
239
+ const resolvedPath = explicitPath ?? originalData.path ?? crypto.randomUUID();
240
+ const result = await db.commands.documents.createDocumentVersion({
241
+ documentId: params.documentId,
242
+ collectionId,
243
+ collectionVersion: ctx.collectionVersion,
244
+ collectionConfig: definition,
245
+ action: 'update',
246
+ documentData: nextData,
247
+ path: resolvedPath,
248
+ status: defaultStatus,
249
+ locale: params.locale ?? defaultLocale,
250
+ previousVersionId: originalData.document_version_id,
251
+ });
252
+ const documentId = extractDocumentId(result.document) || params.documentId;
253
+ const documentVersionId = extractVersionId(result.document);
254
+ // 7. afterUpdate hook.
255
+ await invokeHook(hooks?.afterUpdate, {
256
+ data: nextData,
257
+ originalData,
258
+ collectionPath,
259
+ documentId,
260
+ documentVersionId,
261
+ });
262
+ return { documentId, documentVersionId };
263
+ });
264
+ }
265
+ /**
266
+ * Change a document's workflow status.
267
+ *
268
+ * Flow:
269
+ * 1. Fetch current document metadata
270
+ * 2. Validate transition via `validateStatusTransition()`
271
+ * 3. `hooks.beforeStatusChange({ documentId, documentVersionId, collectionPath, previousStatus, nextStatus })`
272
+ * 4. `db.commands.documents.setDocumentStatus(...)` — in-place mutation
273
+ * 5. Auto-archive: if transitioning to `'published'`, archive other published versions
274
+ * 6. `hooks.afterStatusChange({ documentId, documentVersionId, collectionPath, previousStatus, nextStatus })`
275
+ */
276
+ export async function changeDocumentStatus(ctx, params) {
277
+ return withLogContext({ domain: 'services', module: 'lifecycle', function: 'changeDocumentStatus' }, async () => {
278
+ const { db, definition, collectionId, collectionPath } = ctx;
279
+ // Every transition requires the general changeStatus ability.
280
+ // Transitions that target the `published` status additionally
281
+ // require the narrower `publish` ability — so installations can
282
+ // grant "move things through the workflow" without also granting
283
+ // "flip the final publish switch".
284
+ assertActorCanPerform(ctx.requestContext, collectionPath, 'changeStatus');
285
+ if (params.nextStatus === 'published') {
286
+ assertActorCanPerform(ctx.requestContext, collectionPath, 'publish');
287
+ }
288
+ // Single-status workflows (e.g. SINGLE_STATUS_WORKFLOW for lookups)
289
+ // have no transitions to perform. Reject early with a clear message
290
+ // rather than relying on the generic ±1-step validator.
291
+ const workflow = getWorkflow(definition);
292
+ if (workflow.statuses.length <= 1) {
293
+ throw ERR_INVALID_TRANSITION({
294
+ message: `collection '${collectionPath}' has a single-status workflow; status transitions are not supported`,
295
+ details: { collectionPath, nextStatus: params.nextStatus },
296
+ }).log(ctx.logger);
297
+ }
298
+ const hooks = definition.hooks;
299
+ // 1. Fetch current version metadata. No field reconstruction needed —
300
+ // status transitions only touch the document_versions.status column.
301
+ const latest = await db.queries.documents.getCurrentVersionMetadata({
302
+ collection_id: collectionId,
303
+ document_id: params.documentId,
304
+ });
305
+ if (latest == null) {
306
+ throw ERR_NOT_FOUND({
307
+ message: 'document not found',
308
+ details: { documentId: params.documentId },
309
+ }).log(ctx.logger);
310
+ }
311
+ const currentStatus = latest.status ?? 'draft';
312
+ const documentVersionId = latest.document_version_id;
313
+ // 2. Validate transition.
314
+ const result = validateStatusTransition(workflow, currentStatus, params.nextStatus);
315
+ if (!result.valid) {
316
+ throw ERR_INVALID_TRANSITION({
317
+ message: result.reason ??
318
+ `invalid status transition from '${currentStatus}' to '${params.nextStatus}'`,
319
+ details: { currentStatus, nextStatus: params.nextStatus },
320
+ }).log(ctx.logger);
321
+ }
322
+ const hookCtx = {
323
+ documentId: params.documentId,
324
+ documentVersionId,
325
+ collectionPath,
326
+ previousStatus: currentStatus,
327
+ nextStatus: params.nextStatus,
328
+ };
329
+ // 3. beforeStatusChange hook.
330
+ await invokeHook(hooks?.beforeStatusChange, hookCtx);
331
+ // 4. Mutate status in-place.
332
+ await db.commands.documents.setDocumentStatus({
333
+ document_version_id: documentVersionId,
334
+ status: params.nextStatus,
335
+ });
336
+ // 5. Auto-archive previous published versions.
337
+ if (params.nextStatus === 'published') {
338
+ await db.commands.documents.archivePublishedVersions({
339
+ document_id: params.documentId,
340
+ excludeVersionId: documentVersionId,
341
+ });
342
+ }
343
+ // 6. afterStatusChange hook.
344
+ await invokeHook(hooks?.afterStatusChange, hookCtx);
345
+ return { previousStatus: currentStatus, newStatus: params.nextStatus };
346
+ });
347
+ }
348
+ /**
349
+ * Unpublish a document by archiving its published version(s).
350
+ *
351
+ * Flow:
352
+ * 1. `hooks.beforeUnpublish({ documentId, collectionPath })`
353
+ * 2. `db.commands.documents.archivePublishedVersions(...)`
354
+ * 3. `hooks.afterUnpublish({ documentId, collectionPath, archivedCount })`
355
+ */
356
+ export async function unpublishDocument(ctx, params) {
357
+ return withLogContext({ domain: 'services', module: 'lifecycle', function: 'unpublishDocument' }, async () => {
358
+ const { db, collectionPath, definition } = ctx;
359
+ // Unpublish is a workflow transition out of `published` — reuse the
360
+ // changeStatus gate rather than a separate ability.
361
+ assertActorCanPerform(ctx.requestContext, collectionPath, 'changeStatus');
362
+ // Single-status workflows have nothing to unpublish to.
363
+ const workflow = getWorkflow(definition);
364
+ if (workflow.statuses.length <= 1) {
365
+ throw ERR_INVALID_TRANSITION({
366
+ message: `collection '${collectionPath}' has a single-status workflow; unpublish is not supported`,
367
+ details: { collectionPath },
368
+ }).log(ctx.logger);
369
+ }
370
+ const hooks = definition.hooks;
371
+ await invokeHook(hooks?.beforeUnpublish, {
372
+ documentId: params.documentId,
373
+ collectionPath,
374
+ });
375
+ const archivedCount = await db.commands.documents.archivePublishedVersions({
376
+ document_id: params.documentId,
377
+ });
378
+ await invokeHook(hooks?.afterUnpublish, {
379
+ documentId: params.documentId,
380
+ collectionPath,
381
+ archivedCount,
382
+ });
383
+ return { archivedCount };
384
+ });
385
+ }
386
+ /**
387
+ * Soft-delete a document.
388
+ *
389
+ * Marks all versions of the document as deleted (`is_deleted = true`). The
390
+ * `current_documents` view automatically filters deleted rows, so the
391
+ * document disappears from all list / page queries without physically
392
+ * removing data.
393
+ *
394
+ * When the collection has any upload-capable image/file field and
395
+ * `ctx.storage` is provided, every original file and persisted variant
396
+ * across those fields is also removed from storage after the DB
397
+ * soft-delete succeeds. Variant paths are read from the field value's
398
+ * `variants` array (no re-derivation from `upload.sizes`), so cleanup
399
+ * stays correct even if the size set changed between upload and delete.
400
+ * File cleanup failures are logged but are non-fatal.
401
+ *
402
+ * Flow:
403
+ * 1. Fetch current document (reconstruct when upload-capable fields exist)
404
+ * 2. `hooks.beforeDelete({ documentId, collectionPath })`
405
+ * 3. `db.commands.documents.softDeleteDocument({ document_id })`
406
+ * 4. Storage file + variant cleanup (skipped when no upload fields, non-fatal)
407
+ * 5. `hooks.afterDelete({ documentId, collectionPath })`
408
+ */
409
+ export async function deleteDocument(ctx, params) {
410
+ return withLogContext({ domain: 'services', module: 'lifecycle', function: 'deleteDocument' }, async () => {
411
+ const { db, collectionPath, definition, logger } = ctx;
412
+ assertActorCanPerform(ctx.requestContext, collectionPath, 'delete');
413
+ const hooks = definition.hooks;
414
+ // 1. Verify the document exists.
415
+ // For collections that have any upload-capable image/file field
416
+ // AND a storage provider, fetch with reconstruct: true so we
417
+ // can read the stored file paths (and persisted variant paths)
418
+ // from the field values before the DB rows are deleted.
419
+ const uploadFieldNames = getUploadFields(definition).map((f) => f.name);
420
+ const isUploadCollection = uploadFieldNames.length > 0 && ctx.storage != null;
421
+ const latest = await db.queries.documents.getDocumentById({
422
+ collection_id: ctx.collectionId,
423
+ document_id: params.documentId,
424
+ reconstruct: isUploadCollection,
425
+ });
426
+ if (latest == null) {
427
+ throw ERR_NOT_FOUND({
428
+ message: 'document not found',
429
+ details: { documentId: params.documentId },
430
+ }).log(ctx.logger);
431
+ }
432
+ // Collect storage paths for every upload-capable field on the doc:
433
+ // the original file plus every persisted variant. Reading the
434
+ // variants from the field value (rather than re-deriving from
435
+ // `upload.sizes`) keeps cleanup correct even when the size set
436
+ // changes between upload and delete.
437
+ const storagePathsToDelete = [];
438
+ if (isUploadCollection) {
439
+ for (const fieldName of uploadFieldNames) {
440
+ const fieldValue = latest?.fields?.[fieldName];
441
+ if (!fieldValue || typeof fieldValue !== 'object')
442
+ continue;
443
+ if (typeof fieldValue.storagePath === 'string') {
444
+ storagePathsToDelete.push(fieldValue.storagePath);
445
+ }
446
+ if (Array.isArray(fieldValue.variants)) {
447
+ for (const variant of fieldValue.variants) {
448
+ if (variant && typeof variant.storagePath === 'string') {
449
+ storagePathsToDelete.push(variant.storagePath);
450
+ }
451
+ }
452
+ }
453
+ }
454
+ }
455
+ const hookCtx = {
456
+ documentId: params.documentId,
457
+ collectionPath,
458
+ };
459
+ // 2. beforeDelete hook.
460
+ await invokeHook(hooks?.beforeDelete, hookCtx);
461
+ // 3. Soft-delete all versions.
462
+ const deletedVersionCount = await db.commands.documents.softDeleteDocument({
463
+ document_id: params.documentId,
464
+ });
465
+ // 4. Clean up storage files. Non-fatal: logs errors but does not throw.
466
+ if (ctx.storage && storagePathsToDelete.length > 0) {
467
+ for (const storagePath of storagePathsToDelete) {
468
+ try {
469
+ await ctx.storage.delete(storagePath);
470
+ }
471
+ catch (err) {
472
+ logger.error({ err, storagePath }, 'failed to delete storage file');
473
+ }
474
+ }
475
+ }
476
+ // 5. afterDelete hook.
477
+ await invokeHook(hooks?.afterDelete, hookCtx);
478
+ return { deletedVersionCount };
479
+ });
480
+ }
481
+ //# sourceMappingURL=document-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-lifecycle.js","sourceRoot":"","sources":["../../src/services/document-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=document-lifecycle.test.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-lifecycle.test.node.d.ts","sourceRoot":"","sources":["../../src/services/document-lifecycle.test.node.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}