@open-mercato/documents 0.6.8-develop.7016.1.4ed7b1e49d

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 (602) hide show
  1. package/README.md +88 -0
  2. package/build.mjs +23 -0
  3. package/dist/index.js +5 -0
  4. package/dist/index.js.map +7 -0
  5. package/dist/modules/documents/acl.js +15 -0
  6. package/dist/modules/documents/acl.js.map +7 -0
  7. package/dist/modules/documents/api/[id]/archive/route.js +116 -0
  8. package/dist/modules/documents/api/[id]/archive/route.js.map +7 -0
  9. package/dist/modules/documents/api/[id]/attachments/[attachmentId]/route.js +155 -0
  10. package/dist/modules/documents/api/[id]/attachments/[attachmentId]/route.js.map +7 -0
  11. package/dist/modules/documents/api/[id]/attachments/route.js +153 -0
  12. package/dist/modules/documents/api/[id]/attachments/route.js.map +7 -0
  13. package/dist/modules/documents/api/[id]/collab-token/route.js +180 -0
  14. package/dist/modules/documents/api/[id]/collab-token/route.js.map +7 -0
  15. package/dist/modules/documents/api/[id]/comments/access-check/route.js +86 -0
  16. package/dist/modules/documents/api/[id]/comments/access-check/route.js.map +7 -0
  17. package/dist/modules/documents/api/[id]/comments/route.js +387 -0
  18. package/dist/modules/documents/api/[id]/comments/route.js.map +7 -0
  19. package/dist/modules/documents/api/[id]/content/route.js +143 -0
  20. package/dist/modules/documents/api/[id]/content/route.js.map +7 -0
  21. package/dist/modules/documents/api/[id]/duplicate/route.js +200 -0
  22. package/dist/modules/documents/api/[id]/duplicate/route.js.map +7 -0
  23. package/dist/modules/documents/api/[id]/export/route.js +421 -0
  24. package/dist/modules/documents/api/[id]/export/route.js.map +7 -0
  25. package/dist/modules/documents/api/[id]/favorite/route.js +96 -0
  26. package/dist/modules/documents/api/[id]/favorite/route.js.map +7 -0
  27. package/dist/modules/documents/api/[id]/links/[linkId]/route.js +85 -0
  28. package/dist/modules/documents/api/[id]/links/[linkId]/route.js.map +7 -0
  29. package/dist/modules/documents/api/[id]/links/route.js +257 -0
  30. package/dist/modules/documents/api/[id]/links/route.js.map +7 -0
  31. package/dist/modules/documents/api/[id]/principals/route.js +299 -0
  32. package/dist/modules/documents/api/[id]/principals/route.js.map +7 -0
  33. package/dist/modules/documents/api/[id]/route.js +246 -0
  34. package/dist/modules/documents/api/[id]/route.js.map +7 -0
  35. package/dist/modules/documents/api/[id]/shares/route.js +335 -0
  36. package/dist/modules/documents/api/[id]/shares/route.js.map +7 -0
  37. package/dist/modules/documents/api/[id]/unarchive/route.js +39 -0
  38. package/dist/modules/documents/api/[id]/unarchive/route.js.map +7 -0
  39. package/dist/modules/documents/api/[id]/versions/[versionId]/restore/route.js +133 -0
  40. package/dist/modules/documents/api/[id]/versions/[versionId]/restore/route.js.map +7 -0
  41. package/dist/modules/documents/api/[id]/versions/[versionId]/route.js +93 -0
  42. package/dist/modules/documents/api/[id]/versions/[versionId]/route.js.map +7 -0
  43. package/dist/modules/documents/api/[id]/versions/route.js +193 -0
  44. package/dist/modules/documents/api/[id]/versions/route.js.map +7 -0
  45. package/dist/modules/documents/api/[id]/watch/route.js +97 -0
  46. package/dist/modules/documents/api/[id]/watch/route.js.map +7 -0
  47. package/dist/modules/documents/api/_commands.js +34 -0
  48. package/dist/modules/documents/api/_commands.js.map +7 -0
  49. package/dist/modules/documents/api/_shared.js +490 -0
  50. package/dist/modules/documents/api/_shared.js.map +7 -0
  51. package/dist/modules/documents/api/folders/route.js +256 -0
  52. package/dist/modules/documents/api/folders/route.js.map +7 -0
  53. package/dist/modules/documents/api/instantiate/route.js +108 -0
  54. package/dist/modules/documents/api/instantiate/route.js.map +7 -0
  55. package/dist/modules/documents/api/route.js +322 -0
  56. package/dist/modules/documents/api/route.js.map +7 -0
  57. package/dist/modules/documents/api/templates/[templateId]/preview/route.js +94 -0
  58. package/dist/modules/documents/api/templates/[templateId]/preview/route.js.map +7 -0
  59. package/dist/modules/documents/api/templates/[templateId]/route.js +82 -0
  60. package/dist/modules/documents/api/templates/[templateId]/route.js.map +7 -0
  61. package/dist/modules/documents/api/templates/route.js +344 -0
  62. package/dist/modules/documents/api/templates/route.js.map +7 -0
  63. package/dist/modules/documents/backend/documents/DocumentsPageClient.js +160 -0
  64. package/dist/modules/documents/backend/documents/DocumentsPageClient.js.map +7 -0
  65. package/dist/modules/documents/backend/documents/DocumentsTable.js +143 -0
  66. package/dist/modules/documents/backend/documents/DocumentsTable.js.map +7 -0
  67. package/dist/modules/documents/backend/documents/FolderDialog.js +55 -0
  68. package/dist/modules/documents/backend/documents/FolderDialog.js.map +7 -0
  69. package/dist/modules/documents/backend/documents/FolderTree.js +40 -0
  70. package/dist/modules/documents/backend/documents/FolderTree.js.map +7 -0
  71. package/dist/modules/documents/backend/documents/MoveDocumentDialog.js +64 -0
  72. package/dist/modules/documents/backend/documents/MoveDocumentDialog.js.map +7 -0
  73. package/dist/modules/documents/backend/documents/[id]/CommentAnchorNavigation.js +77 -0
  74. package/dist/modules/documents/backend/documents/[id]/CommentAnchorNavigation.js.map +7 -0
  75. package/dist/modules/documents/backend/documents/[id]/CommentComposer.js +126 -0
  76. package/dist/modules/documents/backend/documents/[id]/CommentComposer.js.map +7 -0
  77. package/dist/modules/documents/backend/documents/[id]/CommentThreadList.js +88 -0
  78. package/dist/modules/documents/backend/documents/[id]/CommentThreadList.js.map +7 -0
  79. package/dist/modules/documents/backend/documents/[id]/CommentsRail.js +123 -0
  80. package/dist/modules/documents/backend/documents/[id]/CommentsRail.js.map +7 -0
  81. package/dist/modules/documents/backend/documents/[id]/DocumentCanvas.js +91 -0
  82. package/dist/modules/documents/backend/documents/[id]/DocumentCanvas.js.map +7 -0
  83. package/dist/modules/documents/backend/documents/[id]/DocumentEditorErrorBoundary.js +27 -0
  84. package/dist/modules/documents/backend/documents/[id]/DocumentEditorErrorBoundary.js.map +7 -0
  85. package/dist/modules/documents/backend/documents/[id]/DocumentEditorIsland.js +50 -0
  86. package/dist/modules/documents/backend/documents/[id]/DocumentEditorIsland.js.map +7 -0
  87. package/dist/modules/documents/backend/documents/[id]/DocumentEditorSurface.js +168 -0
  88. package/dist/modules/documents/backend/documents/[id]/DocumentEditorSurface.js.map +7 -0
  89. package/dist/modules/documents/backend/documents/[id]/DocumentNavigator.js +129 -0
  90. package/dist/modules/documents/backend/documents/[id]/DocumentNavigator.js.map +7 -0
  91. package/dist/modules/documents/backend/documents/[id]/DocumentPageClient.js +429 -0
  92. package/dist/modules/documents/backend/documents/[id]/DocumentPageClient.js.map +7 -0
  93. package/dist/modules/documents/backend/documents/[id]/EditorColorTools.js +68 -0
  94. package/dist/modules/documents/backend/documents/[id]/EditorColorTools.js.map +7 -0
  95. package/dist/modules/documents/backend/documents/[id]/EditorStatusPresence.js +69 -0
  96. package/dist/modules/documents/backend/documents/[id]/EditorStatusPresence.js.map +7 -0
  97. package/dist/modules/documents/backend/documents/[id]/EditorToolbar.js +151 -0
  98. package/dist/modules/documents/backend/documents/[id]/EditorToolbar.js.map +7 -0
  99. package/dist/modules/documents/backend/documents/[id]/ExportMenu.js +121 -0
  100. package/dist/modules/documents/backend/documents/[id]/ExportMenu.js.map +7 -0
  101. package/dist/modules/documents/backend/documents/[id]/MentionPicker.js +114 -0
  102. package/dist/modules/documents/backend/documents/[id]/MentionPicker.js.map +7 -0
  103. package/dist/modules/documents/backend/documents/[id]/OutlinePane.js +70 -0
  104. package/dist/modules/documents/backend/documents/[id]/OutlinePane.js.map +7 -0
  105. package/dist/modules/documents/backend/documents/[id]/RecordFieldsDialog.js +157 -0
  106. package/dist/modules/documents/backend/documents/[id]/RecordFieldsDialog.js.map +7 -0
  107. package/dist/modules/documents/backend/documents/[id]/RelatedRecordsPanel.js +266 -0
  108. package/dist/modules/documents/backend/documents/[id]/RelatedRecordsPanel.js.map +7 -0
  109. package/dist/modules/documents/backend/documents/[id]/VersionHistoryPanel.js +227 -0
  110. package/dist/modules/documents/backend/documents/[id]/VersionHistoryPanel.js.map +7 -0
  111. package/dist/modules/documents/backend/documents/[id]/VersionPreviewDialog.js +157 -0
  112. package/dist/modules/documents/backend/documents/[id]/VersionPreviewDialog.js.map +7 -0
  113. package/dist/modules/documents/backend/documents/[id]/commentTypes.js +150 -0
  114. package/dist/modules/documents/backend/documents/[id]/commentTypes.js.map +7 -0
  115. package/dist/modules/documents/backend/documents/[id]/componentCapabilities.js +13 -0
  116. package/dist/modules/documents/backend/documents/[id]/componentCapabilities.js.map +7 -0
  117. package/dist/modules/documents/backend/documents/[id]/documentPagination.js +295 -0
  118. package/dist/modules/documents/backend/documents/[id]/documentPagination.js.map +7 -0
  119. package/dist/modules/documents/backend/documents/[id]/editorPresenceStyles.js +81 -0
  120. package/dist/modules/documents/backend/documents/[id]/editorPresenceStyles.js.map +7 -0
  121. package/dist/modules/documents/backend/documents/[id]/editorTypes.js +52 -0
  122. package/dist/modules/documents/backend/documents/[id]/editorTypes.js.map +7 -0
  123. package/dist/modules/documents/backend/documents/[id]/page.js +10 -0
  124. package/dist/modules/documents/backend/documents/[id]/page.js.map +7 -0
  125. package/dist/modules/documents/backend/documents/[id]/page.meta.js +16 -0
  126. package/dist/modules/documents/backend/documents/[id]/page.meta.js.map +7 -0
  127. package/dist/modules/documents/backend/documents/[id]/relatedRecordModel.js +38 -0
  128. package/dist/modules/documents/backend/documents/[id]/relatedRecordModel.js.map +7 -0
  129. package/dist/modules/documents/backend/documents/[id]/restoreVersion.js +33 -0
  130. package/dist/modules/documents/backend/documents/[id]/restoreVersion.js.map +7 -0
  131. package/dist/modules/documents/backend/documents/[id]/useDocumentCollaboration.js +392 -0
  132. package/dist/modules/documents/backend/documents/[id]/useDocumentCollaboration.js.map +7 -0
  133. package/dist/modules/documents/backend/documents/[id]/useDocumentComments.js +253 -0
  134. package/dist/modules/documents/backend/documents/[id]/useDocumentComments.js.map +7 -0
  135. package/dist/modules/documents/backend/documents/[id]/useDocumentEditor.js +149 -0
  136. package/dist/modules/documents/backend/documents/[id]/useDocumentEditor.js.map +7 -0
  137. package/dist/modules/documents/backend/documents/[id]/useDocumentTitle.js +82 -0
  138. package/dist/modules/documents/backend/documents/[id]/useDocumentTitle.js.map +7 -0
  139. package/dist/modules/documents/backend/documents/[id]/useEditorInsertions.js +144 -0
  140. package/dist/modules/documents/backend/documents/[id]/useEditorInsertions.js.map +7 -0
  141. package/dist/modules/documents/backend/documents/[id]/useFallbackContentPersistence.js +237 -0
  142. package/dist/modules/documents/backend/documents/[id]/useFallbackContentPersistence.js.map +7 -0
  143. package/dist/modules/documents/backend/documents/[id]/useMentionPicker.js +216 -0
  144. package/dist/modules/documents/backend/documents/[id]/useMentionPicker.js.map +7 -0
  145. package/dist/modules/documents/backend/documents/[id]/versionHistoryModel.js +25 -0
  146. package/dist/modules/documents/backend/documents/[id]/versionHistoryModel.js.map +7 -0
  147. package/dist/modules/documents/backend/documents/components/EntityPicker.js +156 -0
  148. package/dist/modules/documents/backend/documents/components/EntityPicker.js.map +7 -0
  149. package/dist/modules/documents/backend/documents/components/EntityPickerResults.js +46 -0
  150. package/dist/modules/documents/backend/documents/components/EntityPickerResults.js.map +7 -0
  151. package/dist/modules/documents/backend/documents/components/NewFromTemplateDialog.js +127 -0
  152. package/dist/modules/documents/backend/documents/components/NewFromTemplateDialog.js.map +7 -0
  153. package/dist/modules/documents/backend/documents/components/PrincipalPicker.js +84 -0
  154. package/dist/modules/documents/backend/documents/components/PrincipalPicker.js.map +7 -0
  155. package/dist/modules/documents/backend/documents/components/ShareDialog.js +77 -0
  156. package/dist/modules/documents/backend/documents/components/ShareDialog.js.map +7 -0
  157. package/dist/modules/documents/backend/documents/components/ShareDialogAddForm.js +93 -0
  158. package/dist/modules/documents/backend/documents/components/ShareDialogAddForm.js.map +7 -0
  159. package/dist/modules/documents/backend/documents/components/ShareDialogList.js +82 -0
  160. package/dist/modules/documents/backend/documents/components/ShareDialogList.js.map +7 -0
  161. package/dist/modules/documents/backend/documents/components/TemplateBodyEditor.js +96 -0
  162. package/dist/modules/documents/backend/documents/components/TemplateBodyEditor.js.map +7 -0
  163. package/dist/modules/documents/backend/documents/components/TemplateEditorDialog.js +169 -0
  164. package/dist/modules/documents/backend/documents/components/TemplateEditorDialog.js.map +7 -0
  165. package/dist/modules/documents/backend/documents/components/TemplatePreview.js +38 -0
  166. package/dist/modules/documents/backend/documents/components/TemplatePreview.js.map +7 -0
  167. package/dist/modules/documents/backend/documents/components/TemplateSlotFields.js +69 -0
  168. package/dist/modules/documents/backend/documents/components/TemplateSlotFields.js.map +7 -0
  169. package/dist/modules/documents/backend/documents/components/TemplateSlotsEditor.js +71 -0
  170. package/dist/modules/documents/backend/documents/components/TemplateSlotsEditor.js.map +7 -0
  171. package/dist/modules/documents/backend/documents/components/principalPickerModel.js +63 -0
  172. package/dist/modules/documents/backend/documents/components/principalPickerModel.js.map +7 -0
  173. package/dist/modules/documents/backend/documents/components/shareDialogModel.js +68 -0
  174. package/dist/modules/documents/backend/documents/components/shareDialogModel.js.map +7 -0
  175. package/dist/modules/documents/backend/documents/components/templateUi.js +89 -0
  176. package/dist/modules/documents/backend/documents/components/templateUi.js.map +7 -0
  177. package/dist/modules/documents/backend/documents/components/useAvailableEntityRegistry.js +30 -0
  178. package/dist/modules/documents/backend/documents/components/useAvailableEntityRegistry.js.map +7 -0
  179. package/dist/modules/documents/backend/documents/components/useEntitySearch.js +191 -0
  180. package/dist/modules/documents/backend/documents/components/useEntitySearch.js.map +7 -0
  181. package/dist/modules/documents/backend/documents/components/usePrincipalPicker.js +221 -0
  182. package/dist/modules/documents/backend/documents/components/usePrincipalPicker.js.map +7 -0
  183. package/dist/modules/documents/backend/documents/components/useShareDialog.js +236 -0
  184. package/dist/modules/documents/backend/documents/components/useShareDialog.js.map +7 -0
  185. package/dist/modules/documents/backend/documents/components/useTemplateDetail.js +49 -0
  186. package/dist/modules/documents/backend/documents/components/useTemplateDetail.js.map +7 -0
  187. package/dist/modules/documents/backend/documents/components/useTemplateInstantiation.js +234 -0
  188. package/dist/modules/documents/backend/documents/components/useTemplateInstantiation.js.map +7 -0
  189. package/dist/modules/documents/backend/documents/documentUi.js +106 -0
  190. package/dist/modules/documents/backend/documents/documentUi.js.map +7 -0
  191. package/dist/modules/documents/backend/documents/documentsListTypes.js +132 -0
  192. package/dist/modules/documents/backend/documents/documentsListTypes.js.map +7 -0
  193. package/dist/modules/documents/backend/documents/page.js +9 -0
  194. package/dist/modules/documents/backend/documents/page.js.map +7 -0
  195. package/dist/modules/documents/backend/documents/page.meta.js +26 -0
  196. package/dist/modules/documents/backend/documents/page.meta.js.map +7 -0
  197. package/dist/modules/documents/backend/documents/templates/TemplatesPageClient.js +91 -0
  198. package/dist/modules/documents/backend/documents/templates/TemplatesPageClient.js.map +7 -0
  199. package/dist/modules/documents/backend/documents/templates/TemplatesTable.js +58 -0
  200. package/dist/modules/documents/backend/documents/templates/TemplatesTable.js.map +7 -0
  201. package/dist/modules/documents/backend/documents/templates/page.js +9 -0
  202. package/dist/modules/documents/backend/documents/templates/page.js.map +7 -0
  203. package/dist/modules/documents/backend/documents/templates/page.meta.js +34 -0
  204. package/dist/modules/documents/backend/documents/templates/page.meta.js.map +7 -0
  205. package/dist/modules/documents/backend/documents/templates/useTemplatesPage.js +139 -0
  206. package/dist/modules/documents/backend/documents/templates/useTemplatesPage.js.map +7 -0
  207. package/dist/modules/documents/backend/documents/useDocumentsList.js +314 -0
  208. package/dist/modules/documents/backend/documents/useDocumentsList.js.map +7 -0
  209. package/dist/modules/documents/ce.js +8 -0
  210. package/dist/modules/documents/ce.js.map +7 -0
  211. package/dist/modules/documents/commands/aggregate.js +99 -0
  212. package/dist/modules/documents/commands/aggregate.js.map +7 -0
  213. package/dist/modules/documents/commands/attachments.js +252 -0
  214. package/dist/modules/documents/commands/attachments.js.map +7 -0
  215. package/dist/modules/documents/commands/comments.js +782 -0
  216. package/dist/modules/documents/commands/comments.js.map +7 -0
  217. package/dist/modules/documents/commands/content.js +238 -0
  218. package/dist/modules/documents/commands/content.js.map +7 -0
  219. package/dist/modules/documents/commands/document-crud.js +505 -0
  220. package/dist/modules/documents/commands/document-crud.js.map +7 -0
  221. package/dist/modules/documents/commands/documents.js +473 -0
  222. package/dist/modules/documents/commands/documents.js.map +7 -0
  223. package/dist/modules/documents/commands/duplicate.js +640 -0
  224. package/dist/modules/documents/commands/duplicate.js.map +7 -0
  225. package/dist/modules/documents/commands/favorites.js +150 -0
  226. package/dist/modules/documents/commands/favorites.js.map +7 -0
  227. package/dist/modules/documents/commands/folders.js +420 -0
  228. package/dist/modules/documents/commands/folders.js.map +7 -0
  229. package/dist/modules/documents/commands/index.js +64 -0
  230. package/dist/modules/documents/commands/index.js.map +7 -0
  231. package/dist/modules/documents/commands/interceptors.js +300 -0
  232. package/dist/modules/documents/commands/interceptors.js.map +7 -0
  233. package/dist/modules/documents/commands/lifecycle.js +249 -0
  234. package/dist/modules/documents/commands/lifecycle.js.map +7 -0
  235. package/dist/modules/documents/commands/links.js +410 -0
  236. package/dist/modules/documents/commands/links.js.map +7 -0
  237. package/dist/modules/documents/commands/mutation-helpers.js +42 -0
  238. package/dist/modules/documents/commands/mutation-helpers.js.map +7 -0
  239. package/dist/modules/documents/commands/projection-types.js +1 -0
  240. package/dist/modules/documents/commands/projection-types.js.map +7 -0
  241. package/dist/modules/documents/commands/shared.js +143 -0
  242. package/dist/modules/documents/commands/shared.js.map +7 -0
  243. package/dist/modules/documents/commands/shares.js +527 -0
  244. package/dist/modules/documents/commands/shares.js.map +7 -0
  245. package/dist/modules/documents/commands/side-effects.js +103 -0
  246. package/dist/modules/documents/commands/side-effects.js.map +7 -0
  247. package/dist/modules/documents/commands/templates.js +461 -0
  248. package/dist/modules/documents/commands/templates.js.map +7 -0
  249. package/dist/modules/documents/commands/versions.js +432 -0
  250. package/dist/modules/documents/commands/versions.js.map +7 -0
  251. package/dist/modules/documents/commands/watchers.js +164 -0
  252. package/dist/modules/documents/commands/watchers.js.map +7 -0
  253. package/dist/modules/documents/data/entities.js +653 -0
  254. package/dist/modules/documents/data/entities.js.map +7 -0
  255. package/dist/modules/documents/data/extensions.js +44 -0
  256. package/dist/modules/documents/data/extensions.js.map +7 -0
  257. package/dist/modules/documents/data/validators.js +219 -0
  258. package/dist/modules/documents/data/validators.js.map +7 -0
  259. package/dist/modules/documents/di.js +35 -0
  260. package/dist/modules/documents/di.js.map +7 -0
  261. package/dist/modules/documents/encryption.js +12 -0
  262. package/dist/modules/documents/encryption.js.map +7 -0
  263. package/dist/modules/documents/events.js +27 -0
  264. package/dist/modules/documents/events.js.map +7 -0
  265. package/dist/modules/documents/index.js +19 -0
  266. package/dist/modules/documents/index.js.map +7 -0
  267. package/dist/modules/documents/lib/attachmentServicePort.js +30 -0
  268. package/dist/modules/documents/lib/attachmentServicePort.js.map +7 -0
  269. package/dist/modules/documents/lib/capabilities.js +32 -0
  270. package/dist/modules/documents/lib/capabilities.js.map +7 -0
  271. package/dist/modules/documents/lib/collabCloseEvents.js +17 -0
  272. package/dist/modules/documents/lib/collabCloseEvents.js.map +7 -0
  273. package/dist/modules/documents/lib/collabEndpoint.js +22 -0
  274. package/dist/modules/documents/lib/collabEndpoint.js.map +7 -0
  275. package/dist/modules/documents/lib/collabMaterializer.js +107 -0
  276. package/dist/modules/documents/lib/collabMaterializer.js.map +7 -0
  277. package/dist/modules/documents/lib/collabToken.js +120 -0
  278. package/dist/modules/documents/lib/collabToken.js.map +7 -0
  279. package/dist/modules/documents/lib/collaborationAwareness.js +68 -0
  280. package/dist/modules/documents/lib/collaborationAwareness.js.map +7 -0
  281. package/dist/modules/documents/lib/commentAnchors.js +15 -0
  282. package/dist/modules/documents/lib/commentAnchors.js.map +7 -0
  283. package/dist/modules/documents/lib/constants.js +25 -0
  284. package/dist/modules/documents/lib/constants.js.map +7 -0
  285. package/dist/modules/documents/lib/contentService.js +248 -0
  286. package/dist/modules/documents/lib/contentService.js.map +7 -0
  287. package/dist/modules/documents/lib/displayLabels.js +23 -0
  288. package/dist/modules/documents/lib/displayLabels.js.map +7 -0
  289. package/dist/modules/documents/lib/docxRenderer.js +601 -0
  290. package/dist/modules/documents/lib/docxRenderer.js.map +7 -0
  291. package/dist/modules/documents/lib/duplicateContent.js +22 -0
  292. package/dist/modules/documents/lib/duplicateContent.js.map +7 -0
  293. package/dist/modules/documents/lib/editorConfig.js +287 -0
  294. package/dist/modules/documents/lib/editorConfig.js.map +7 -0
  295. package/dist/modules/documents/lib/entityLinks.js +148 -0
  296. package/dist/modules/documents/lib/entityLinks.js.map +7 -0
  297. package/dist/modules/documents/lib/entityRegistry.js +258 -0
  298. package/dist/modules/documents/lib/entityRegistry.js.map +7 -0
  299. package/dist/modules/documents/lib/entityRegistry.server.js +189 -0
  300. package/dist/modules/documents/lib/entityRegistry.server.js.map +7 -0
  301. package/dist/modules/documents/lib/entityRegistryAvailability.server.js +9 -0
  302. package/dist/modules/documents/lib/entityRegistryAvailability.server.js.map +7 -0
  303. package/dist/modules/documents/lib/entitySuggestion.js +50 -0
  304. package/dist/modules/documents/lib/entitySuggestion.js.map +7 -0
  305. package/dist/modules/documents/lib/favorites.js +22 -0
  306. package/dist/modules/documents/lib/favorites.js.map +7 -0
  307. package/dist/modules/documents/lib/folderHierarchySerialization.js +19 -0
  308. package/dist/modules/documents/lib/folderHierarchySerialization.js.map +7 -0
  309. package/dist/modules/documents/lib/historyLimits.js +100 -0
  310. package/dist/modules/documents/lib/historyLimits.js.map +7 -0
  311. package/dist/modules/documents/lib/historyPolicy.js +14 -0
  312. package/dist/modules/documents/lib/historyPolicy.js.map +7 -0
  313. package/dist/modules/documents/lib/organizationAccess.js +17 -0
  314. package/dist/modules/documents/lib/organizationAccess.js.map +7 -0
  315. package/dist/modules/documents/lib/pdfHtml.js +62 -0
  316. package/dist/modules/documents/lib/pdfHtml.js.map +7 -0
  317. package/dist/modules/documents/lib/pdfRenderer.js +284 -0
  318. package/dist/modules/documents/lib/pdfRenderer.js.map +7 -0
  319. package/dist/modules/documents/lib/permissions.js +222 -0
  320. package/dist/modules/documents/lib/permissions.js.map +7 -0
  321. package/dist/modules/documents/lib/platformServices.js +35 -0
  322. package/dist/modules/documents/lib/platformServices.js.map +7 -0
  323. package/dist/modules/documents/lib/recordFieldInsertion.js +58 -0
  324. package/dist/modules/documents/lib/recordFieldInsertion.js.map +7 -0
  325. package/dist/modules/documents/lib/requestBody.js +80 -0
  326. package/dist/modules/documents/lib/requestBody.js.map +7 -0
  327. package/dist/modules/documents/lib/resourceLimits.js +62 -0
  328. package/dist/modules/documents/lib/resourceLimits.js.map +7 -0
  329. package/dist/modules/documents/lib/shareCounts.js +25 -0
  330. package/dist/modules/documents/lib/shareCounts.js.map +7 -0
  331. package/dist/modules/documents/lib/templateFill.js +84 -0
  332. package/dist/modules/documents/lib/templateFill.js.map +7 -0
  333. package/dist/modules/documents/lib/templateInstantiation.js +147 -0
  334. package/dist/modules/documents/lib/templateInstantiation.js.map +7 -0
  335. package/dist/modules/documents/lib/templatePreviewDigest.js +82 -0
  336. package/dist/modules/documents/lib/templatePreviewDigest.js.map +7 -0
  337. package/dist/modules/documents/lib/templateSeeds.js +201 -0
  338. package/dist/modules/documents/lib/templateSeeds.js.map +7 -0
  339. package/dist/modules/documents/lib/userLabels.js +37 -0
  340. package/dist/modules/documents/lib/userLabels.js.map +7 -0
  341. package/dist/modules/documents/lib/versionContent.js +131 -0
  342. package/dist/modules/documents/lib/versionContent.js.map +7 -0
  343. package/dist/modules/documents/lib/versionLabels.js +12 -0
  344. package/dist/modules/documents/lib/versionLabels.js.map +7 -0
  345. package/dist/modules/documents/lib/versioning.js +14 -0
  346. package/dist/modules/documents/lib/versioning.js.map +7 -0
  347. package/dist/modules/documents/lib/visibility.js +422 -0
  348. package/dist/modules/documents/lib/visibility.js.map +7 -0
  349. package/dist/modules/documents/lib/watchers.js +106 -0
  350. package/dist/modules/documents/lib/watchers.js.map +7 -0
  351. package/dist/modules/documents/migrations/Migration20260708163836_documents.js +44 -0
  352. package/dist/modules/documents/migrations/Migration20260708163836_documents.js.map +7 -0
  353. package/dist/modules/documents/migrations/Migration20260709164720_documents.js +17 -0
  354. package/dist/modules/documents/migrations/Migration20260709164720_documents.js.map +7 -0
  355. package/dist/modules/documents/migrations/Migration20260710002318_documents.js +32 -0
  356. package/dist/modules/documents/migrations/Migration20260710002318_documents.js.map +7 -0
  357. package/dist/modules/documents/migrations/Migration20260710071003_documents.js +13 -0
  358. package/dist/modules/documents/migrations/Migration20260710071003_documents.js.map +7 -0
  359. package/dist/modules/documents/migrations/Migration20260712120000_documents.js +13 -0
  360. package/dist/modules/documents/migrations/Migration20260712120000_documents.js.map +7 -0
  361. package/dist/modules/documents/migrations/Migration20260712183000_documents.js +14 -0
  362. package/dist/modules/documents/migrations/Migration20260712183000_documents.js.map +7 -0
  363. package/dist/modules/documents/migrations/Migration20260713092156_documents.js +29 -0
  364. package/dist/modules/documents/migrations/Migration20260713092156_documents.js.map +7 -0
  365. package/dist/modules/documents/migrations/Migration20260717000000_documents.js +37 -0
  366. package/dist/modules/documents/migrations/Migration20260717000000_documents.js.map +7 -0
  367. package/dist/modules/documents/notifications.js +47 -0
  368. package/dist/modules/documents/notifications.js.map +7 -0
  369. package/dist/modules/documents/search.js +101 -0
  370. package/dist/modules/documents/search.js.map +7 -0
  371. package/dist/modules/documents/setup.js +19 -0
  372. package/dist/modules/documents/setup.js.map +7 -0
  373. package/dist/modules/documents/widgets/injection/related-documents/LinkDocumentDialog.js +214 -0
  374. package/dist/modules/documents/widgets/injection/related-documents/LinkDocumentDialog.js.map +7 -0
  375. package/dist/modules/documents/widgets/injection/related-documents/context.js +84 -0
  376. package/dist/modules/documents/widgets/injection/related-documents/context.js.map +7 -0
  377. package/dist/modules/documents/widgets/injection/related-documents/useRelatedDocuments.js +98 -0
  378. package/dist/modules/documents/widgets/injection/related-documents/useRelatedDocuments.js.map +7 -0
  379. package/dist/modules/documents/widgets/injection/related-documents/widget.client.js +83 -0
  380. package/dist/modules/documents/widgets/injection/related-documents/widget.client.js.map +7 -0
  381. package/dist/modules/documents/widgets/injection/related-documents/widget.js +19 -0
  382. package/dist/modules/documents/widgets/injection/related-documents/widget.js.map +7 -0
  383. package/dist/modules/documents/widgets/injection-table.js +21 -0
  384. package/dist/modules/documents/widgets/injection-table.js.map +7 -0
  385. package/dist/server/documents-collab-server.js +2260 -0
  386. package/dist/server/documents-collab-server.js.map +7 -0
  387. package/generated/entities/document/index.ts +12 -0
  388. package/generated/entities/document_attachment/index.ts +9 -0
  389. package/generated/entities/document_comment/index.ts +14 -0
  390. package/generated/entities/document_content/index.ts +11 -0
  391. package/generated/entities/document_entity_link/index.ts +19 -0
  392. package/generated/entities/document_favorite/index.ts +7 -0
  393. package/generated/entities/document_folder/index.ts +9 -0
  394. package/generated/entities/document_share/index.ts +11 -0
  395. package/generated/entities/document_template/index.ts +13 -0
  396. package/generated/entities/document_version/index.ts +9 -0
  397. package/generated/entities/document_watcher/index.ts +7 -0
  398. package/generated/entities.ids.generated.ts +21 -0
  399. package/generated/entity-fields-registry.ts +151 -0
  400. package/jest.config.cjs +34 -0
  401. package/package.json +149 -0
  402. package/server/documents-collab-server.ts +3416 -0
  403. package/src/index.ts +1 -0
  404. package/src/modules/documents/acl.ts +11 -0
  405. package/src/modules/documents/api/[id]/archive/route.ts +132 -0
  406. package/src/modules/documents/api/[id]/attachments/[attachmentId]/route.ts +166 -0
  407. package/src/modules/documents/api/[id]/attachments/route.ts +173 -0
  408. package/src/modules/documents/api/[id]/collab-token/route.ts +203 -0
  409. package/src/modules/documents/api/[id]/comments/access-check/route.ts +96 -0
  410. package/src/modules/documents/api/[id]/comments/route.ts +442 -0
  411. package/src/modules/documents/api/[id]/content/route.ts +156 -0
  412. package/src/modules/documents/api/[id]/duplicate/route.ts +231 -0
  413. package/src/modules/documents/api/[id]/export/route.ts +535 -0
  414. package/src/modules/documents/api/[id]/favorite/route.ts +110 -0
  415. package/src/modules/documents/api/[id]/links/[linkId]/route.ts +92 -0
  416. package/src/modules/documents/api/[id]/links/route.ts +301 -0
  417. package/src/modules/documents/api/[id]/principals/route.ts +375 -0
  418. package/src/modules/documents/api/[id]/route.ts +267 -0
  419. package/src/modules/documents/api/[id]/shares/route.ts +372 -0
  420. package/src/modules/documents/api/[id]/unarchive/route.ts +42 -0
  421. package/src/modules/documents/api/[id]/versions/[versionId]/restore/route.ts +152 -0
  422. package/src/modules/documents/api/[id]/versions/[versionId]/route.ts +100 -0
  423. package/src/modules/documents/api/[id]/versions/route.ts +207 -0
  424. package/src/modules/documents/api/[id]/watch/route.ts +111 -0
  425. package/src/modules/documents/api/_commands.ts +53 -0
  426. package/src/modules/documents/api/_shared.ts +676 -0
  427. package/src/modules/documents/api/folders/route.ts +287 -0
  428. package/src/modules/documents/api/instantiate/route.ts +114 -0
  429. package/src/modules/documents/api/route.ts +362 -0
  430. package/src/modules/documents/api/templates/[templateId]/preview/route.ts +97 -0
  431. package/src/modules/documents/api/templates/[templateId]/route.ts +92 -0
  432. package/src/modules/documents/api/templates/route.ts +370 -0
  433. package/src/modules/documents/backend/documents/DocumentsPageClient.tsx +150 -0
  434. package/src/modules/documents/backend/documents/DocumentsTable.tsx +168 -0
  435. package/src/modules/documents/backend/documents/FolderDialog.tsx +62 -0
  436. package/src/modules/documents/backend/documents/FolderTree.tsx +72 -0
  437. package/src/modules/documents/backend/documents/MoveDocumentDialog.tsx +70 -0
  438. package/src/modules/documents/backend/documents/[id]/CommentAnchorNavigation.ts +88 -0
  439. package/src/modules/documents/backend/documents/[id]/CommentComposer.tsx +136 -0
  440. package/src/modules/documents/backend/documents/[id]/CommentThreadList.tsx +131 -0
  441. package/src/modules/documents/backend/documents/[id]/CommentsRail.tsx +138 -0
  442. package/src/modules/documents/backend/documents/[id]/DocumentCanvas.tsx +111 -0
  443. package/src/modules/documents/backend/documents/[id]/DocumentEditorErrorBoundary.tsx +39 -0
  444. package/src/modules/documents/backend/documents/[id]/DocumentEditorIsland.tsx +50 -0
  445. package/src/modules/documents/backend/documents/[id]/DocumentEditorSurface.tsx +162 -0
  446. package/src/modules/documents/backend/documents/[id]/DocumentNavigator.tsx +129 -0
  447. package/src/modules/documents/backend/documents/[id]/DocumentPageClient.tsx +463 -0
  448. package/src/modules/documents/backend/documents/[id]/EditorColorTools.tsx +71 -0
  449. package/src/modules/documents/backend/documents/[id]/EditorStatusPresence.tsx +78 -0
  450. package/src/modules/documents/backend/documents/[id]/EditorToolbar.tsx +108 -0
  451. package/src/modules/documents/backend/documents/[id]/ExportMenu.tsx +144 -0
  452. package/src/modules/documents/backend/documents/[id]/MentionPicker.tsx +137 -0
  453. package/src/modules/documents/backend/documents/[id]/OutlinePane.tsx +98 -0
  454. package/src/modules/documents/backend/documents/[id]/RecordFieldsDialog.tsx +185 -0
  455. package/src/modules/documents/backend/documents/[id]/RelatedRecordsPanel.tsx +320 -0
  456. package/src/modules/documents/backend/documents/[id]/VersionHistoryPanel.tsx +244 -0
  457. package/src/modules/documents/backend/documents/[id]/VersionPreviewDialog.tsx +197 -0
  458. package/src/modules/documents/backend/documents/[id]/commentTypes.ts +192 -0
  459. package/src/modules/documents/backend/documents/[id]/componentCapabilities.ts +17 -0
  460. package/src/modules/documents/backend/documents/[id]/documentPagination.ts +352 -0
  461. package/src/modules/documents/backend/documents/[id]/editorPresenceStyles.ts +77 -0
  462. package/src/modules/documents/backend/documents/[id]/editorTypes.ts +84 -0
  463. package/src/modules/documents/backend/documents/[id]/page.meta.ts +12 -0
  464. package/src/modules/documents/backend/documents/[id]/page.tsx +6 -0
  465. package/src/modules/documents/backend/documents/[id]/relatedRecordModel.ts +49 -0
  466. package/src/modules/documents/backend/documents/[id]/restoreVersion.ts +49 -0
  467. package/src/modules/documents/backend/documents/[id]/useDocumentCollaboration.ts +458 -0
  468. package/src/modules/documents/backend/documents/[id]/useDocumentComments.ts +286 -0
  469. package/src/modules/documents/backend/documents/[id]/useDocumentEditor.ts +157 -0
  470. package/src/modules/documents/backend/documents/[id]/useDocumentTitle.ts +77 -0
  471. package/src/modules/documents/backend/documents/[id]/useEditorInsertions.ts +147 -0
  472. package/src/modules/documents/backend/documents/[id]/useFallbackContentPersistence.ts +277 -0
  473. package/src/modules/documents/backend/documents/[id]/useMentionPicker.ts +259 -0
  474. package/src/modules/documents/backend/documents/[id]/versionHistoryModel.ts +29 -0
  475. package/src/modules/documents/backend/documents/components/EntityPicker.tsx +171 -0
  476. package/src/modules/documents/backend/documents/components/EntityPickerResults.tsx +64 -0
  477. package/src/modules/documents/backend/documents/components/NewFromTemplateDialog.tsx +136 -0
  478. package/src/modules/documents/backend/documents/components/PrincipalPicker.tsx +90 -0
  479. package/src/modules/documents/backend/documents/components/ShareDialog.tsx +88 -0
  480. package/src/modules/documents/backend/documents/components/ShareDialogAddForm.tsx +113 -0
  481. package/src/modules/documents/backend/documents/components/ShareDialogList.tsx +117 -0
  482. package/src/modules/documents/backend/documents/components/TemplateBodyEditor.tsx +96 -0
  483. package/src/modules/documents/backend/documents/components/TemplateEditorDialog.tsx +171 -0
  484. package/src/modules/documents/backend/documents/components/TemplatePreview.tsx +43 -0
  485. package/src/modules/documents/backend/documents/components/TemplateSlotFields.tsx +72 -0
  486. package/src/modules/documents/backend/documents/components/TemplateSlotsEditor.tsx +72 -0
  487. package/src/modules/documents/backend/documents/components/principalPickerModel.ts +86 -0
  488. package/src/modules/documents/backend/documents/components/shareDialogModel.ts +94 -0
  489. package/src/modules/documents/backend/documents/components/templateUi.ts +128 -0
  490. package/src/modules/documents/backend/documents/components/useAvailableEntityRegistry.ts +43 -0
  491. package/src/modules/documents/backend/documents/components/useEntitySearch.ts +197 -0
  492. package/src/modules/documents/backend/documents/components/usePrincipalPicker.ts +165 -0
  493. package/src/modules/documents/backend/documents/components/useShareDialog.ts +267 -0
  494. package/src/modules/documents/backend/documents/components/useTemplateDetail.ts +54 -0
  495. package/src/modules/documents/backend/documents/components/useTemplateInstantiation.ts +252 -0
  496. package/src/modules/documents/backend/documents/documentUi.ts +134 -0
  497. package/src/modules/documents/backend/documents/documentsListTypes.ts +163 -0
  498. package/src/modules/documents/backend/documents/page.meta.ts +24 -0
  499. package/src/modules/documents/backend/documents/page.tsx +5 -0
  500. package/src/modules/documents/backend/documents/templates/TemplatesPageClient.tsx +93 -0
  501. package/src/modules/documents/backend/documents/templates/TemplatesTable.tsx +71 -0
  502. package/src/modules/documents/backend/documents/templates/page.meta.ts +32 -0
  503. package/src/modules/documents/backend/documents/templates/page.tsx +5 -0
  504. package/src/modules/documents/backend/documents/templates/useTemplatesPage.tsx +148 -0
  505. package/src/modules/documents/backend/documents/useDocumentsList.tsx +305 -0
  506. package/src/modules/documents/ce.ts +6 -0
  507. package/src/modules/documents/commands/aggregate.ts +128 -0
  508. package/src/modules/documents/commands/attachments.ts +309 -0
  509. package/src/modules/documents/commands/comments.ts +966 -0
  510. package/src/modules/documents/commands/content.ts +294 -0
  511. package/src/modules/documents/commands/document-crud.ts +609 -0
  512. package/src/modules/documents/commands/documents.ts +581 -0
  513. package/src/modules/documents/commands/duplicate.ts +772 -0
  514. package/src/modules/documents/commands/favorites.ts +171 -0
  515. package/src/modules/documents/commands/folders.ts +506 -0
  516. package/src/modules/documents/commands/index.ts +33 -0
  517. package/src/modules/documents/commands/interceptors.ts +402 -0
  518. package/src/modules/documents/commands/lifecycle.ts +333 -0
  519. package/src/modules/documents/commands/links.ts +486 -0
  520. package/src/modules/documents/commands/mutation-helpers.ts +48 -0
  521. package/src/modules/documents/commands/projection-types.ts +77 -0
  522. package/src/modules/documents/commands/shared.ts +219 -0
  523. package/src/modules/documents/commands/shares.ts +612 -0
  524. package/src/modules/documents/commands/side-effects.ts +130 -0
  525. package/src/modules/documents/commands/templates.ts +522 -0
  526. package/src/modules/documents/commands/versions.ts +537 -0
  527. package/src/modules/documents/commands/watchers.ts +181 -0
  528. package/src/modules/documents/data/entities.ts +631 -0
  529. package/src/modules/documents/data/extensions.ts +42 -0
  530. package/src/modules/documents/data/validators.ts +248 -0
  531. package/src/modules/documents/di.ts +33 -0
  532. package/src/modules/documents/encryption.ts +14 -0
  533. package/src/modules/documents/events.ts +23 -0
  534. package/src/modules/documents/i18n/.hardcoded-allowlist.json +9 -0
  535. package/src/modules/documents/i18n/de.json +522 -0
  536. package/src/modules/documents/i18n/en.json +522 -0
  537. package/src/modules/documents/i18n/es.json +522 -0
  538. package/src/modules/documents/i18n/ko.json +522 -0
  539. package/src/modules/documents/i18n/pl.json +522 -0
  540. package/src/modules/documents/index.ts +17 -0
  541. package/src/modules/documents/lib/attachmentServicePort.ts +94 -0
  542. package/src/modules/documents/lib/capabilities.ts +57 -0
  543. package/src/modules/documents/lib/collabCloseEvents.ts +26 -0
  544. package/src/modules/documents/lib/collabEndpoint.ts +43 -0
  545. package/src/modules/documents/lib/collabMaterializer.ts +140 -0
  546. package/src/modules/documents/lib/collabToken.ts +170 -0
  547. package/src/modules/documents/lib/collaborationAwareness.ts +102 -0
  548. package/src/modules/documents/lib/commentAnchors.ts +19 -0
  549. package/src/modules/documents/lib/constants.ts +39 -0
  550. package/src/modules/documents/lib/contentService.ts +340 -0
  551. package/src/modules/documents/lib/displayLabels.ts +31 -0
  552. package/src/modules/documents/lib/docxRenderer.ts +685 -0
  553. package/src/modules/documents/lib/duplicateContent.ts +32 -0
  554. package/src/modules/documents/lib/editorConfig.ts +371 -0
  555. package/src/modules/documents/lib/entityLinks.ts +250 -0
  556. package/src/modules/documents/lib/entityRegistry.server.ts +267 -0
  557. package/src/modules/documents/lib/entityRegistry.ts +345 -0
  558. package/src/modules/documents/lib/entityRegistryAvailability.server.ts +19 -0
  559. package/src/modules/documents/lib/entitySuggestion.ts +61 -0
  560. package/src/modules/documents/lib/favorites.ts +35 -0
  561. package/src/modules/documents/lib/folderHierarchySerialization.ts +34 -0
  562. package/src/modules/documents/lib/historyLimits.ts +154 -0
  563. package/src/modules/documents/lib/historyPolicy.ts +7 -0
  564. package/src/modules/documents/lib/organizationAccess.ts +44 -0
  565. package/src/modules/documents/lib/pdfHtml.ts +65 -0
  566. package/src/modules/documents/lib/pdfRenderer.ts +367 -0
  567. package/src/modules/documents/lib/permissions.ts +299 -0
  568. package/src/modules/documents/lib/platformServices.ts +70 -0
  569. package/src/modules/documents/lib/recordFieldInsertion.ts +72 -0
  570. package/src/modules/documents/lib/requestBody.ts +97 -0
  571. package/src/modules/documents/lib/resourceLimits.ts +94 -0
  572. package/src/modules/documents/lib/shareCounts.ts +44 -0
  573. package/src/modules/documents/lib/templateFill.ts +138 -0
  574. package/src/modules/documents/lib/templateInstantiation.ts +206 -0
  575. package/src/modules/documents/lib/templatePreviewDigest.ts +122 -0
  576. package/src/modules/documents/lib/templateSeeds.ts +248 -0
  577. package/src/modules/documents/lib/userLabels.ts +58 -0
  578. package/src/modules/documents/lib/versionContent.ts +163 -0
  579. package/src/modules/documents/lib/versionLabels.ts +9 -0
  580. package/src/modules/documents/lib/versioning.ts +29 -0
  581. package/src/modules/documents/lib/visibility.ts +610 -0
  582. package/src/modules/documents/lib/watchers.ts +129 -0
  583. package/src/modules/documents/migrations/.snapshot-open-mercato.json +2892 -0
  584. package/src/modules/documents/migrations/Migration20260708163836_documents.ts +50 -0
  585. package/src/modules/documents/migrations/Migration20260709164720_documents.ts +19 -0
  586. package/src/modules/documents/migrations/Migration20260710002318_documents.ts +35 -0
  587. package/src/modules/documents/migrations/Migration20260710071003_documents.ts +13 -0
  588. package/src/modules/documents/migrations/Migration20260712120000_documents.ts +13 -0
  589. package/src/modules/documents/migrations/Migration20260712183000_documents.ts +12 -0
  590. package/src/modules/documents/migrations/Migration20260713092156_documents.ts +43 -0
  591. package/src/modules/documents/migrations/Migration20260717000000_documents.ts +40 -0
  592. package/src/modules/documents/notifications.ts +45 -0
  593. package/src/modules/documents/search.ts +118 -0
  594. package/src/modules/documents/setup.ts +19 -0
  595. package/src/modules/documents/widgets/injection/related-documents/LinkDocumentDialog.tsx +224 -0
  596. package/src/modules/documents/widgets/injection/related-documents/context.ts +101 -0
  597. package/src/modules/documents/widgets/injection/related-documents/useRelatedDocuments.ts +112 -0
  598. package/src/modules/documents/widgets/injection/related-documents/widget.client.tsx +76 -0
  599. package/src/modules/documents/widgets/injection/related-documents/widget.ts +19 -0
  600. package/src/modules/documents/widgets/injection-table.ts +20 -0
  601. package/tsconfig.json +9 -0
  602. package/watch.mjs +6 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/documents/commands/comments.ts"],
4
+ "sourcesContent": ["import { LockMode } from '@mikro-orm/core'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { z } from 'zod'\nimport { registerCommand, type CommandHandler } from '@open-mercato/shared/lib/commands'\nimport { withAtomicFlush } from '@open-mercato/shared/lib/commands/flush'\nimport { extractUndoPayload } from '@open-mercato/shared/lib/commands/undo'\nimport { CrudHttpError, isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport {\n assertOptimisticLock,\n buildOptimisticLockConflictBody,\n} from '@open-mercato/shared/lib/crud/optimistic-lock-command'\nimport {\n findOneWithDecryption,\n findWithDecryption,\n} from '@open-mercato/shared/lib/encryption/find'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { Document, DocumentComment, DocumentShare } from '../data/entities'\nimport {\n documentCommentCreateSchema,\n documentSharePermissionSchema,\n} from '../data/validators'\nimport { DOCUMENTS_ENTITY_IDS } from '../lib/constants'\nimport { assertDocumentCommentCapacity } from '../lib/historyLimits'\nimport { resolveUserAccess } from '../lib/permissions'\nimport { resolveWatcherRecipients } from '../lib/watchers'\nimport type { DocumentsProjectionDescriptor } from './projection-types'\nimport {\n assertDocumentCommandCapability,\n resolveDocumentsCommandActor,\n resolveDocumentsCommandScope,\n} from './shared'\nimport { nextDocumentVersion } from './mutation-helpers'\nimport { resolveAuthPrincipalService, type DocumentsServiceContainer } from '../lib/platformServices'\n\nconst scopeSchema = z.object({\n tenantId: z.string().uuid(),\n organizationId: z.string().uuid(),\n})\n\nconst commentStateSchema = z.object({\n id: z.string().uuid(),\n existed: z.boolean(),\n parentCommentId: z.string().uuid().nullable(),\n authorUserId: z.string().uuid(),\n body: z.string(),\n // Snapshots must remain permissive for legacy anchors. New command input is\n // still validated by documentCommentCreateSchema's strict write union.\n anchor: z.record(z.string(), z.unknown()).nullable(),\n mentions: z.array(z.object({ userId: z.string().uuid() })).nullable(),\n resolvedAt: z.string().datetime().nullable(),\n resolvedByUserId: z.string().uuid().nullable(),\n deletedAt: z.string().datetime().nullable(),\n updatedAt: z.string().datetime().nullable(),\n})\n\nconst mentionShareStateSchema = z.object({\n id: z.string().uuid(),\n userId: z.string().uuid(),\n existed: z.boolean(),\n permission: documentSharePermissionSchema,\n createdByUserId: z.string().uuid(),\n deletedAt: z.string().datetime().nullable(),\n updatedAt: z.string().datetime().nullable(),\n})\n\nconst commentRedoExpectationSchema = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('snapshot'), state: commentStateSchema }),\n z.object({ kind: z.literal('soft-deleted-created'), state: commentStateSchema }),\n])\n\nconst commentCommandBaseSchema = scopeSchema.extend({\n documentId: z.string().uuid(),\n actorUserId: z.string().uuid(),\n})\n\nexport const commentCreateCommandSchema = commentCommandBaseSchema.extend({\n commentId: z.string().uuid(),\n comment: documentCommentCreateSchema,\n grantShares: z.array(z.object({ userId: z.string().uuid(), shareId: z.string().uuid() })).max(50),\n redoExpectation: commentRedoExpectationSchema.optional(),\n}).superRefine((input, context) => {\n const grantIds = Array.from(new Set((input.comment.grantAccessTo ?? []).map((id) => id.toLowerCase())))\n const identities = Array.from(new Set(input.grantShares.map((grant) => grant.userId.toLowerCase())))\n if (grantIds.length !== identities.length || grantIds.some((id) => !identities.includes(id))) {\n context.addIssue({ code: 'custom', message: 'documents.comments.grantIdentityMismatch' })\n }\n})\n\nexport const commentResolveCommandSchema = commentCommandBaseSchema.extend({\n comment: z.object({ id: z.string().uuid(), resolved: z.boolean() }),\n expectedUpdatedAt: z.string().datetime().nullable().optional(),\n redoExpectation: commentRedoExpectationSchema.optional(),\n})\n\nexport type CommentCreateCommandInput = z.infer<typeof commentCreateCommandSchema>\nexport type CommentResolveCommandInput = z.infer<typeof commentResolveCommandSchema>\nexport type CommentState = z.infer<typeof commentStateSchema>\nexport type MentionShareState = z.infer<typeof mentionShareStateSchema>\n\nexport type CommentCreateCommandResult = {\n id: string\n updatedAt: string\n projections?: DocumentsProjectionDescriptor[]\n undo: CommentCreateUndoPayload\n}\n\nexport type CommentResolveCommandResult = {\n id: string\n resolvedAt: string | null\n resolvedByUserId: string | null\n updatedAt: string\n before: CommentState\n after: CommentState\n projections?: DocumentsProjectionDescriptor[]\n}\n\ntype MentionShareMutation = {\n before: MentionShareState\n after: MentionShareState\n}\n\ntype PendingMentionShareMutation = {\n before: MentionShareState\n share: DocumentShare\n fallback: { shareId: string; userId: string; actorUserId: string }\n}\n\ntype CommentCreateUndoPayload = {\n before?: CommentState | null\n after?: CommentState | null\n shareMutations: MentionShareMutation[]\n projectionsAfterUndo?: DocumentsProjectionDescriptor[]\n}\n\ntype CommentResolveUndoPayload = {\n before?: CommentState | null\n after?: CommentState | null\n projectionsAfterUndo?: DocumentsProjectionDescriptor[]\n}\n\nfunction extractMentionedUserIds(body: string): string[] {\n const pattern = /@\\[([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\\]/gi\n return Array.from(new Set(\n Array.from(body.matchAll(pattern))\n .map((match) => match[1])\n .filter((value): value is string => typeof value === 'string')\n .map((value) => value.toLowerCase()),\n ))\n}\n\nfunction dedupeUserIds(values: string[]): string[] {\n return Array.from(new Set(values.map((value) => value.toLowerCase())))\n}\n\nfunction commentFallback(input: CommentCreateCommandInput): Omit<CommentState, 'existed' | 'deletedAt' | 'updatedAt'> {\n const mentionUserIds = dedupeUserIds([\n ...(input.comment.mentions ?? []).map((mention) => mention.userId),\n ...extractMentionedUserIds(input.comment.body),\n ])\n return {\n id: input.commentId,\n parentCommentId: input.comment.parentCommentId ?? null,\n authorUserId: input.actorUserId,\n body: input.comment.body,\n anchor: input.comment.anchor ?? null,\n mentions: mentionUserIds.length ? mentionUserIds.map((userId) => ({ userId })) : null,\n resolvedAt: null,\n resolvedByUserId: null,\n }\n}\n\nfunction captureCommentState(\n comment: DocumentComment | null,\n fallback: Omit<CommentState, 'existed' | 'deletedAt' | 'updatedAt'>,\n): CommentState {\n return {\n id: comment?.id ?? fallback.id,\n existed: comment !== null,\n parentCommentId: comment?.parentCommentId ?? fallback.parentCommentId,\n authorUserId: comment?.authorUserId ?? fallback.authorUserId,\n body: comment?.body ?? fallback.body,\n anchor: (comment?.anchor ?? fallback.anchor) as CommentState['anchor'],\n mentions: comment?.mentions ?? fallback.mentions,\n resolvedAt: comment?.resolvedAt?.toISOString() ?? fallback.resolvedAt,\n resolvedByUserId: comment?.resolvedByUserId ?? fallback.resolvedByUserId,\n deletedAt: comment?.deletedAt?.toISOString() ?? null,\n updatedAt: comment?.updatedAt?.toISOString() ?? null,\n }\n}\n\nfunction captureMentionShareState(\n share: DocumentShare | null,\n fallback: { shareId: string; userId: string; actorUserId: string },\n): MentionShareState {\n return {\n id: share?.id ?? fallback.shareId,\n userId: share?.principalId ?? fallback.userId,\n existed: share !== null,\n permission: share?.permission ?? 'commenter',\n createdByUserId: share?.createdByUserId ?? fallback.actorUserId,\n deletedAt: share?.deletedAt?.toISOString() ?? null,\n updatedAt: share?.updatedAt?.toISOString() ?? null,\n }\n}\n\nfunction assertActor(input: { actorUserId: string }, ctx: Parameters<CommandHandler['execute']>[1]): void {\n if (resolveDocumentsCommandActor(ctx) !== input.actorUserId) {\n throw new CrudHttpError(403, { error: 'Forbidden' })\n }\n}\n\nasync function loadLockedDocument(\n em: EntityManager,\n input: { tenantId: string; organizationId: string; documentId: string },\n): Promise<Document> {\n const document = await findOneWithDecryption(\n em,\n Document,\n {\n id: input.documentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n deletedAt: null,\n },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n { tenantId: input.tenantId, organizationId: input.organizationId },\n )\n if (!document) throw new CrudHttpError(404, { error: 'Document not found' })\n return document\n}\n\nasync function loadComment(\n em: EntityManager,\n input: { tenantId: string; organizationId: string; documentId: string },\n commentId: string,\n lock = false,\n): Promise<DocumentComment | null> {\n return findOneWithDecryption(\n em,\n DocumentComment,\n {\n id: commentId,\n documentId: input.documentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n },\n {\n filters: false,\n ...(lock ? { lockMode: LockMode.PESSIMISTIC_WRITE } : {}),\n },\n { tenantId: input.tenantId, organizationId: input.organizationId },\n )\n}\n\nasync function assertNoActiveReplies(\n em: EntityManager,\n input: { tenantId: string; organizationId: string; documentId: string },\n commentId: string,\n): Promise<void> {\n const replies = await findWithDecryption(\n em,\n DocumentComment,\n {\n documentId: input.documentId,\n parentCommentId: commentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n deletedAt: null,\n },\n { limit: 1 },\n { tenantId: input.tenantId, organizationId: input.organizationId },\n )\n if (replies.length > 0) {\n throw new CrudHttpError(409, { error: 'Record changed by another user' })\n }\n}\n\nasync function loadMentionShare(\n em: EntityManager,\n input: { tenantId: string; organizationId: string; documentId: string },\n userId: string,\n lock = false,\n): Promise<DocumentShare | null> {\n return findOneWithDecryption(\n em,\n DocumentShare,\n {\n documentId: input.documentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n principalType: 'user',\n principalId: userId,\n },\n {\n filters: false,\n orderBy: { updatedAt: 'DESC' },\n ...(lock ? { lockMode: LockMode.PESSIMISTIC_WRITE } : {}),\n },\n { tenantId: input.tenantId, organizationId: input.organizationId },\n )\n}\n\nasync function assertUserPrincipal(\n container: DocumentsServiceContainer,\n input: { tenantId: string; organizationId: string },\n userId: string,\n): Promise<void> {\n const exists = await resolveAuthPrincipalService(container)?.principalExists({\n type: 'user',\n id: userId,\n scope: { tenantId: input.tenantId, organizationId: input.organizationId },\n }) ?? false\n if (!exists) throw new CrudHttpError(400, { error: 'Share principal not found in this organization' })\n}\n\nasync function hasDocumentCapability(\n ctx: Parameters<CommandHandler['execute']>[1],\n em: EntityManager,\n input: { tenantId: string; organizationId: string; documentId: string },\n capability: 'canComment' | 'canShare',\n): Promise<boolean> {\n try {\n await assertDocumentCommandCapability(\n ctx,\n em,\n input.documentId,\n resolveDocumentsCommandScope(ctx, input),\n capability,\n )\n return true\n } catch (error) {\n if (isCrudHttpError(error) && error.status === 403) return false\n throw error\n }\n}\n\nasync function assertCanCreateComment(\n ctx: Parameters<CommandHandler['execute']>[1],\n em: EntityManager,\n input: CommentCreateCommandInput,\n): Promise<void> {\n resolveDocumentsCommandScope(ctx, input)\n if (!(await hasDocumentCapability(ctx, em, input, 'canComment'))) {\n throw new CrudHttpError(403, { error: 'Forbidden' })\n }\n}\n\nasync function assertCanMutateMentionShares(\n ctx: Parameters<CommandHandler['execute']>[1],\n em: EntityManager,\n input: CommentCreateCommandInput,\n): Promise<void> {\n const scope = resolveDocumentsCommandScope(ctx, input)\n await assertDocumentCommandCapability(ctx, em, input.documentId, scope, 'canShare')\n}\n\nasync function assertCanResolveComment(\n ctx: Parameters<CommandHandler['execute']>[1],\n em: EntityManager,\n input: CommentResolveCommandInput,\n comment: DocumentComment,\n): Promise<void> {\n const scope = resolveDocumentsCommandScope(ctx, input)\n await assertDocumentCommandCapability(ctx, em, input.documentId, scope, 'canView')\n if (comment.authorUserId === resolveDocumentsCommandActor(ctx)) return\n if (!(await hasDocumentCapability(ctx, em, input, 'canComment'))) {\n throw new CrudHttpError(403, { error: 'Forbidden' })\n }\n}\n\nfunction assertCommentMatchesState(\n comment: DocumentComment | null,\n expected: CommentState,\n softDeletedCreated = false,\n): void {\n if (!comment || !expected.existed) throw new CrudHttpError(409, { error: 'Record changed by another user' })\n const scalarsMatch = comment.id === expected.id\n && (comment.parentCommentId ?? null) === expected.parentCommentId\n && comment.authorUserId === expected.authorUserId\n && comment.body === expected.body\n && JSON.stringify(comment.anchor ?? null) === JSON.stringify(expected.anchor)\n && JSON.stringify(comment.mentions ?? null) === JSON.stringify(expected.mentions)\n && (comment.resolvedAt?.toISOString() ?? null) === expected.resolvedAt\n && (comment.resolvedByUserId ?? null) === expected.resolvedByUserId\n const deletedAt = comment.deletedAt?.toISOString() ?? null\n const deletionMatches = softDeletedCreated ? deletedAt !== null : deletedAt === expected.deletedAt\n if (!scalarsMatch || !deletionMatches) {\n throw new CrudHttpError(409, buildOptimisticLockConflictBody(\n comment.updatedAt.toISOString(),\n expected.updatedAt ?? comment.updatedAt.toISOString(),\n ))\n }\n}\n\nfunction assertCommentUnchanged(\n comment: DocumentComment | null,\n expected: CommentState,\n): asserts comment is DocumentComment {\n if (!comment || !expected.existed || !expected.updatedAt) {\n throw new CrudHttpError(409, { error: 'Record changed by another user' })\n }\n assertOptimisticLock({\n resourceKind: DOCUMENTS_ENTITY_IDS.documentComment,\n resourceId: expected.id,\n current: comment.updatedAt,\n expected: expected.updatedAt,\n envValue: 'all',\n })\n assertCommentMatchesState(comment, expected)\n}\n\nfunction assertMentionShareUnchanged(share: DocumentShare | null, expected: MentionShareState): asserts share is DocumentShare {\n if (!share || !expected.existed || !expected.updatedAt) {\n throw new CrudHttpError(409, { error: 'Record changed by another user' })\n }\n assertOptimisticLock({\n resourceKind: DOCUMENTS_ENTITY_IDS.documentShare,\n resourceId: expected.id,\n current: share.updatedAt,\n expected: expected.updatedAt,\n envValue: 'all',\n })\n if (\n share.id !== expected.id\n || share.principalType !== 'user'\n || share.principalId !== expected.userId\n || share.permission !== expected.permission\n || share.createdByUserId !== expected.createdByUserId\n || (share.deletedAt?.toISOString() ?? null) !== expected.deletedAt\n ) {\n throw new CrudHttpError(409, { error: 'Record changed by another user' })\n }\n}\n\nfunction restoreCommentState(comment: DocumentComment, before: CommentState): void {\n const now = nextDocumentVersion(comment.updatedAt)\n if (!before.existed) {\n comment.deletedAt = now\n comment.updatedAt = now\n return\n }\n comment.parentCommentId = before.parentCommentId\n comment.authorUserId = before.authorUserId\n comment.body = before.body\n comment.anchor = before.anchor\n comment.mentions = before.mentions\n comment.resolvedAt = before.resolvedAt ? new Date(before.resolvedAt) : null\n comment.resolvedByUserId = before.resolvedByUserId\n comment.deletedAt = before.deletedAt ? new Date(before.deletedAt) : null\n comment.updatedAt = now\n}\n\nfunction restoreMentionShareState(share: DocumentShare, before: MentionShareState): void {\n const now = nextDocumentVersion(share.updatedAt)\n if (!before.existed) {\n share.deletedAt = now\n share.updatedAt = now\n return\n }\n share.permission = before.permission\n share.createdByUserId = before.createdByUserId\n share.deletedAt = before.deletedAt ? new Date(before.deletedAt) : null\n share.updatedAt = now\n}\n\nfunction shareProjection(\n eventId: 'documents.document.shared' | 'documents.document.unshared',\n input: CommentCreateCommandInput,\n state: MentionShareState,\n includeActor = true,\n): DocumentsProjectionDescriptor {\n return {\n kind: 'event',\n eventId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n payload: {\n id: input.documentId,\n shareId: state.id,\n principalType: 'user',\n principalId: state.userId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n ...(includeActor ? { userId: input.actorUserId } : {}),\n },\n }\n}\n\nfunction resolutionProjection(\n input: CommentResolveCommandInput,\n state: CommentState,\n includeActor = true,\n): DocumentsProjectionDescriptor {\n return {\n kind: 'event',\n eventId: 'documents.comment.resolved',\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n payload: {\n id: state.id,\n documentId: input.documentId,\n resolved: state.resolvedAt !== null,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n ...(includeActor ? { userId: input.actorUserId } : {}),\n },\n }\n}\n\nfunction mentionProjections(\n input: CommentCreateCommandInput,\n document: Document,\n mentionedUserIds: string[],\n): DocumentsProjectionDescriptor[] {\n return mentionedUserIds.flatMap((recipientUserId): DocumentsProjectionDescriptor[] => [\n {\n kind: 'event',\n eventId: 'documents.comment.mentioned',\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n payload: {\n id: input.commentId,\n documentId: input.documentId,\n mentionedUserId: recipientUserId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n userId: input.actorUserId,\n },\n },\n {\n kind: 'mention-notification',\n recipientUserId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n documentId: input.documentId,\n documentTitle: document.title,\n commentId: input.commentId,\n authorUserId: input.actorUserId,\n },\n ])\n}\n\nfunction watchCommentProjections(\n input: { tenantId: string; organizationId: string; documentId: string; commentId: string },\n documentTitle: string,\n recipientUserIds: readonly string[],\n bodyKey: string,\n): DocumentsProjectionDescriptor[] {\n return recipientUserIds.map((recipientUserId) => ({\n kind: 'watch-notification',\n recipientUserId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n documentId: input.documentId,\n documentTitle,\n notificationType: 'documents.watch.commented',\n bodyKey,\n sourceEntityType: DOCUMENTS_ENTITY_IDS.documentComment,\n sourceEntityId: input.commentId,\n linkHref: `/backend/documents/${encodeURIComponent(input.documentId)}?commentId=${encodeURIComponent(input.commentId)}`,\n }))\n}\n\nfunction commentCreatedProjection(\n input: CommentCreateCommandInput,\n): DocumentsProjectionDescriptor {\n return {\n kind: 'event',\n eventId: 'documents.comment.created',\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n payload: {\n id: input.commentId,\n documentId: input.documentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n userId: input.actorUserId,\n },\n }\n}\n\nfunction readRedoInput<T>(logEntry: { commandPayload?: unknown }, schema: z.ZodType<T>): T {\n const raw = logEntry.commandPayload && typeof logEntry.commandPayload === 'object'\n ? (logEntry.commandPayload as { __redoInput?: unknown }).__redoInput\n : null\n return schema.parse(raw)\n}\n\nexport const createCommentCommand: CommandHandler<CommentCreateCommandInput, CommentCreateCommandResult> = {\n id: 'documents.comment.create',\n async prepare(rawInput, ctx) {\n const input = commentCreateCommandSchema.parse(rawInput)\n assertActor(input, ctx)\n const em = ctx.container.resolve('em') as EntityManager\n await assertCanCreateComment(ctx, em, input)\n return null\n },\n async execute(rawInput, ctx) {\n const input = commentCreateCommandSchema.parse(rawInput)\n const em = ctx.transactionalEm ?? (ctx.container.resolve('em') as EntityManager).fork()\n const fallback = commentFallback(input)\n const mentionUserIds = fallback.mentions?.map((mention) => mention.userId) ?? []\n const grantIdentityByUserId = new Map(input.grantShares.map((grant) => [grant.userId.toLowerCase(), grant]))\n const shareMutations: MentionShareMutation[] = []\n const pendingShareMutations: PendingMentionShareMutation[] = []\n const notifyMentionedIds: string[] = []\n let document: Document | null = null\n let comment: DocumentComment | null = null\n let before: CommentState | null = null\n let after: CommentState | null = null\n await withAtomicFlush(em, [async () => {\n document = await loadLockedDocument(em, input)\n assertActor(input, ctx)\n await assertCanCreateComment(ctx, em, input)\n comment = await loadComment(em, input, input.commentId, true)\n if (input.redoExpectation) {\n assertCommentMatchesState(\n comment,\n input.redoExpectation.state,\n input.redoExpectation.kind === 'soft-deleted-created',\n )\n } else if (comment) {\n throw new CrudHttpError(409, { error: 'Record changed by another user' })\n }\n before = captureCommentState(comment, fallback)\n if (fallback.parentCommentId) {\n const parent = await loadComment(em, input, fallback.parentCommentId, true)\n if (!parent || parent.deletedAt) throw new CrudHttpError(404, { error: 'Comment not found' })\n }\n await assertDocumentCommentCapacity(em, input)\n\n const canShare = await hasDocumentCapability(ctx, em, input, 'canShare')\n // An explicit grant request from an actor without the share capability\n // must fail loudly instead of returning 201 with the grants silently\n // dropped. Redo replays are exempt: their grants either already exist\n // (mentioned users resolve a tier below) or were legitimately created\n // by the original execution.\n if (input.grantShares.length > 0 && !canShare && !input.redoExpectation) {\n throw new CrudHttpError(403, { error: 'Forbidden' })\n }\n for (const mentionedUserId of mentionUserIds) {\n const grantIdentity = grantIdentityByUserId.get(mentionedUserId)\n if (!grantIdentity || !canShare) continue\n const tier = await resolveUserAccess(em, input.documentId, input, mentionedUserId, ctx.container)\n if (tier) continue\n await assertUserPrincipal(ctx.container, input, mentionedUserId)\n let share = await loadMentionShare(em, input, mentionedUserId, true)\n const shareFallback = {\n shareId: share?.id ?? grantIdentity.shareId,\n userId: mentionedUserId,\n actorUserId: input.actorUserId,\n }\n const shareBefore = captureMentionShareState(share, shareFallback)\n const created = !share\n share = share ?? em.create(DocumentShare, {\n id: grantIdentity.shareId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n documentId: input.documentId,\n principalType: 'user',\n principalId: mentionedUserId,\n permission: 'commenter',\n createdByUserId: input.actorUserId,\n })\n share.permission = 'commenter'\n share.deletedAt = null\n share.updatedAt = nextDocumentVersion(share.updatedAt)\n if (created) em.persist(share)\n pendingShareMutations.push({ before: shareBefore, share, fallback: shareFallback })\n }\n\n const created = !comment\n comment = comment ?? em.create(DocumentComment, {\n id: input.commentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n documentId: input.documentId,\n parentCommentId: fallback.parentCommentId,\n authorUserId: fallback.authorUserId,\n body: fallback.body,\n anchor: fallback.anchor,\n mentions: fallback.mentions,\n })\n comment.parentCommentId = fallback.parentCommentId\n comment.authorUserId = fallback.authorUserId\n comment.body = fallback.body\n comment.anchor = fallback.anchor\n comment.mentions = fallback.mentions\n comment.resolvedAt = null\n comment.resolvedByUserId = null\n comment.deletedAt = null\n comment.updatedAt = nextDocumentVersion(comment.updatedAt)\n if (created) em.persist(comment)\n }, async () => {\n after = captureCommentState(comment, fallback)\n for (const mutation of pendingShareMutations) {\n shareMutations.push({\n before: mutation.before,\n after: captureMentionShareState(mutation.share, mutation.fallback),\n })\n }\n for (const mentionedUserId of mentionUserIds) {\n const tier = await resolveUserAccess(em, input.documentId, input, mentionedUserId, ctx.container)\n if (tier) notifyMentionedIds.push(mentionedUserId)\n }\n }], { transaction: true, label: 'documents.comment.create' })\n\n const finalDocument = document as Document | null\n const finalComment = comment as DocumentComment | null\n const beforeState = before as CommentState | null\n if (!finalDocument || !finalComment || !beforeState) {\n throw new Error('[internal] comment create produced no row')\n }\n const afterState = after as CommentState | null\n if (!afterState) throw new Error('[internal] comment create produced no after snapshot')\n const watcherRecipientIds = await resolveWatcherRecipients({\n em,\n container: ctx.container,\n scope: { tenantId: input.tenantId, organizationId: input.organizationId },\n documentId: input.documentId,\n actorUserId: input.actorUserId,\n excludeUserIds: notifyMentionedIds,\n })\n const projections = [\n commentCreatedProjection(input),\n ...shareMutations.map((mutation) => shareProjection('documents.document.shared', input, mutation.after)),\n ...mentionProjections(input, finalDocument, notifyMentionedIds),\n ...watchCommentProjections(\n { ...input, commentId: input.commentId },\n finalDocument.title,\n watcherRecipientIds,\n 'documents.notifications.watch.commented.body',\n ),\n ]\n const projectionsAfterUndo: DocumentsProjectionDescriptor[] = [\n ...shareMutations.map((mutation) => shareProjection(\n mutation.before.existed && mutation.before.deletedAt === null\n ? 'documents.document.shared'\n : 'documents.document.unshared',\n input,\n mutation.before,\n false,\n )),\n {\n kind: 'mention-notification-delete',\n commentId: input.commentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n },\n ]\n return {\n id: finalComment.id,\n updatedAt: finalComment.updatedAt.toISOString(),\n projections,\n undo: { before: beforeState, after: afterState, shareMutations, projectionsAfterUndo },\n }\n },\n async buildLog({ input, result }) {\n const before = commentStateSchema.parse(result.undo.before)\n const after = commentStateSchema.parse(result.undo.after)\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('documents.audit.commentCreated', 'Add comment'),\n resourceKind: DOCUMENTS_ENTITY_IDS.documentComment,\n resourceId: result.id,\n parentResourceKind: DOCUMENTS_ENTITY_IDS.document,\n parentResourceId: input.documentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n snapshotBefore: before,\n snapshotAfter: after,\n payload: {\n undo: result.undo,\n __redoInput: {\n ...input,\n redoExpectation: before.existed\n ? { kind: 'snapshot', state: before }\n : { kind: 'soft-deleted-created', state: after },\n } satisfies CommentCreateCommandInput,\n },\n }\n },\n async undo({ logEntry, ctx }) {\n const undo = extractUndoPayload<CommentCreateUndoPayload>(logEntry)\n if (!undo?.before || !undo.after) return\n const input = readRedoInput(logEntry, commentCreateCommandSchema)\n const em = ctx.transactionalEm ?? (ctx.container.resolve('em') as EntityManager).fork()\n await withAtomicFlush(em, [async () => {\n await loadLockedDocument(em, input)\n if (undo.shareMutations.length > 0) {\n await assertCanMutateMentionShares(ctx, em, input)\n }\n const comment = await loadComment(em, input, undo.after!.id, true)\n if (!comment) throw new CrudHttpError(409, { error: 'Record changed by another user' })\n await assertCanResolveComment(ctx, em, {\n ...input,\n comment: { id: comment.id, resolved: false },\n expectedUpdatedAt: null,\n }, comment)\n assertCommentUnchanged(comment, undo.after!)\n await assertNoActiveReplies(em, input, comment.id)\n for (const mutation of undo.shareMutations) {\n const share = await loadMentionShare(em, input, mutation.after.userId, true)\n assertMentionShareUnchanged(share, mutation.after)\n restoreMentionShareState(share, mutation.before)\n }\n restoreCommentState(comment, undo.before!)\n }], { transaction: true, label: 'documents.comment.create.undo' })\n },\n}\n\nexport const resolveCommentCommand: CommandHandler<CommentResolveCommandInput, CommentResolveCommandResult> = {\n id: 'documents.comment.resolve',\n async prepare(rawInput, ctx) {\n const input = commentResolveCommandSchema.parse(rawInput)\n assertActor(input, ctx)\n const em = ctx.container.resolve('em') as EntityManager\n const comment = await loadComment(em, input, input.comment.id)\n if (!comment || comment.deletedAt) throw new CrudHttpError(404, { error: 'Comment not found' })\n await assertCanResolveComment(ctx, em, input, comment)\n return null\n },\n async execute(rawInput, ctx) {\n const input = commentResolveCommandSchema.parse(rawInput)\n const em = ctx.transactionalEm ?? (ctx.container.resolve('em') as EntityManager).fork()\n let comment: DocumentComment | null = null\n let before: CommentState | null = null\n let after: CommentState | null = null\n await withAtomicFlush(em, [async () => {\n await loadLockedDocument(em, input)\n assertActor(input, ctx)\n comment = await loadComment(em, input, input.comment.id, true)\n if (!comment || comment.deletedAt) throw new CrudHttpError(404, { error: 'Comment not found' })\n await assertCanResolveComment(ctx, em, input, comment)\n if (input.redoExpectation) {\n assertCommentMatchesState(comment, input.redoExpectation.state)\n } else {\n assertOptimisticLock({\n resourceKind: DOCUMENTS_ENTITY_IDS.documentComment,\n resourceId: comment.id,\n current: comment.updatedAt,\n expected: input.expectedUpdatedAt,\n })\n }\n before = captureCommentState(comment, {\n id: comment.id,\n parentCommentId: comment.parentCommentId ?? null,\n authorUserId: comment.authorUserId,\n body: comment.body,\n anchor: comment.anchor as CommentState['anchor'],\n mentions: comment.mentions ?? null,\n resolvedAt: comment.resolvedAt?.toISOString() ?? null,\n resolvedByUserId: comment.resolvedByUserId ?? null,\n })\n const now = new Date()\n ;(comment as DocumentComment).resolvedAt = input.comment.resolved ? now : null\n ;(comment as DocumentComment).resolvedByUserId = input.comment.resolved ? input.actorUserId : null\n ;(comment as DocumentComment).updatedAt = nextDocumentVersion(\n (comment as DocumentComment).updatedAt,\n now,\n )\n }, async () => {\n const finalComment = comment as DocumentComment | null\n if (!finalComment) throw new Error('[internal] comment resolve produced no row')\n after = captureCommentState(finalComment, {\n id: finalComment.id,\n parentCommentId: finalComment.parentCommentId ?? null,\n authorUserId: finalComment.authorUserId,\n body: finalComment.body,\n anchor: finalComment.anchor as CommentState['anchor'],\n mentions: finalComment.mentions ?? null,\n resolvedAt: finalComment.resolvedAt?.toISOString() ?? null,\n resolvedByUserId: finalComment.resolvedByUserId ?? null,\n })\n }], { transaction: true, label: 'documents.comment.resolve' })\n const finalComment = comment as DocumentComment | null\n const beforeState = before as CommentState | null\n const afterState = after as CommentState | null\n if (!finalComment || !beforeState || !afterState) throw new Error('[internal] comment resolve produced no row')\n const resolvedDocument = await findOneWithDecryption(\n em,\n Document,\n {\n id: input.documentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n deletedAt: null,\n },\n { fields: ['id', 'title'] },\n { tenantId: input.tenantId, organizationId: input.organizationId },\n )\n const watcherRecipientIds = resolvedDocument\n ? await resolveWatcherRecipients({\n em,\n container: ctx.container,\n scope: { tenantId: input.tenantId, organizationId: input.organizationId },\n documentId: input.documentId,\n actorUserId: input.actorUserId,\n })\n : []\n return {\n id: finalComment.id,\n resolvedAt: afterState.resolvedAt,\n resolvedByUserId: afterState.resolvedByUserId,\n updatedAt: finalComment.updatedAt.toISOString(),\n before: beforeState,\n after: afterState,\n projections: [\n resolutionProjection(input, afterState),\n ...(resolvedDocument\n ? watchCommentProjections(\n { ...input, commentId: finalComment.id },\n resolvedDocument.title,\n watcherRecipientIds,\n 'documents.notifications.watch.commented.resolvedBody',\n )\n : []),\n ],\n }\n },\n async buildLog({ input, result }) {\n const before = commentStateSchema.parse(result.before)\n const after = commentStateSchema.parse(result.after)\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('documents.audit.commentResolved', 'Resolve comment'),\n resourceKind: DOCUMENTS_ENTITY_IDS.documentComment,\n resourceId: result.id,\n parentResourceKind: DOCUMENTS_ENTITY_IDS.document,\n parentResourceId: input.documentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n snapshotBefore: before,\n snapshotAfter: after,\n payload: {\n undo: {\n before,\n after,\n projectionsAfterUndo: [resolutionProjection(input, before, false)],\n } satisfies CommentResolveUndoPayload,\n __redoInput: {\n ...input,\n expectedUpdatedAt: null,\n redoExpectation: { kind: 'snapshot', state: before },\n } satisfies CommentResolveCommandInput,\n },\n }\n },\n async undo({ logEntry, ctx }) {\n const undo = extractUndoPayload<CommentResolveUndoPayload>(logEntry)\n if (!undo?.before || !undo.after) return\n const input = readRedoInput(logEntry, commentResolveCommandSchema)\n const em = ctx.transactionalEm ?? (ctx.container.resolve('em') as EntityManager).fork()\n await withAtomicFlush(em, [async () => {\n await loadLockedDocument(em, input)\n const comment = await loadComment(em, input, undo.after!.id, true)\n if (!comment) throw new CrudHttpError(409, { error: 'Record changed by another user' })\n await assertCanResolveComment(ctx, em, input, comment)\n assertCommentUnchanged(comment, undo.after!)\n restoreCommentState(comment, undo.before!)\n }], { transaction: true, label: 'documents.comment.resolve.undo' })\n },\n}\n\nregisterCommand(createCommentCommand)\nregisterCommand(resolveCommentCommand)\n"],
5
+ "mappings": "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",
6
+ "names": ["created", "finalComment"]
7
+ }
@@ -0,0 +1,238 @@
1
+ import { createHash } from "node:crypto";
2
+ import { z } from "zod";
3
+ import {
4
+ registerCommand
5
+ } from "@open-mercato/shared/lib/commands";
6
+ import { withAtomicFlush } from "@open-mercato/shared/lib/commands/flush";
7
+ import { CrudHttpError } from "@open-mercato/shared/lib/crud/errors";
8
+ import {
9
+ enforceCommandOptimisticLockWithGuards,
10
+ enforceRecordGoneIsConflict
11
+ } from "@open-mercato/shared/lib/crud/optimistic-lock-command";
12
+ import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
13
+ import { DocumentContent } from "../data/entities.js";
14
+ import { documentContentPutSchema } from "../data/validators.js";
15
+ import { materializeDocumentContentReplacement } from "../lib/collabMaterializer.js";
16
+ import {
17
+ advanceDocumentCollaborationGeneration,
18
+ mutateDocumentContentState
19
+ } from "../lib/contentService.js";
20
+ import { DOCUMENTS_ENTITY_IDS } from "../lib/constants.js";
21
+ import {
22
+ assertDocumentContentResourceLimits
23
+ } from "../lib/resourceLimits.js";
24
+ import {
25
+ loadLockedDocumentContent,
26
+ lockDocumentAggregateRoot
27
+ } from "./aggregate.js";
28
+ import {
29
+ assertDocumentCommandCanEdit,
30
+ resolveDocumentsCommandActor,
31
+ resolveDocumentsCommandScope
32
+ } from "./shared.js";
33
+ import {
34
+ documentsScopedCommandSchema
35
+ } from "./mutation-helpers.js";
36
+ const replaceDocumentContentCommandSchema = documentsScopedCommandSchema.merge(documentContentPutSchema).extend({
37
+ documentId: z.string().uuid(),
38
+ contentId: z.string().uuid(),
39
+ expectedUpdatedAt: z.string().datetime().optional().nullable(),
40
+ writeUpdatedAt: z.string().datetime().optional()
41
+ });
42
+ function captureContentAuditState(content) {
43
+ assertDocumentContentResourceLimits({
44
+ yjsState: content.yjsState,
45
+ contentHtml: content.contentHtml,
46
+ contentText: content.contentText
47
+ });
48
+ const yjsState = Buffer.from(content.yjsState ?? Buffer.alloc(0));
49
+ const contentHtml = content.contentHtml ?? "";
50
+ const contentText = content.contentText ?? "";
51
+ const digest = createHash("sha256");
52
+ for (const part of [yjsState, Buffer.from(contentHtml), Buffer.from(contentText)]) {
53
+ digest.update(String(part.byteLength));
54
+ digest.update(":");
55
+ digest.update(part);
56
+ }
57
+ return {
58
+ id: content.id,
59
+ documentId: content.documentId,
60
+ tenantId: content.tenantId,
61
+ organizationId: content.organizationId,
62
+ contentDigest: `sha256:${digest.digest("hex")}`,
63
+ collaborationGeneration: content.collaborationGeneration,
64
+ createdAt: content.createdAt.toISOString(),
65
+ updatedAt: content.updatedAt.toISOString(),
66
+ deletedAt: content.deletedAt?.toISOString() ?? null
67
+ };
68
+ }
69
+ function changedError() {
70
+ return new CrudHttpError(409, { error: "documents.errors.recordChanged" });
71
+ }
72
+ function allocateContentWriteVersion(current, requestedWriteUpdatedAt) {
73
+ const currentMs = current?.updatedAt.getTime() ?? 0;
74
+ const requestedMs = requestedWriteUpdatedAt ? Date.parse(requestedWriteUpdatedAt) : null;
75
+ if (requestedMs !== null && requestedMs <= currentMs) throw changedError();
76
+ const writeMs = requestedMs ?? Math.max(Date.now(), currentMs + 1);
77
+ return new Date(writeMs).toISOString();
78
+ }
79
+ async function pinContentUpdatedAt(em, content, input, updatedAtIso) {
80
+ const updatedAt = new Date(updatedAtIso);
81
+ const affected = await em.nativeUpdate(
82
+ DocumentContent,
83
+ {
84
+ id: content.id,
85
+ documentId: input.documentId,
86
+ tenantId: input.tenantId,
87
+ organizationId: input.organizationId
88
+ },
89
+ { updatedAt }
90
+ );
91
+ if (affected !== 1) throw changedError();
92
+ await em.refresh(content);
93
+ if (content.updatedAt.toISOString() !== updatedAtIso) {
94
+ throw new Error("[internal] document content optimistic-lock token was not persisted");
95
+ }
96
+ }
97
+ function contentProjections(input, userId) {
98
+ return [
99
+ {
100
+ kind: "document-index",
101
+ documentId: input.documentId,
102
+ tenantId: input.tenantId,
103
+ organizationId: input.organizationId
104
+ },
105
+ {
106
+ kind: "event",
107
+ eventId: "documents.document.updated",
108
+ tenantId: input.tenantId,
109
+ organizationId: input.organizationId,
110
+ payload: {
111
+ id: input.documentId,
112
+ documentId: input.documentId,
113
+ tenantId: input.tenantId,
114
+ organizationId: input.organizationId,
115
+ ...userId ? { userId } : {},
116
+ contentEpochReset: true
117
+ }
118
+ }
119
+ ];
120
+ }
121
+ const replaceDocumentContentCommand = {
122
+ id: "documents.content.replace",
123
+ // Body replacements can approach the document resource limits and happen
124
+ // frequently. Audit undo/redo would copy those bodies outside the bounded
125
+ // version store. The editor and version history remain the reversal models.
126
+ isUndoable: false,
127
+ async execute(rawInput, ctx) {
128
+ const input = replaceDocumentContentCommandSchema.parse(rawInput);
129
+ const scope = resolveDocumentsCommandScope(ctx, input);
130
+ const actorUserId = resolveDocumentsCommandActor(ctx);
131
+ const requestEm = ctx.container.resolve("em");
132
+ const em = ctx.transactionalEm ?? requestEm.fork();
133
+ let content = null;
134
+ let before = null;
135
+ let writeUpdatedAt;
136
+ await withAtomicFlush(em, [
137
+ async () => {
138
+ await lockDocumentAggregateRoot(em, input.documentId, scope);
139
+ await assertDocumentCommandCanEdit(ctx, em, input.documentId, scope);
140
+ const current = await loadLockedDocumentContent(
141
+ em,
142
+ input.documentId,
143
+ scope,
144
+ { includeDeleted: true }
145
+ );
146
+ if (!current) {
147
+ enforceRecordGoneIsConflict({
148
+ resourceKind: DOCUMENTS_ENTITY_IDS.documentContent,
149
+ resourceId: input.contentId,
150
+ expected: input.expectedUpdatedAt ?? void 0,
151
+ request: ctx.request ?? null,
152
+ ...input.expectedUpdatedAt ? { envValue: "all" } : {}
153
+ });
154
+ } else {
155
+ await enforceCommandOptimisticLockWithGuards(ctx.container, {
156
+ resourceKind: DOCUMENTS_ENTITY_IDS.documentContent,
157
+ resourceId: current.id,
158
+ current: current.updatedAt,
159
+ expected: input.expectedUpdatedAt ?? void 0,
160
+ request: ctx.request ?? null,
161
+ ...input.expectedUpdatedAt ? { envValue: "all" } : {}
162
+ });
163
+ }
164
+ before = current ? captureContentAuditState(current) : null;
165
+ const replacement = materializeDocumentContentReplacement(
166
+ current?.yjsState,
167
+ input.contentHtml
168
+ );
169
+ if (!replacement) {
170
+ throw new Error("[internal] documents content replacement could not be materialized");
171
+ }
172
+ writeUpdatedAt = allocateContentWriteVersion(current, input.writeUpdatedAt);
173
+ if (current) advanceDocumentCollaborationGeneration(current);
174
+ content = await mutateDocumentContentState(
175
+ em,
176
+ input.documentId,
177
+ scope,
178
+ {
179
+ yjsState: replacement.yjsState,
180
+ contentHtml: replacement.html,
181
+ contentText: replacement.text
182
+ },
183
+ {
184
+ id: current?.id ?? input.contentId,
185
+ existingContent: current,
186
+ now: new Date(writeUpdatedAt)
187
+ }
188
+ );
189
+ },
190
+ async () => {
191
+ if (!content) throw new Error("[internal] document content replacement produced no row");
192
+ await pinContentUpdatedAt(em, content, input, writeUpdatedAt);
193
+ }
194
+ ], { transaction: true, label: "documents.content.replace" });
195
+ const finalContent = content;
196
+ if (!finalContent) throw new Error("[internal] document content replacement produced no row");
197
+ const after = captureContentAuditState(finalContent);
198
+ return {
199
+ id: finalContent.id,
200
+ updatedAt: after.updatedAt,
201
+ before,
202
+ after,
203
+ projections: contentProjections(input, actorUserId)
204
+ };
205
+ },
206
+ async buildLog({ input, result }) {
207
+ const parsed = replaceDocumentContentCommandSchema.parse(input);
208
+ const { translate } = await resolveTranslations();
209
+ return {
210
+ actionLabel: translate("documents.audit.documentUpdated", "Document updated"),
211
+ resourceKind: DOCUMENTS_ENTITY_IDS.documentContent,
212
+ resourceId: result.id,
213
+ parentResourceKind: DOCUMENTS_ENTITY_IDS.document,
214
+ parentResourceId: parsed.documentId,
215
+ tenantId: parsed.tenantId,
216
+ organizationId: parsed.organizationId,
217
+ snapshotBefore: result.before,
218
+ snapshotAfter: result.after,
219
+ payload: {
220
+ documentId: parsed.documentId,
221
+ contentId: result.id,
222
+ beforeContentDigest: result.before?.contentDigest ?? null,
223
+ afterContentDigest: result.after.contentDigest,
224
+ contentUpdatedAt: result.updatedAt,
225
+ // The command bus normally adds the original input for redo. A null
226
+ // sentinel prevents the body-bearing content input from being copied
227
+ // into the action log for this deliberately non-undoable command.
228
+ __redoInput: null
229
+ }
230
+ };
231
+ }
232
+ };
233
+ registerCommand(replaceDocumentContentCommand);
234
+ export {
235
+ replaceDocumentContentCommand,
236
+ replaceDocumentContentCommandSchema
237
+ };
238
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/documents/commands/content.ts"],
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport { createHash } from 'node:crypto'\nimport { z } from 'zod'\nimport {\n registerCommand,\n type CommandHandler,\n} from '@open-mercato/shared/lib/commands'\nimport { withAtomicFlush } from '@open-mercato/shared/lib/commands/flush'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport {\n enforceCommandOptimisticLockWithGuards,\n enforceRecordGoneIsConflict,\n} from '@open-mercato/shared/lib/crud/optimistic-lock-command'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { DocumentContent } from '../data/entities'\nimport { documentContentPutSchema } from '../data/validators'\nimport { materializeDocumentContentReplacement } from '../lib/collabMaterializer'\nimport {\n advanceDocumentCollaborationGeneration,\n mutateDocumentContentState,\n} from '../lib/contentService'\nimport { DOCUMENTS_ENTITY_IDS } from '../lib/constants'\nimport {\n assertDocumentContentResourceLimits,\n} from '../lib/resourceLimits'\nimport {\n loadLockedDocumentContent,\n lockDocumentAggregateRoot,\n} from './aggregate'\nimport {\n assertDocumentCommandCanEdit,\n resolveDocumentsCommandActor,\n resolveDocumentsCommandScope,\n} from './shared'\nimport {\n documentsScopedCommandSchema,\n} from './mutation-helpers'\nimport type { DocumentsProjectionDescriptor } from './projection-types'\n\nexport const replaceDocumentContentCommandSchema = documentsScopedCommandSchema\n .merge(documentContentPutSchema)\n .extend({\n documentId: z.string().uuid(),\n contentId: z.string().uuid(),\n expectedUpdatedAt: z.string().datetime().optional().nullable(),\n writeUpdatedAt: z.string().datetime().optional(),\n })\n\nexport type ReplaceDocumentContentCommandInput = z.infer<\n typeof replaceDocumentContentCommandSchema\n>\n\ntype ContentAuditSnapshot = {\n id: string\n documentId: string\n tenantId: string\n organizationId: string\n contentDigest: string\n collaborationGeneration: number\n createdAt: string\n updatedAt: string\n deletedAt: string | null\n}\n\nexport type ReplaceDocumentContentCommandResult = {\n id: string\n updatedAt: string\n before: ContentAuditSnapshot | null\n after: ContentAuditSnapshot\n projections: DocumentsProjectionDescriptor[]\n}\n\nfunction captureContentAuditState(content: DocumentContent): ContentAuditSnapshot {\n assertDocumentContentResourceLimits({\n yjsState: content.yjsState,\n contentHtml: content.contentHtml,\n contentText: content.contentText,\n })\n const yjsState = Buffer.from(content.yjsState ?? Buffer.alloc(0))\n const contentHtml = content.contentHtml ?? ''\n const contentText = content.contentText ?? ''\n const digest = createHash('sha256')\n for (const part of [yjsState, Buffer.from(contentHtml), Buffer.from(contentText)]) {\n digest.update(String(part.byteLength))\n digest.update(':')\n digest.update(part)\n }\n return {\n id: content.id,\n documentId: content.documentId,\n tenantId: content.tenantId,\n organizationId: content.organizationId,\n contentDigest: `sha256:${digest.digest('hex')}`,\n collaborationGeneration: content.collaborationGeneration,\n createdAt: content.createdAt.toISOString(),\n updatedAt: content.updatedAt.toISOString(),\n deletedAt: content.deletedAt?.toISOString() ?? null,\n }\n}\n\nfunction changedError(): CrudHttpError {\n return new CrudHttpError(409, { error: 'documents.errors.recordChanged' })\n}\n\nfunction allocateContentWriteVersion(\n current: DocumentContent | null,\n requestedWriteUpdatedAt?: string,\n): string {\n const currentMs = current?.updatedAt.getTime() ?? 0\n const requestedMs = requestedWriteUpdatedAt ? Date.parse(requestedWriteUpdatedAt) : null\n if (requestedMs !== null && requestedMs <= currentMs) throw changedError()\n const writeMs = requestedMs ?? Math.max(Date.now(), currentMs + 1)\n return new Date(writeMs).toISOString()\n}\n\nasync function pinContentUpdatedAt(\n em: EntityManager,\n content: DocumentContent,\n input: Pick<\n ReplaceDocumentContentCommandInput,\n 'documentId' | 'tenantId' | 'organizationId'\n >,\n updatedAtIso: string,\n): Promise<void> {\n const updatedAt = new Date(updatedAtIso)\n const affected = await em.nativeUpdate(\n DocumentContent,\n {\n id: content.id,\n documentId: input.documentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n },\n { updatedAt },\n )\n if (affected !== 1) throw changedError()\n await em.refresh(content)\n if (content.updatedAt.toISOString() !== updatedAtIso) {\n throw new Error('[internal] document content optimistic-lock token was not persisted')\n }\n}\n\nfunction contentProjections(\n input: Pick<\n ReplaceDocumentContentCommandInput,\n 'documentId' | 'tenantId' | 'organizationId'\n >,\n userId?: string,\n): DocumentsProjectionDescriptor[] {\n return [\n {\n kind: 'document-index',\n documentId: input.documentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n },\n {\n kind: 'event',\n eventId: 'documents.document.updated',\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n payload: {\n id: input.documentId,\n documentId: input.documentId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n ...(userId ? { userId } : {}),\n contentEpochReset: true,\n },\n },\n ]\n}\n\nconst replaceDocumentContentCommand: CommandHandler<\n ReplaceDocumentContentCommandInput,\n ReplaceDocumentContentCommandResult\n> = {\n id: 'documents.content.replace',\n // Body replacements can approach the document resource limits and happen\n // frequently. Audit undo/redo would copy those bodies outside the bounded\n // version store. The editor and version history remain the reversal models.\n isUndoable: false,\n async execute(rawInput, ctx) {\n const input = replaceDocumentContentCommandSchema.parse(rawInput)\n const scope = resolveDocumentsCommandScope(ctx, input)\n const actorUserId = resolveDocumentsCommandActor(ctx)\n const requestEm = ctx.container.resolve('em') as EntityManager\n const em = ctx.transactionalEm ?? requestEm.fork()\n let content: DocumentContent | null = null\n let before: ContentAuditSnapshot | null = null\n let writeUpdatedAt!: string\n\n await withAtomicFlush(em, [\n async () => {\n await lockDocumentAggregateRoot(em, input.documentId, scope)\n await assertDocumentCommandCanEdit(ctx, em, input.documentId, scope)\n const current = await loadLockedDocumentContent(\n em,\n input.documentId,\n scope,\n { includeDeleted: true },\n )\n if (!current) {\n enforceRecordGoneIsConflict({\n resourceKind: DOCUMENTS_ENTITY_IDS.documentContent,\n resourceId: input.contentId,\n expected: input.expectedUpdatedAt ?? undefined,\n request: ctx.request ?? null,\n ...(input.expectedUpdatedAt ? { envValue: 'all' } : {}),\n })\n } else {\n await enforceCommandOptimisticLockWithGuards(ctx.container, {\n resourceKind: DOCUMENTS_ENTITY_IDS.documentContent,\n resourceId: current.id,\n current: current.updatedAt,\n expected: input.expectedUpdatedAt ?? undefined,\n request: ctx.request ?? null,\n ...(input.expectedUpdatedAt ? { envValue: 'all' } : {}),\n })\n }\n before = current ? captureContentAuditState(current) : null\n const replacement = materializeDocumentContentReplacement(\n current?.yjsState,\n input.contentHtml,\n )\n if (!replacement) {\n throw new Error('[internal] documents content replacement could not be materialized')\n }\n writeUpdatedAt = allocateContentWriteVersion(current, input.writeUpdatedAt)\n if (current) advanceDocumentCollaborationGeneration(current)\n content = await mutateDocumentContentState(\n em,\n input.documentId,\n scope,\n {\n yjsState: replacement.yjsState,\n contentHtml: replacement.html,\n contentText: replacement.text,\n },\n {\n id: current?.id ?? input.contentId,\n existingContent: current,\n now: new Date(writeUpdatedAt),\n },\n )\n },\n async () => {\n if (!content) throw new Error('[internal] document content replacement produced no row')\n await pinContentUpdatedAt(em, content, input, writeUpdatedAt)\n },\n ], { transaction: true, label: 'documents.content.replace' })\n\n const finalContent = content as DocumentContent | null\n if (!finalContent) throw new Error('[internal] document content replacement produced no row')\n const after = captureContentAuditState(finalContent)\n return {\n id: finalContent.id,\n updatedAt: after.updatedAt,\n before,\n after,\n projections: contentProjections(input, actorUserId),\n }\n },\n async buildLog({ input, result }) {\n const parsed = replaceDocumentContentCommandSchema.parse(input)\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('documents.audit.documentUpdated', 'Document updated'),\n resourceKind: DOCUMENTS_ENTITY_IDS.documentContent,\n resourceId: result.id,\n parentResourceKind: DOCUMENTS_ENTITY_IDS.document,\n parentResourceId: parsed.documentId,\n tenantId: parsed.tenantId,\n organizationId: parsed.organizationId,\n snapshotBefore: result.before,\n snapshotAfter: result.after,\n payload: {\n documentId: parsed.documentId,\n contentId: result.id,\n beforeContentDigest: result.before?.contentDigest ?? null,\n afterContentDigest: result.after.contentDigest,\n contentUpdatedAt: result.updatedAt,\n // The command bus normally adds the original input for redo. A null\n // sentinel prevents the body-bearing content input from being copied\n // into the action log for this deliberately non-undoable command.\n __redoInput: null,\n },\n }\n },\n}\n\nregisterCommand(replaceDocumentContentCommand)\n\nexport { replaceDocumentContentCommand }\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }