@aphexcms/cms-core 8.1.0 → 9.1.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 (290) hide show
  1. package/dist/api/api-keys.d.ts +8 -3
  2. package/dist/api/api-keys.d.ts.map +1 -1
  3. package/dist/api/schemas/assets.js +1 -1
  4. package/dist/api/schemas/documents.d.ts +0 -2
  5. package/dist/api/schemas/documents.d.ts.map +1 -1
  6. package/dist/api/schemas/documents.js +2 -8
  7. package/dist/api/schemas/instance.d.ts +6 -0
  8. package/dist/api/schemas/instance.d.ts.map +1 -0
  9. package/dist/api/schemas/instance.js +7 -0
  10. package/dist/api/schemas/user.js +1 -1
  11. package/dist/auth/auth-hooks.d.ts.map +1 -1
  12. package/dist/auth/auth-hooks.js +9 -3
  13. package/dist/cli/generate-types.d.ts.map +1 -1
  14. package/dist/cli/generate-types.js +198 -11
  15. package/dist/cli/generate-types.js.map +1 -1
  16. package/dist/components/AdminApp.svelte +55 -149
  17. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  18. package/dist/components/admin/DocumentEditor.svelte +282 -253
  19. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
  20. package/dist/components/admin/DocumentVersionPanel.svelte +3 -2
  21. package/dist/components/admin/DocumentVersionPanel.svelte.d.ts.map +1 -1
  22. package/dist/components/admin/MediaBrowser.svelte +29 -11
  23. package/dist/components/admin/MediaBrowser.svelte.d.ts.map +1 -1
  24. package/dist/components/admin/ObjectModal.svelte +62 -75
  25. package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -1
  26. package/dist/components/admin/SchemaField.svelte +2 -2
  27. package/dist/components/admin/fields/ArrayField.svelte +13 -3
  28. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
  29. package/dist/components/admin/fields/FileField.svelte +1 -1
  30. package/dist/components/admin/fields/ImageField.svelte +1 -1
  31. package/dist/components/admin/fields/ReferenceField.svelte +42 -11
  32. package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -1
  33. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte +116 -0
  34. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts +12 -0
  35. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts.map +1 -0
  36. package/dist/components/admin/fields/richtext/PortableTextInlineView.svelte +111 -0
  37. package/dist/components/admin/fields/richtext/PortableTextInlineView.svelte.d.ts +12 -0
  38. package/dist/components/admin/fields/richtext/PortableTextInlineView.svelte.d.ts.map +1 -0
  39. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte +67 -0
  40. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts +12 -0
  41. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts.map +1 -0
  42. package/dist/components/admin/fields/richtext/RichtextField.svelte +1296 -0
  43. package/dist/components/admin/fields/richtext/RichtextField.svelte.d.ts +15 -0
  44. package/dist/components/admin/fields/richtext/RichtextField.svelte.d.ts.map +1 -0
  45. package/dist/components/admin/fields/richtext/custom-annotation-mark.d.ts +7 -0
  46. package/dist/components/admin/fields/richtext/custom-annotation-mark.d.ts.map +1 -0
  47. package/dist/components/admin/fields/richtext/custom-annotation-mark.js +33 -0
  48. package/dist/components/admin/fields/richtext/portable-text-inline-object.d.ts +11 -0
  49. package/dist/components/admin/fields/richtext/portable-text-inline-object.d.ts.map +1 -0
  50. package/dist/components/admin/fields/richtext/portable-text-inline-object.js +31 -0
  51. package/dist/components/admin/fields/richtext/portable-text-object-node.d.ts +11 -0
  52. package/dist/components/admin/fields/richtext/portable-text-object-node.d.ts.map +1 -0
  53. package/dist/components/admin/fields/richtext/portable-text-object-node.js +31 -0
  54. package/dist/components/admin/fields/richtext/portable-text-serializer.d.ts +38 -0
  55. package/dist/components/admin/fields/richtext/portable-text-serializer.d.ts.map +1 -0
  56. package/dist/components/admin/fields/richtext/portable-text-serializer.js +297 -0
  57. package/dist/components/admin/fields/richtext/svelte-inline-node-view.d.ts +8 -0
  58. package/dist/components/admin/fields/richtext/svelte-inline-node-view.d.ts.map +1 -0
  59. package/dist/components/admin/fields/richtext/svelte-inline-node-view.js +67 -0
  60. package/dist/components/admin/fields/richtext/svelte-node-view.d.ts +8 -0
  61. package/dist/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -0
  62. package/dist/components/admin/fields/richtext/svelte-node-view.js +63 -0
  63. package/dist/components/layout/OrganizationSwitcher.svelte +1 -1
  64. package/dist/components/layout/sidebar/NavMain.svelte +9 -1
  65. package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -1
  66. package/dist/db/interfaces/asset.d.ts +2 -4
  67. package/dist/db/interfaces/asset.d.ts.map +1 -1
  68. package/dist/db/interfaces/document.d.ts +8 -2
  69. package/dist/db/interfaces/document.d.ts.map +1 -1
  70. package/dist/db/interfaces/organization.d.ts +1 -1
  71. package/dist/db/interfaces/organization.d.ts.map +1 -1
  72. package/dist/field-access.d.ts.map +1 -1
  73. package/dist/field-access.js +5 -1
  74. package/dist/graphql/depth-limit.d.ts +8 -0
  75. package/dist/graphql/depth-limit.d.ts.map +1 -0
  76. package/dist/graphql/depth-limit.js +79 -0
  77. package/dist/graphql/index.d.ts.map +1 -1
  78. package/dist/graphql/index.js +12 -1
  79. package/dist/graphql/resolvers.d.ts.map +1 -1
  80. package/dist/graphql/resolvers.js +22 -22
  81. package/dist/graphql/schema.d.ts.map +1 -1
  82. package/dist/graphql/schema.js +7 -3
  83. package/dist/hooks.d.ts +2 -0
  84. package/dist/hooks.d.ts.map +1 -1
  85. package/dist/hooks.js +5 -2
  86. package/dist/lib/api/api-keys.d.ts +8 -3
  87. package/dist/lib/api/api-keys.d.ts.map +1 -1
  88. package/dist/lib/api/api-keys.js.map +1 -1
  89. package/dist/lib/api/schemas/assets.js +1 -1
  90. package/dist/lib/api/schemas/assets.js.map +1 -1
  91. package/dist/lib/api/schemas/documents.d.ts +0 -2
  92. package/dist/lib/api/schemas/documents.d.ts.map +1 -1
  93. package/dist/lib/api/schemas/documents.js +2 -8
  94. package/dist/lib/api/schemas/documents.js.map +1 -1
  95. package/dist/lib/api/schemas/instance.d.ts +6 -0
  96. package/dist/lib/api/schemas/instance.d.ts.map +1 -0
  97. package/dist/lib/api/schemas/instance.js +8 -0
  98. package/dist/lib/api/schemas/instance.js.map +1 -0
  99. package/dist/lib/api/schemas/user.js +1 -1
  100. package/dist/lib/auth/auth-hooks.d.ts.map +1 -1
  101. package/dist/lib/auth/auth-hooks.js +9 -3
  102. package/dist/lib/auth/auth-hooks.js.map +1 -1
  103. package/dist/lib/components/admin/fields/richtext/custom-annotation-mark.d.ts +7 -0
  104. package/dist/lib/components/admin/fields/richtext/custom-annotation-mark.d.ts.map +1 -0
  105. package/dist/lib/components/admin/fields/richtext/custom-annotation-mark.js +34 -0
  106. package/dist/lib/components/admin/fields/richtext/custom-annotation-mark.js.map +1 -0
  107. package/dist/lib/components/admin/fields/richtext/portable-text-inline-object.d.ts +11 -0
  108. package/dist/lib/components/admin/fields/richtext/portable-text-inline-object.d.ts.map +1 -0
  109. package/dist/lib/components/admin/fields/richtext/portable-text-inline-object.js +32 -0
  110. package/dist/lib/components/admin/fields/richtext/portable-text-inline-object.js.map +1 -0
  111. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.d.ts +11 -0
  112. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.d.ts.map +1 -0
  113. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.js +32 -0
  114. package/dist/lib/components/admin/fields/richtext/portable-text-object-node.js.map +1 -0
  115. package/dist/lib/components/admin/fields/richtext/portable-text-serializer.d.ts +38 -0
  116. package/dist/lib/components/admin/fields/richtext/portable-text-serializer.d.ts.map +1 -0
  117. package/dist/lib/components/admin/fields/richtext/portable-text-serializer.js +298 -0
  118. package/dist/lib/components/admin/fields/richtext/portable-text-serializer.js.map +1 -0
  119. package/dist/lib/components/admin/fields/richtext/svelte-inline-node-view.d.ts +8 -0
  120. package/dist/lib/components/admin/fields/richtext/svelte-inline-node-view.d.ts.map +1 -0
  121. package/dist/lib/components/admin/fields/richtext/svelte-inline-node-view.js +68 -0
  122. package/dist/lib/components/admin/fields/richtext/svelte-inline-node-view.js.map +1 -0
  123. package/dist/lib/components/admin/fields/richtext/svelte-node-view.d.ts +8 -0
  124. package/dist/lib/components/admin/fields/richtext/svelte-node-view.d.ts.map +1 -0
  125. package/dist/lib/components/admin/fields/richtext/svelte-node-view.js +64 -0
  126. package/dist/lib/components/admin/fields/richtext/svelte-node-view.js.map +1 -0
  127. package/dist/lib/db/interfaces/asset.d.ts +2 -4
  128. package/dist/lib/db/interfaces/asset.d.ts.map +1 -1
  129. package/dist/lib/db/interfaces/document.d.ts +8 -2
  130. package/dist/lib/db/interfaces/document.d.ts.map +1 -1
  131. package/dist/lib/db/interfaces/organization.d.ts +1 -1
  132. package/dist/lib/db/interfaces/organization.d.ts.map +1 -1
  133. package/dist/lib/field-access.d.ts.map +1 -1
  134. package/dist/lib/field-access.js +5 -1
  135. package/dist/lib/field-access.js.map +1 -1
  136. package/dist/lib/graphql/depth-limit.d.ts +8 -0
  137. package/dist/lib/graphql/depth-limit.d.ts.map +1 -0
  138. package/dist/lib/graphql/depth-limit.js +80 -0
  139. package/dist/lib/graphql/depth-limit.js.map +1 -0
  140. package/dist/lib/graphql/index.d.ts.map +1 -1
  141. package/dist/lib/graphql/index.js +12 -1
  142. package/dist/lib/graphql/index.js.map +1 -1
  143. package/dist/lib/graphql/resolvers.d.ts.map +1 -1
  144. package/dist/lib/graphql/resolvers.js +22 -22
  145. package/dist/lib/graphql/resolvers.js.map +1 -1
  146. package/dist/lib/graphql/schema.d.ts.map +1 -1
  147. package/dist/lib/graphql/schema.js +7 -3
  148. package/dist/lib/graphql/schema.js.map +1 -1
  149. package/dist/lib/hooks.d.ts +2 -0
  150. package/dist/lib/hooks.d.ts.map +1 -1
  151. package/dist/lib/hooks.js +5 -2
  152. package/dist/lib/hooks.js.map +1 -1
  153. package/dist/lib/local-api/collection-api.d.ts.map +1 -1
  154. package/dist/lib/local-api/collection-api.js +14 -9
  155. package/dist/lib/local-api/collection-api.js.map +1 -1
  156. package/dist/lib/local-api/index.d.ts +5 -1
  157. package/dist/lib/local-api/index.d.ts.map +1 -1
  158. package/dist/lib/local-api/index.js +12 -4
  159. package/dist/lib/local-api/index.js.map +1 -1
  160. package/dist/lib/routes/assets-cdn.d.ts.map +1 -1
  161. package/dist/lib/routes/assets-cdn.js +8 -3
  162. package/dist/lib/routes/assets-cdn.js.map +1 -1
  163. package/dist/lib/schema-utils/validator.d.ts.map +1 -1
  164. package/dist/lib/schema-utils/validator.js +5 -1
  165. package/dist/lib/schema-utils/validator.js.map +1 -1
  166. package/dist/lib/server/api/index.d.ts.map +1 -1
  167. package/dist/lib/server/api/index.js +18 -0
  168. package/dist/lib/server/api/index.js.map +1 -1
  169. package/dist/lib/server/api/routes/assets-bulk.d.ts.map +1 -1
  170. package/dist/lib/server/api/routes/assets-bulk.js +4 -0
  171. package/dist/lib/server/api/routes/assets-bulk.js.map +1 -1
  172. package/dist/lib/server/api/routes/assets-by-id.d.ts.map +1 -1
  173. package/dist/lib/server/api/routes/assets-by-id.js +17 -2
  174. package/dist/lib/server/api/routes/assets-by-id.js.map +1 -1
  175. package/dist/lib/server/api/routes/assets-references.d.ts.map +1 -1
  176. package/dist/lib/server/api/routes/assets-references.js +6 -4
  177. package/dist/lib/server/api/routes/assets-references.js.map +1 -1
  178. package/dist/lib/server/api/routes/assets.d.ts.map +1 -1
  179. package/dist/lib/server/api/routes/assets.js +18 -9
  180. package/dist/lib/server/api/routes/assets.js.map +1 -1
  181. package/dist/lib/server/api/routes/document-versions.d.ts.map +1 -1
  182. package/dist/lib/server/api/routes/document-versions.js +8 -0
  183. package/dist/lib/server/api/routes/document-versions.js.map +1 -1
  184. package/dist/lib/server/api/routes/documents-by-id.d.ts.map +1 -1
  185. package/dist/lib/server/api/routes/documents-by-id.js +3 -3
  186. package/dist/lib/server/api/routes/documents-by-id.js.map +1 -1
  187. package/dist/lib/server/api/routes/documents-publish.d.ts.map +1 -1
  188. package/dist/lib/server/api/routes/documents-publish.js +2 -2
  189. package/dist/lib/server/api/routes/documents-publish.js.map +1 -1
  190. package/dist/lib/server/api/routes/documents-query.d.ts.map +1 -1
  191. package/dist/lib/server/api/routes/documents-query.js +2 -3
  192. package/dist/lib/server/api/routes/documents-query.js.map +1 -1
  193. package/dist/lib/server/api/routes/documents.d.ts.map +1 -1
  194. package/dist/lib/server/api/routes/documents.js +3 -5
  195. package/dist/lib/server/api/routes/documents.js.map +1 -1
  196. package/dist/lib/server/api/routes/organizations-invitations.d.ts.map +1 -1
  197. package/dist/lib/server/api/routes/organizations-invitations.js +1 -1
  198. package/dist/lib/server/api/routes/organizations-invitations.js.map +1 -1
  199. package/dist/lib/server/api/routes/organizations-members.d.ts.map +1 -1
  200. package/dist/lib/server/api/routes/organizations-members.js.map +1 -1
  201. package/dist/lib/server/index.d.ts +1 -0
  202. package/dist/lib/server/index.d.ts.map +1 -1
  203. package/dist/lib/server/index.js +2 -0
  204. package/dist/lib/server/index.js.map +1 -1
  205. package/dist/lib/services/asset-service.d.ts.map +1 -1
  206. package/dist/lib/services/asset-service.js +4 -2
  207. package/dist/lib/services/asset-service.js.map +1 -1
  208. package/dist/lib/services/references-service.d.ts.map +1 -1
  209. package/dist/lib/services/references-service.js.map +1 -1
  210. package/dist/lib/storage/adapters/local-storage-adapter.d.ts +4 -0
  211. package/dist/lib/storage/adapters/local-storage-adapter.d.ts.map +1 -1
  212. package/dist/lib/storage/adapters/local-storage-adapter.js +28 -6
  213. package/dist/lib/storage/adapters/local-storage-adapter.js.map +1 -1
  214. package/dist/lib/types/capabilities.d.ts +1 -0
  215. package/dist/lib/types/capabilities.d.ts.map +1 -1
  216. package/dist/lib/types/capabilities.js +3 -0
  217. package/dist/lib/types/capabilities.js.map +1 -1
  218. package/dist/lib/types/config.d.ts +16 -1
  219. package/dist/lib/types/config.d.ts.map +1 -1
  220. package/dist/lib/types/schemas.d.ts +27 -0
  221. package/dist/lib/types/schemas.d.ts.map +1 -1
  222. package/dist/lib/types/schemas.js +3 -1
  223. package/dist/lib/types/schemas.js.map +1 -1
  224. package/dist/lib/utils/logger.d.ts +8 -6
  225. package/dist/lib/utils/logger.d.ts.map +1 -1
  226. package/dist/lib/utils/logger.js +11 -2
  227. package/dist/lib/utils/logger.js.map +1 -1
  228. package/dist/lib/utils/mime-detect.d.ts.map +1 -1
  229. package/dist/lib/utils/mime-detect.js +21 -6
  230. package/dist/lib/utils/mime-detect.js.map +1 -1
  231. package/dist/lib/vite/index.d.ts.map +1 -1
  232. package/dist/lib/vite/index.js +4 -5
  233. package/dist/lib/vite/index.js.map +1 -1
  234. package/dist/local-api/collection-api.d.ts.map +1 -1
  235. package/dist/local-api/collection-api.js +14 -9
  236. package/dist/local-api/index.d.ts +5 -1
  237. package/dist/local-api/index.d.ts.map +1 -1
  238. package/dist/local-api/index.js +12 -4
  239. package/dist/routes/assets-cdn.d.ts.map +1 -1
  240. package/dist/routes/assets-cdn.js +8 -3
  241. package/dist/schema-utils/validator.d.ts.map +1 -1
  242. package/dist/schema-utils/validator.js +5 -1
  243. package/dist/server/api/index.d.ts.map +1 -1
  244. package/dist/server/api/index.js +18 -0
  245. package/dist/server/api/routes/assets-bulk.d.ts.map +1 -1
  246. package/dist/server/api/routes/assets-bulk.js +4 -0
  247. package/dist/server/api/routes/assets-by-id.d.ts.map +1 -1
  248. package/dist/server/api/routes/assets-by-id.js +17 -2
  249. package/dist/server/api/routes/assets-references.d.ts.map +1 -1
  250. package/dist/server/api/routes/assets-references.js +6 -4
  251. package/dist/server/api/routes/assets.d.ts.map +1 -1
  252. package/dist/server/api/routes/assets.js +18 -9
  253. package/dist/server/api/routes/document-versions.d.ts.map +1 -1
  254. package/dist/server/api/routes/document-versions.js +8 -0
  255. package/dist/server/api/routes/documents-by-id.d.ts.map +1 -1
  256. package/dist/server/api/routes/documents-by-id.js +3 -3
  257. package/dist/server/api/routes/documents-publish.d.ts.map +1 -1
  258. package/dist/server/api/routes/documents-publish.js +2 -2
  259. package/dist/server/api/routes/documents-query.d.ts.map +1 -1
  260. package/dist/server/api/routes/documents-query.js +2 -3
  261. package/dist/server/api/routes/documents.d.ts.map +1 -1
  262. package/dist/server/api/routes/documents.js +3 -5
  263. package/dist/server/api/routes/organizations-invitations.d.ts.map +1 -1
  264. package/dist/server/api/routes/organizations-invitations.js +1 -1
  265. package/dist/server/api/routes/organizations-members.d.ts.map +1 -1
  266. package/dist/server/index.d.ts +1 -0
  267. package/dist/server/index.d.ts.map +1 -1
  268. package/dist/server/index.js +2 -0
  269. package/dist/services/asset-service.d.ts.map +1 -1
  270. package/dist/services/asset-service.js +4 -2
  271. package/dist/services/references-service.d.ts.map +1 -1
  272. package/dist/storage/adapters/local-storage-adapter.d.ts +4 -0
  273. package/dist/storage/adapters/local-storage-adapter.d.ts.map +1 -1
  274. package/dist/storage/adapters/local-storage-adapter.js +28 -6
  275. package/dist/types/capabilities.d.ts +1 -0
  276. package/dist/types/capabilities.d.ts.map +1 -1
  277. package/dist/types/capabilities.js +3 -0
  278. package/dist/types/config.d.ts +16 -1
  279. package/dist/types/config.d.ts.map +1 -1
  280. package/dist/types/schemas.d.ts +27 -0
  281. package/dist/types/schemas.d.ts.map +1 -1
  282. package/dist/types/schemas.js +3 -1
  283. package/dist/utils/logger.d.ts +8 -6
  284. package/dist/utils/logger.d.ts.map +1 -1
  285. package/dist/utils/logger.js +11 -2
  286. package/dist/utils/mime-detect.d.ts.map +1 -1
  287. package/dist/utils/mime-detect.js +21 -6
  288. package/dist/vite/index.d.ts.map +1 -1
  289. package/dist/vite/index.js +4 -5
  290. package/package.json +9 -5
@@ -1 +1 @@
1
- {"version":3,"file":"collection-api.d.ts","sourceRoot":"","sources":["../../src/lib/local-api/collection-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collection-api.d.ts","sourceRoot":"","sources":["../../src/lib/local-api/collection-api.ts"],"names":[],"mappings":"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"}
@@ -162,7 +162,10 @@ export class CollectionAPI {
162
162
  // callers always get one document back. Filters are intentionally
163
163
  // ignored — there is at most one row by definition.
164
164
  if (this._schema.singleton) {
165
- const doc = await this.get(context, { perspective: options.perspective, depth: options.depth });
165
+ const doc = await this.get(context, {
166
+ perspective: options.perspective,
167
+ depth: options.depth
168
+ });
166
169
  return {
167
170
  docs: [doc],
168
171
  totalDocs: 1,
@@ -352,12 +355,19 @@ export class CollectionAPI {
352
355
  ? await this.versionService.publishWithVersion(this.databaseAdapter, context.organizationId, document.id)
353
356
  : await this.databaseAdapter.publishDoc(context.organizationId, document.id);
354
357
  if (published) {
358
+ if (this.documentCache) {
359
+ await this.documentCache.invalidateDocument(context.organizationId, document.id);
360
+ await this.documentCache.invalidateCollection(context.organizationId, this.collectionName);
361
+ }
355
362
  return {
356
363
  document: transformDocument(published, 'published'),
357
364
  validation: validationResult
358
365
  };
359
366
  }
360
367
  }
368
+ if (this.documentCache) {
369
+ await this.documentCache.invalidateCollection(context.organizationId, this.collectionName);
370
+ }
361
371
  return {
362
372
  document: transformDocument(document, 'draft'),
363
373
  validation: validationResult
@@ -459,8 +469,7 @@ export class CollectionAPI {
459
469
  // Protect the canonical singleton row. In-limbo random-uuid docs of
460
470
  // the same type (left over from before the schema was flipped to
461
471
  // singleton) remain deletable — only the deterministic id is locked.
462
- if (this._schema.singleton &&
463
- id === singletonId(this._schema.name, context.organizationId)) {
472
+ if (this._schema.singleton && id === singletonId(this._schema.name, context.organizationId)) {
464
473
  throw new SingletonOperationError(`Cannot delete the singleton document for '${this._schema.name}'. Remove the singleton flag from the schema first.`);
465
474
  }
466
475
  // Fetch the target so ownership policies have a doc to inspect. For
@@ -513,16 +522,12 @@ export class CollectionAPI {
513
522
  const refDoc = await this.databaseAdapter.findByDocIdAdvanced(context.organizationId, refId);
514
523
  if (refDoc && !refDoc.publishedData) {
515
524
  const data = refDoc.draftData;
516
- const title = data?.title ||
517
- data?.name ||
518
- refDoc.id;
525
+ const title = data?.title || data?.name || refDoc.id;
519
526
  unpublished.push({ id: refDoc.id, type: refDoc.type, title });
520
527
  }
521
528
  }
522
529
  if (unpublished.length > 0) {
523
- const names = unpublished
524
- .map((d) => `"${d.title}" (${d.type})`)
525
- .join(', ');
530
+ const names = unpublished.map((d) => `"${d.title}" (${d.type})`).join(', ');
526
531
  throw new Error(`Cannot publish — ${unpublished.length} referenced document(s) are not published: ${names}`);
527
532
  }
528
533
  }
@@ -11,7 +11,6 @@ import type { LocalAPIContext } from './types.js';
11
11
  * This interface is meant to be augmented by generated types
12
12
  */
13
13
  export interface Collections {
14
- [collectionName: string]: CollectionAPI<unknown>;
15
14
  }
16
15
  /**
17
16
  * Local API - provides a unified, type-safe interface for all CMS operations
@@ -46,6 +45,7 @@ export interface Collections {
46
45
  export declare class LocalAPI {
47
46
  private config;
48
47
  collections: Collections;
48
+ private _collections;
49
49
  private userAdapter;
50
50
  private systemAdapter;
51
51
  private documentCache;
@@ -72,6 +72,10 @@ export declare class LocalAPI {
72
72
  * Check if a collection exists
73
73
  */
74
74
  hasCollection(name: string): boolean;
75
+ /**
76
+ * Get a collection by name (for dynamic access in route handlers and resolvers)
77
+ */
78
+ getCollection(name: string): CollectionAPI<unknown> | undefined;
75
79
  /**
76
80
  * Get schema for a collection
77
81
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/local-api/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/local-api/index.ts"],"names":[],"mappings":"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"}
@@ -49,6 +49,7 @@ import { PermissionChecker } from './permissions.js';
49
49
  export class LocalAPI {
50
50
  config;
51
51
  collections = {};
52
+ _collections = new Map();
52
53
  userAdapter;
53
54
  systemAdapter;
54
55
  documentCache;
@@ -90,8 +91,7 @@ export class LocalAPI {
90
91
  // wrapper. They don't touch the database, so wrapping
91
92
  // would force callers to `await` what is actually a
92
93
  // synchronous compute (and break their return types).
93
- if (typeof method === 'function' &&
94
- SYNC_COLLECTION_METHODS.has(prop)) {
94
+ if (typeof method === 'function' && SYNC_COLLECTION_METHODS.has(prop)) {
95
95
  return method.bind(target);
96
96
  }
97
97
  if (typeof method === 'function') {
@@ -108,7 +108,9 @@ export class LocalAPI {
108
108
  return method;
109
109
  }
110
110
  });
111
- this.collections[schema.name] = collectionAPI;
111
+ this._collections.set(schema.name, collectionAPI);
112
+ this.collections[schema.name] =
113
+ collectionAPI;
112
114
  }
113
115
  }
114
116
  /**
@@ -133,6 +135,12 @@ export class LocalAPI {
133
135
  hasCollection(name) {
134
136
  return this.schemas.has(name);
135
137
  }
138
+ /**
139
+ * Get a collection by name (for dynamic access in route handlers and resolvers)
140
+ */
141
+ getCollection(name) {
142
+ return this._collections.get(name);
143
+ }
136
144
  /**
137
145
  * Get schema for a collection
138
146
  */
@@ -202,7 +210,7 @@ export class LocalAPI {
202
210
  const docs = await Promise.all(typeLookups.map(async (lookup) => {
203
211
  if (!lookup)
204
212
  return null;
205
- const collection = this.collections[lookup.type];
213
+ const collection = this.getCollection(lookup.type);
206
214
  if (!collection)
207
215
  return null;
208
216
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"assets-cdn.d.ts","sourceRoot":"","sources":["../../src/lib/routes/assets-cdn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,eAAO,MAAM,GAAG,EAAE,cAkKjB,CAAC"}
1
+ {"version":3,"file":"assets-cdn.d.ts","sourceRoot":"","sources":["../../src/lib/routes/assets-cdn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,eAAO,MAAM,GAAG,EAAE,cAyKjB,CAAC"}
@@ -116,12 +116,17 @@ export const GET = async ({ params, locals, setHeaders, request }) => {
116
116
  .replace(/[^\x20-\x7E]/g, '_') // strip anything outside printable ASCII
117
117
  .replace(/["\\]/g, ''); // drop quotes and backslashes that'd break the quoted-string
118
118
  const utf8Encoded = encodeURIComponent(rawFilename);
119
- // Set appropriate headers for the asset
119
+ const safeInlineTypes = ['image/', 'application/pdf', 'video/', 'audio/'];
120
+ const canInline = asset.mimeType &&
121
+ asset.mimeType !== 'image/svg+xml' &&
122
+ safeInlineTypes.some((t) => asset.mimeType.startsWith(t));
123
+ const disposition = canInline ? 'inline' : 'attachment';
120
124
  setHeaders({
121
125
  'Content-Type': asset.mimeType || 'application/octet-stream',
122
126
  'Content-Length': fileBuffer.length.toString(),
123
- 'Cache-Control': 'public, max-age=31536000, immutable', // Cache for 1 year
124
- 'Content-Disposition': `inline; filename="${asciiFallback}"; filename*=UTF-8''${utf8Encoded}`,
127
+ 'Cache-Control': 'public, max-age=31536000, immutable',
128
+ 'Content-Disposition': `${disposition}; filename="${asciiFallback}"; filename*=UTF-8''${utf8Encoded}`,
129
+ 'X-Content-Type-Options': 'nosniff',
125
130
  ...(asset.mimeType?.startsWith('image/') && {
126
131
  'Accept-Ranges': 'bytes'
127
132
  })
@@ -1 +1 @@
1
- {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/lib/schema-utils/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,kBAAkB,CAAC;AAmB1D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CA8NpE"}
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/lib/schema-utils/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,kBAAkB,CAAC;AAmB1D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAkOpE"}
@@ -76,8 +76,12 @@ export function validateSchemaReferences(schemas) {
76
76
  if (primitiveTypes.includes(arrayType.type)) {
77
77
  continue;
78
78
  }
79
+ // Block type is a built-in for Portable Text block content
80
+ if (arrayType.type === 'block') {
81
+ continue;
82
+ }
79
83
  // Skip inline object definitions (has fields property)
80
- if (arrayType.type === 'object' && arrayType.fields) {
84
+ if (arrayType.fields) {
81
85
  continue;
82
86
  }
83
87
  // Only validate if it's a reference to another schema
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/server/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAoB7C;;;;;;;;;;GAUG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,SAAS,EAAE;QACV,QAAQ,EAAE,YAAY,CAAC;QACvB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;KAClB,CAAC;IACF,QAAQ,EAAE;QACT,QAAQ,EAAE,YAAY,CAAC;QACvB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;KAClB,CAAC;CACF,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,cAAc,kGAY7B;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,QAsCrD;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC5B,SAAS,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,IAEzC,GAAG,OAAO,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,uBAejD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/server/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAoB7C;;;;;;;;;;GAUG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,SAAS,EAAE;QACV,QAAQ,EAAE,YAAY,CAAC;QACvB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;KAClB,CAAC;IACF,QAAQ,EAAE;QACT,QAAQ,EAAE,YAAY,CAAC;QACvB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;KAClB,CAAC;CACF,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,cAAc,kGAqB7B;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,QAkDrD;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,IACtE,GAAG,OAAO,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,uBAejD"}
@@ -1,4 +1,5 @@
1
1
  import { Hono } from 'hono';
2
+ import { bodyLimit } from 'hono/body-limit';
2
3
  import { schemasRouter } from './routes/schemas.js';
3
4
  import { documentsRouter } from './routes/documents.js';
4
5
  import { documentsByIdRouter } from './routes/documents-by-id.js';
@@ -27,6 +28,11 @@ import { userRouter } from './routes/user.js';
27
28
  */
28
29
  export function createAphexApi() {
29
30
  const app = new Hono().basePath('/api');
31
+ // Reject oversized request bodies before they're fully buffered.
32
+ app.use('*', bodyLimit({
33
+ maxSize: 10 * 1024 * 1024, // 10MB for JSON endpoints
34
+ onError: (c) => c.json({ success: false, error: 'Request body too large (max 10MB)' }, 413)
35
+ }));
30
36
  // Bridge: lift values passed via app.fetch(req, env) onto c.var so
31
37
  // handlers can read c.var.aphexCMS / c.var.auth directly.
32
38
  app.use('*', async (c, next) => {
@@ -77,6 +83,18 @@ export function mountAphexBuiltins(app) {
77
83
  // Hono would try to match them under the wrong handler chain.
78
84
  app.route('/user', userPreferencesRouter);
79
85
  app.route('/user', userRouter);
86
+ // Health check — unauthenticated, used by load balancers and uptime monitors.
87
+ app.get('/aphex-health', async (c) => {
88
+ try {
89
+ const { databaseAdapter } = c.var.aphexCMS;
90
+ const dbHealthy = await databaseAdapter.isHealthy();
91
+ const status = dbHealthy ? 'healthy' : 'degraded';
92
+ return c.json({ status, database: dbHealthy }, dbHealthy ? 200 : 503);
93
+ }
94
+ catch {
95
+ return c.json({ status: 'unhealthy', database: false }, 503);
96
+ }
97
+ });
80
98
  }
81
99
  /**
82
100
  * Adapter: wrap a SvelteKit-style `RequestHandler` so it can be mounted
@@ -1 +1 @@
1
- {"version":3,"file":"assets-bulk.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/assets-bulk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAkE3C,CAAC"}
1
+ {"version":3,"file":"assets-bulk.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/assets-bulk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAyE3C,CAAC"}
@@ -2,6 +2,7 @@ import { Hono } from 'hono';
2
2
  import { zValidator } from '@hono/zod-validator';
3
3
  import { cmsLogger } from '../../../utils/logger.js';
4
4
  import { bulkDeleteAssetsRequest } from '../../../api/schemas/assets.js';
5
+ import { hasCapability } from '../../../types/capabilities.js';
5
6
  export const assetsBulkRouter = new Hono().delete('/bulk', zValidator('json', bulkDeleteAssetsRequest, (result, c) => {
6
7
  if (!result.success) {
7
8
  return c.json({
@@ -17,6 +18,9 @@ export const assetsBulkRouter = new Hono().delete('/bulk', zValidator('json', bu
17
18
  if (!auth || auth.type === 'partial_session') {
18
19
  return c.json({ success: false, error: 'Unauthorized' }, 401);
19
20
  }
21
+ if (!hasCapability(auth, 'asset.delete')) {
22
+ return c.json({ success: false, error: 'Forbidden: asset.delete capability required' }, 403);
23
+ }
20
24
  const { ids } = c.req.valid('json');
21
25
  let referencedIds = [];
22
26
  if (databaseAdapter.countDocumentReferencesForAssets) {
@@ -1 +1 @@
1
- {"version":3,"file":"assets-by-id.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/assets-by-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CA8HzC,CAAC"}
1
+ {"version":3,"file":"assets-by-id.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/assets-by-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAsJ1C,CAAC"}
@@ -2,6 +2,7 @@ import { Hono } from 'hono';
2
2
  import { zValidator } from '@hono/zod-validator';
3
3
  import { cmsLogger } from '../../../utils/logger.js';
4
4
  import { updateAssetRequest } from '../../../api/schemas/assets.js';
5
+ import { hasCapability } from '../../../types/capabilities.js';
5
6
  export const assetsByIdRouter = new Hono()
6
7
  .get('/:id', async (c) => {
7
8
  try {
@@ -28,16 +29,20 @@ export const assetsByIdRouter = new Hono()
28
29
  .delete('/:id', async (c) => {
29
30
  try {
30
31
  const id = c.req.param('id');
31
- const { assetService, databaseAdapter } = c.var.aphexCMS;
32
+ const { assetService, databaseAdapter, localAPI } = c.var.aphexCMS;
32
33
  const auth = c.var.auth;
33
34
  if (!auth || auth.type === 'partial_session') {
34
35
  return c.json({ success: false, error: 'Unauthorized' }, 401);
35
36
  }
37
+ if (!hasCapability(auth, 'asset.delete')) {
38
+ return c.json({ success: false, error: 'Forbidden: asset.delete capability required' }, 403);
39
+ }
36
40
  if (!id) {
37
41
  return c.json({ success: false, error: 'Asset ID is required' }, 400);
38
42
  }
39
43
  if (databaseAdapter.findDocumentsReferencingAsset) {
40
- const refs = await databaseAdapter.findDocumentsReferencingAsset(auth.organizationId, id);
44
+ const knownTypes = localAPI.getCollectionNames();
45
+ const refs = await databaseAdapter.findDocumentsReferencingAsset(auth.organizationId, id, knownTypes);
41
46
  if (refs.length > 0) {
42
47
  return c.json({
43
48
  success: false,
@@ -49,6 +54,13 @@ export const assetsByIdRouter = new Hono()
49
54
  if (!result) {
50
55
  return c.json({ success: false, error: 'Asset not found or could not be deleted' }, 404);
51
56
  }
57
+ if (databaseAdapter.clearAssetFromPublishedData) {
58
+ const cleared = await databaseAdapter.clearAssetFromPublishedData(auth.organizationId, id);
59
+ console.log(`[Asset Delete] Cleared asset ${id} from ${cleared} document(s) publishedData`);
60
+ }
61
+ else {
62
+ console.log(`[Asset Delete] clearAssetFromPublishedData not available on adapter`);
63
+ }
52
64
  return c.json({ success: true });
53
65
  }
54
66
  catch (error) {
@@ -72,6 +84,9 @@ export const assetsByIdRouter = new Hono()
72
84
  if (!auth || auth.type === 'partial_session') {
73
85
  return c.json({ success: false, error: 'Unauthorized' }, 401);
74
86
  }
87
+ if (!hasCapability(auth, 'asset.upload')) {
88
+ return c.json({ success: false, error: 'Forbidden: asset.upload capability required' }, 403);
89
+ }
75
90
  if (!id) {
76
91
  return c.json({ success: false, error: 'Asset ID is required' }, 400);
77
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"assets-references.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/assets-references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAkFhD,CAAC"}
1
+ {"version":3,"file":"assets-references.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/assets-references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAsFhD,CAAC"}
@@ -16,7 +16,7 @@ import { assetReferenceCountsRequest } from '../../../api/schemas/assets.js';
16
16
  export const assetsReferencesRouter = new Hono()
17
17
  .get('/:id/references', async (c) => {
18
18
  try {
19
- const { databaseAdapter } = c.var.aphexCMS;
19
+ const { databaseAdapter, localAPI } = c.var.aphexCMS;
20
20
  const auth = c.var.auth;
21
21
  if (!auth || auth.type === 'partial_session') {
22
22
  return c.json({ success: false, error: 'Unauthorized' }, 401);
@@ -28,7 +28,8 @@ export const assetsReferencesRouter = new Hono()
28
28
  if (!databaseAdapter.findDocumentsReferencingAsset) {
29
29
  return c.json({ success: true, data: { references: [], total: 0 } });
30
30
  }
31
- const references = await databaseAdapter.findDocumentsReferencingAsset(auth.organizationId, id);
31
+ const knownTypes = localAPI.getCollectionNames();
32
+ const references = await databaseAdapter.findDocumentsReferencingAsset(auth.organizationId, id, knownTypes);
32
33
  return c.json({
33
34
  success: true,
34
35
  data: {
@@ -52,7 +53,7 @@ export const assetsReferencesRouter = new Hono()
52
53
  }
53
54
  }), async (c) => {
54
55
  try {
55
- const { databaseAdapter } = c.var.aphexCMS;
56
+ const { databaseAdapter, localAPI } = c.var.aphexCMS;
56
57
  const auth = c.var.auth;
57
58
  if (!auth || auth.type === 'partial_session') {
58
59
  return c.json({ success: false, error: 'Unauthorized' }, 401);
@@ -67,7 +68,8 @@ export const assetsReferencesRouter = new Hono()
67
68
  counts[id] = 0;
68
69
  return c.json({ success: true, data: counts });
69
70
  }
70
- const counts = await databaseAdapter.countDocumentReferencesForAssets(auth.organizationId, ids);
71
+ const knownTypes = localAPI.getCollectionNames();
72
+ const counts = await databaseAdapter.countDocumentReferencesForAssets(auth.organizationId, ids, knownTypes);
71
73
  return c.json({ success: true, data: counts });
72
74
  }
73
75
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,QAAQ,CA+IrC,CAAC"}
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,QAAQ,CA8JrC,CAAC"}
@@ -3,6 +3,7 @@ import { zValidator } from '@hono/zod-validator';
3
3
  import { cmsLogger } from '../../../utils/logger.js';
4
4
  import { validateFile } from '../../../utils/mime-detect.js';
5
5
  import { listAssetsQuery } from '../../../api/schemas/assets.js';
6
+ import { hasCapability } from '../../../types/capabilities.js';
6
7
  export const assetsRouter = new Hono()
7
8
  .get('/', zValidator('query', listAssetsQuery, (result, c) => {
8
9
  if (!result.success) {
@@ -27,15 +28,15 @@ export const assetsRouter = new Hono()
27
28
  limit: q.limit ?? 20,
28
29
  offset: q.offset ?? 0
29
30
  };
30
- const [fetchedAssets, totalAssets] = await Promise.all([
31
+ const { databaseAdapter } = c.var.aphexCMS;
32
+ const [fetchedAssets, total] = await Promise.all([
31
33
  assetService.findAssets(auth.organizationId, filters),
32
- assetService.findAssets(auth.organizationId, {
33
- ...filters,
34
- limit: 999999,
35
- offset: 0
34
+ databaseAdapter.countAssets(auth.organizationId, {
35
+ assetType: filters.assetType,
36
+ mimeType: filters.mimeType,
37
+ search: filters.search
36
38
  })
37
39
  ]);
38
- const total = totalAssets.length;
39
40
  const pageSize = filters.limit || 20;
40
41
  const currentPage = Math.floor(filters.offset / pageSize) + 1;
41
42
  const totalPages = Math.ceil(total / pageSize);
@@ -68,6 +69,9 @@ export const assetsRouter = new Hono()
68
69
  if (!auth || auth.type === 'partial_session') {
69
70
  return c.json({ success: false, error: 'Unauthorized' }, 401);
70
71
  }
72
+ if (!hasCapability(auth, 'asset.upload')) {
73
+ return c.json({ success: false, error: 'Forbidden: asset.upload capability required' }, 403);
74
+ }
71
75
  const formData = await c.req.formData();
72
76
  const file = formData.get('file');
73
77
  if (!file) {
@@ -75,10 +79,14 @@ export const assetsRouter = new Hono()
75
79
  }
76
80
  const arrayBuffer = await file.arrayBuffer();
77
81
  const buffer = Buffer.from(arrayBuffer);
82
+ const SERVER_MAX_FILE_SIZE = 50 * 1024 * 1024; // 50MB hard limit
78
83
  const allowedMimeTypesRaw = formData.get('allowedMimeTypes');
79
84
  const maxSizeRaw = formData.get('maxSize');
80
85
  const allowedMimeTypes = allowedMimeTypesRaw ? JSON.parse(allowedMimeTypesRaw) : undefined;
81
- const maxSize = maxSizeRaw ? parseInt(maxSizeRaw, 10) : undefined;
86
+ const clientMaxSize = maxSizeRaw ? parseInt(maxSizeRaw, 10) : undefined;
87
+ const maxSize = clientMaxSize
88
+ ? Math.min(clientMaxSize, SERVER_MAX_FILE_SIZE)
89
+ : SERVER_MAX_FILE_SIZE;
82
90
  const validation = validateFile(buffer, file.name, file.type, {
83
91
  allowedMimeTypes,
84
92
  maxSize
@@ -86,18 +94,19 @@ export const assetsRouter = new Hono()
86
94
  if (!validation.valid) {
87
95
  return c.json({ success: false, error: validation.error }, 400);
88
96
  }
97
+ const safeMimeType = validation.detectedMimeType || 'application/octet-stream';
89
98
  const title = formData.get('title') || undefined;
90
99
  const description = formData.get('description') || undefined;
91
100
  const alt = formData.get('alt') || undefined;
92
101
  const creditLine = formData.get('creditLine') || undefined;
93
102
  const schemaType = formData.get('schemaType') || undefined;
94
103
  const fieldPath = formData.get('fieldPath') || undefined;
95
- const targetOrganizationId = formData.get('organizationId') || auth.organizationId;
104
+ const targetOrganizationId = auth.organizationId;
96
105
  const uploadData = {
97
106
  organizationId: targetOrganizationId,
98
107
  buffer,
99
108
  originalFilename: file.name,
100
- mimeType: file.type,
109
+ mimeType: safeMimeType,
101
110
  size: file.size,
102
111
  title,
103
112
  description,
@@ -1 +1 @@
1
- {"version":3,"file":"document-versions.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/document-versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAqJ/C,CAAC"}
1
+ {"version":3,"file":"document-versions.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/document-versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAiK/C,CAAC"}
@@ -2,6 +2,7 @@ import { Hono } from 'hono';
2
2
  import { zValidator } from '@hono/zod-validator';
3
3
  import { authToContext } from '../../../local-api/auth-helpers.js';
4
4
  import { cmsLogger } from '../../../utils/logger.js';
5
+ import { hasCapability } from '../../../types/capabilities.js';
5
6
  import { listVersionsQuery } from '../../../api/schemas/documents.js';
6
7
  export const documentVersionsRouter = new Hono()
7
8
  .get('/:id/versions', zValidator('query', listVersionsQuery, (result, c) => {
@@ -84,6 +85,13 @@ export const documentVersionsRouter = new Hono()
84
85
  })
85
86
  .post('/:id/versions/:version/restore', async (c) => {
86
87
  try {
88
+ const auth = c.var.auth;
89
+ if (!auth || auth.type === 'partial_session') {
90
+ return c.json({ success: false, error: 'Unauthorized' }, 401);
91
+ }
92
+ if (!hasCapability(auth, 'document.update')) {
93
+ return c.json({ success: false, error: 'Forbidden: document.update capability required' }, 403);
94
+ }
87
95
  const { localAPI, databaseAdapter } = c.var.aphexCMS;
88
96
  const context = authToContext(c.var.auth);
89
97
  const id = c.req.param('id');
@@ -1 +1 @@
1
- {"version":3,"file":"documents-by-id.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/documents-by-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CA6N5C,CAAC"}
1
+ {"version":3,"file":"documents-by-id.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/documents-by-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAqN5C,CAAC"}
@@ -21,7 +21,7 @@ export const documentsByIdRouter = new Hono()
21
21
  if (!result) {
22
22
  return c.json({ success: false, error: 'Document not found' }, 404);
23
23
  }
24
- const collection = localAPI.collections[result.type];
24
+ const collection = localAPI.getCollection(result.type);
25
25
  if (!collection) {
26
26
  return c.json({
27
27
  success: false,
@@ -73,7 +73,7 @@ export const documentsByIdRouter = new Hono()
73
73
  if (!found) {
74
74
  return c.json({ success: false, error: 'Document not found' }, 404);
75
75
  }
76
- const collection = localAPI.collections[found.type];
76
+ const collection = localAPI.getCollection(found.type);
77
77
  if (!collection) {
78
78
  return c.json({
79
79
  success: false,
@@ -120,7 +120,7 @@ export const documentsByIdRouter = new Hono()
120
120
  if (!result) {
121
121
  return c.json({ success: false, error: 'Document not found' }, 404);
122
122
  }
123
- const collection = localAPI.collections[result.type];
123
+ const collection = localAPI.getCollection(result.type);
124
124
  if (!collection) {
125
125
  return c.json({
126
126
  success: false,
@@ -1 +1 @@
1
- {"version":3,"file":"documents-publish.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/documents-publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAkK/C,CAAC"}
1
+ {"version":3,"file":"documents-publish.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/documents-publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CA4J/C,CAAC"}
@@ -23,7 +23,7 @@ export const documentsPublishRouter = new Hono()
23
23
  message: 'Document may not exist'
24
24
  }, 404);
25
25
  }
26
- const collection = localAPI.collections[found.type];
26
+ const collection = localAPI.getCollection(found.type);
27
27
  if (!collection) {
28
28
  return c.json({
29
29
  success: false,
@@ -84,7 +84,7 @@ export const documentsPublishRouter = new Hono()
84
84
  message: `No document found with ID: ${id}`
85
85
  }, 404);
86
86
  }
87
- const collection = localAPI.collections[found.type];
87
+ const collection = localAPI.getCollection(found.type);
88
88
  if (!collection) {
89
89
  return c.json({
90
90
  success: false,
@@ -1 +1 @@
1
- {"version":3,"file":"documents-query.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/documents-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKzC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,IAAI,CAAC,QAAQ,CAiF/C,CAAC"}
1
+ {"version":3,"file":"documents-query.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/documents-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKzC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,IAAI,CAAC,QAAQ,CA6E/C,CAAC"}
@@ -43,10 +43,9 @@ export const documentsQueryRouter = new Hono().post('/query', zValidator('json',
43
43
  depth: body.depth ?? 0,
44
44
  select: body.select,
45
45
  perspective: body.perspective ?? 'draft',
46
- includeChildOrganizations: body.includeChildOrganizations,
47
- filterOrganizationIds: body.filterOrganizationIds
46
+ includeChildOrganizations: body.includeChildOrganizations
48
47
  };
49
- const result = await localAPI.collections[documentType].find(context, findOptions);
48
+ const result = await localAPI.getCollection(documentType).find(context, findOptions);
50
49
  return c.json({
51
50
  success: true,
52
51
  data: result.docs,
@@ -1 +1 @@
1
- {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/documents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAU5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKzC,eAAO,MAAM,eAAe,EAAE,IAAI,CAAC,QAAQ,CAyMxC,CAAC"}
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/documents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAU5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKzC,eAAO,MAAM,eAAe,EAAE,IAAI,CAAC,QAAQ,CA6MzC,CAAC"}
@@ -25,7 +25,6 @@ export const documentsRouter = new Hono()
25
25
  const sortParam = Array.isArray(q.sort) ? q.sort.join(',') : q.sort;
26
26
  const perspective = q.perspective ?? 'draft';
27
27
  const includeChildOrganizations = q.includeChildOrganizations;
28
- const filterOrganizationIds = q.filterOrganizationIds;
29
28
  const page = q.page ?? DEFAULT_PAGE;
30
29
  const pageSize = q.pageSize ?? q.limit ?? DEFAULT_PAGE_SIZE;
31
30
  const offset = (page - 1) * pageSize;
@@ -37,7 +36,7 @@ export const documentsRouter = new Hono()
37
36
  message: 'Document type is required. Use ?type=page or ?docType=page'
38
37
  }, 400);
39
38
  }
40
- const collection = localAPI.collections[docType];
39
+ const collection = localAPI.getCollection(docType);
41
40
  if (!collection) {
42
41
  return c.json({
43
42
  success: false,
@@ -56,8 +55,7 @@ export const documentsRouter = new Hono()
56
55
  depth,
57
56
  sort: sortParam || undefined,
58
57
  perspective,
59
- includeChildOrganizations,
60
- filterOrganizationIds
58
+ includeChildOrganizations
61
59
  });
62
60
  return c.json({
63
61
  success: true,
@@ -128,7 +126,7 @@ export const documentsRouter = new Hono()
128
126
  const documentType = parsed.type;
129
127
  const documentData = (parsed.draftData ?? parsed.data);
130
128
  const shouldPublish = parsed.publish ?? false;
131
- const collection = localAPI.collections[documentType];
129
+ const collection = localAPI.getCollection(documentType);
132
130
  if (!collection) {
133
131
  return c.json({
134
132
  success: false,
@@ -1 +1 @@
1
- {"version":3,"file":"organizations-invitations.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/organizations-invitations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,EAAE,IAAI,CAAC,QAAQ,CA0MxD,CAAC"}
1
+ {"version":3,"file":"organizations-invitations.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/organizations-invitations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,EAAE,IAAI,CAAC,QAAQ,CA4MxD,CAAC"}