@byline/host-tanstack-start 4.19.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. package/dist/admin-shell/chrome/admin-app-bar.d.ts +7 -0
  2. package/dist/admin-shell/chrome/admin-app-bar.js +10 -2
  3. package/dist/admin-shell/chrome/session-change-boundary.d.ts +14 -0
  4. package/dist/admin-shell/chrome/session-change-boundary.js +87 -0
  5. package/dist/admin-shell/chrome/session-change-boundary.test.d.ts +8 -0
  6. package/dist/admin-shell/chrome/sign-in-page.d.ts +2 -1
  7. package/dist/admin-shell/chrome/sign-in-page.js +60 -3
  8. package/dist/admin-shell/collections/edit.d.ts +1 -1
  9. package/dist/admin-shell/collections/edit.js +151 -31
  10. package/dist/admin-shell/collections/history.js +4 -2
  11. package/dist/admin-shell/collections/list.js +30 -6
  12. package/dist/admin-shell/collections/restore-version-modal.d.ts +3 -1
  13. package/dist/admin-shell/collections/restore-version-modal.js +9 -4
  14. package/dist/admin-shell/collections/tree-list.js +16 -6
  15. package/dist/admin-shell/collections/version-history.d.ts +2 -1
  16. package/dist/admin-shell/collections/version-history.js +11 -2
  17. package/dist/admin-shell/document-mutation-notice.d.ts +6 -0
  18. package/dist/admin-shell/document-mutation-notice.js +53 -0
  19. package/dist/admin-shell/document-mutation-state.d.ts +22 -0
  20. package/dist/admin-shell/document-mutation-state.js +71 -0
  21. package/dist/admin-shell/document-mutation-state.test.d.ts +1 -0
  22. package/dist/admin-shell/scheduled-publications/list.js +15 -5
  23. package/dist/admin-shell/singletons/history.js +4 -2
  24. package/dist/admin-shell/singletons/view.d.ts +1 -1
  25. package/dist/admin-shell/singletons/view.js +98 -19
  26. package/dist/integrations/byline-admin-services.js +7 -1
  27. package/dist/integrations/byline-field-services.js +2 -9
  28. package/dist/integrations/client-ip.d.ts +19 -0
  29. package/dist/integrations/client-ip.js +34 -0
  30. package/dist/integrations/session-coordination.d.ts +24 -0
  31. package/dist/integrations/session-coordination.js +85 -0
  32. package/dist/integrations/session-middleware.d.ts +11 -0
  33. package/dist/integrations/session-middleware.js +94 -0
  34. package/dist/integrations/session-request-kind.d.ts +9 -0
  35. package/dist/integrations/session-request-kind.js +10 -0
  36. package/dist/integrations/session-request-middleware.d.ts +9 -0
  37. package/dist/integrations/session-request-middleware.js +7 -0
  38. package/dist/integrations/sign-in-body.d.ts +12 -0
  39. package/dist/integrations/sign-in-body.js +52 -0
  40. package/dist/integrations/sign-in-middleware.d.ts +9 -0
  41. package/dist/integrations/sign-in-middleware.js +10 -0
  42. package/dist/routes/create-admin-layout-route.js +46 -31
  43. package/dist/routes/create-collection-edit-route.js +1 -1
  44. package/dist/routes/create-collection-list-route.d.ts +0 -7
  45. package/dist/routes/create-collection-list-route.js +7 -9
  46. package/dist/routes/create-sign-in-route.js +4 -2
  47. package/dist/routes/create-singleton-route.d.ts +2 -0
  48. package/dist/routes/create-singleton-route.js +4 -3
  49. package/dist/server-fns/admin-account/change-password.d.ts +3 -1
  50. package/dist/server-fns/admin-account/change-password.js +9 -3
  51. package/dist/server-fns/admin-account/get.d.ts +3 -1
  52. package/dist/server-fns/admin-account/get.js +4 -1
  53. package/dist/server-fns/admin-account/index.d.ts +5 -5
  54. package/dist/server-fns/admin-account/update.d.ts +3 -1
  55. package/dist/server-fns/admin-account/update.js +4 -1
  56. package/dist/server-fns/admin-activity/get.d.ts +3 -1
  57. package/dist/server-fns/admin-activity/get.js +4 -1
  58. package/dist/server-fns/admin-permissions/get-role-abilities.d.ts +3 -1
  59. package/dist/server-fns/admin-permissions/get-role-abilities.js +4 -1
  60. package/dist/server-fns/admin-permissions/index.d.ts +4 -4
  61. package/dist/server-fns/admin-permissions/list-registered.d.ts +3 -1
  62. package/dist/server-fns/admin-permissions/list-registered.js +4 -1
  63. package/dist/server-fns/admin-permissions/set-role-abilities.d.ts +3 -1
  64. package/dist/server-fns/admin-permissions/set-role-abilities.js +4 -1
  65. package/dist/server-fns/admin-permissions/who-has.d.ts +3 -1
  66. package/dist/server-fns/admin-permissions/who-has.js +4 -1
  67. package/dist/server-fns/admin-roles/create.d.ts +3 -1
  68. package/dist/server-fns/admin-roles/create.js +4 -1
  69. package/dist/server-fns/admin-roles/delete.d.ts +3 -1
  70. package/dist/server-fns/admin-roles/delete.js +4 -1
  71. package/dist/server-fns/admin-roles/get.d.ts +3 -1
  72. package/dist/server-fns/admin-roles/get.js +4 -1
  73. package/dist/server-fns/admin-roles/index.d.ts +6 -6
  74. package/dist/server-fns/admin-roles/list.d.ts +3 -1
  75. package/dist/server-fns/admin-roles/list.js +4 -1
  76. package/dist/server-fns/admin-roles/reorder.d.ts +3 -1
  77. package/dist/server-fns/admin-roles/reorder.js +4 -1
  78. package/dist/server-fns/admin-roles/update.d.ts +3 -1
  79. package/dist/server-fns/admin-roles/update.js +4 -1
  80. package/dist/server-fns/admin-users/create.d.ts +3 -1
  81. package/dist/server-fns/admin-users/create.js +4 -1
  82. package/dist/server-fns/admin-users/delete.d.ts +3 -1
  83. package/dist/server-fns/admin-users/delete.js +4 -1
  84. package/dist/server-fns/admin-users/disable.d.ts +3 -1
  85. package/dist/server-fns/admin-users/disable.js +4 -1
  86. package/dist/server-fns/admin-users/enable.d.ts +3 -1
  87. package/dist/server-fns/admin-users/enable.js +4 -1
  88. package/dist/server-fns/admin-users/get-user-roles.d.ts +3 -1
  89. package/dist/server-fns/admin-users/get-user-roles.js +4 -1
  90. package/dist/server-fns/admin-users/get.d.ts +3 -1
  91. package/dist/server-fns/admin-users/get.js +4 -1
  92. package/dist/server-fns/admin-users/index.d.ts +10 -10
  93. package/dist/server-fns/admin-users/list.d.ts +3 -1
  94. package/dist/server-fns/admin-users/list.js +4 -1
  95. package/dist/server-fns/admin-users/set-password.d.ts +3 -1
  96. package/dist/server-fns/admin-users/set-password.js +4 -1
  97. package/dist/server-fns/admin-users/set-user-roles.d.ts +3 -1
  98. package/dist/server-fns/admin-users/set-user-roles.js +4 -1
  99. package/dist/server-fns/admin-users/update.d.ts +3 -1
  100. package/dist/server-fns/admin-users/update.js +4 -1
  101. package/dist/server-fns/ai/execute.d.ts +3 -1
  102. package/dist/server-fns/ai/execute.js +4 -1
  103. package/dist/server-fns/ai/index.d.ts +1 -1
  104. package/dist/server-fns/analytics/maintenance.d.ts +6 -2
  105. package/dist/server-fns/analytics/maintenance.js +7 -2
  106. package/dist/server-fns/analytics/queries.d.ts +18 -6
  107. package/dist/server-fns/analytics/queries.js +19 -6
  108. package/dist/server-fns/auth/current-user.d.ts +1 -0
  109. package/dist/server-fns/auth/current-user.js +5 -2
  110. package/dist/server-fns/auth/renew.d.ts +13 -0
  111. package/dist/server-fns/auth/renew.js +45 -0
  112. package/dist/server-fns/auth/sign-in.d.ts +2 -1
  113. package/dist/server-fns/auth/sign-in.js +88 -17
  114. package/dist/server-fns/auth/sign-out.d.ts +3 -1
  115. package/dist/server-fns/auth/sign-out.js +38 -6
  116. package/dist/server-fns/collections/audit.d.ts +3 -1
  117. package/dist/server-fns/collections/audit.js +4 -1
  118. package/dist/server-fns/collections/copy-to-locale.d.ts +5 -1
  119. package/dist/server-fns/collections/copy-to-locale.js +7 -2
  120. package/dist/server-fns/collections/create.d.ts +4 -1
  121. package/dist/server-fns/collections/create.js +8 -3
  122. package/dist/server-fns/collections/delete-locale.d.ts +5 -1
  123. package/dist/server-fns/collections/delete-locale.js +7 -2
  124. package/dist/server-fns/collections/delete-outcome.d.ts +7 -3
  125. package/dist/server-fns/collections/delete-outcome.js +4 -0
  126. package/dist/server-fns/collections/delete.d.ts +5 -1
  127. package/dist/server-fns/collections/delete.js +8 -3
  128. package/dist/server-fns/collections/duplicate.d.ts +5 -1
  129. package/dist/server-fns/collections/duplicate.js +8 -3
  130. package/dist/server-fns/collections/get.d.ts +1 -0
  131. package/dist/server-fns/collections/get.js +12 -6
  132. package/dist/server-fns/collections/history.d.ts +3 -1
  133. package/dist/server-fns/collections/history.js +4 -1
  134. package/dist/server-fns/collections/index.d.ts +21 -21
  135. package/dist/server-fns/collections/list.d.ts +3 -1
  136. package/dist/server-fns/collections/list.js +15 -4
  137. package/dist/server-fns/collections/reindex.d.ts +3 -1
  138. package/dist/server-fns/collections/reindex.js +4 -1
  139. package/dist/server-fns/collections/reorder.d.ts +10 -2
  140. package/dist/server-fns/collections/reorder.js +23 -76
  141. package/dist/server-fns/collections/restore-version.d.ts +6 -1
  142. package/dist/server-fns/collections/restore-version.js +8 -2
  143. package/dist/server-fns/collections/save-outcome.d.ts +1 -0
  144. package/dist/server-fns/collections/save-outcome.js +1 -0
  145. package/dist/server-fns/collections/scheduled-publication.d.ts +64 -7
  146. package/dist/server-fns/collections/scheduled-publication.js +42 -21
  147. package/dist/server-fns/collections/set-list-view-preference.d.ts +3 -1
  148. package/dist/server-fns/collections/set-list-view-preference.js +4 -1
  149. package/dist/server-fns/collections/stats.js +4 -1
  150. package/dist/server-fns/collections/status.d.ts +14 -2
  151. package/dist/server-fns/collections/status.js +18 -5
  152. package/dist/server-fns/collections/tree-mutation.d.ts +7 -6
  153. package/dist/server-fns/collections/tree-mutation.js +17 -5
  154. package/dist/server-fns/collections/tree.d.ts +29 -6
  155. package/dist/server-fns/collections/tree.js +32 -17
  156. package/dist/server-fns/collections/update.d.ts +18 -6
  157. package/dist/server-fns/collections/update.js +39 -20
  158. package/dist/server-fns/collections/upload.d.ts +11 -1
  159. package/dist/server-fns/collections/upload.js +6 -2
  160. package/dist/server-fns/document-mutation-errors.d.ts +5 -0
  161. package/dist/server-fns/document-mutation-errors.js +50 -0
  162. package/dist/server-fns/editable-revision.d.ts +9 -0
  163. package/dist/server-fns/editable-revision.js +11 -0
  164. package/dist/server-fns/i18n/set-locale.d.ts +3 -1
  165. package/dist/server-fns/i18n/set-locale.js +18 -3
  166. package/dist/server-fns/preview/disable.d.ts +3 -1
  167. package/dist/server-fns/preview/disable.js +4 -1
  168. package/dist/server-fns/preview/enable.d.ts +3 -1
  169. package/dist/server-fns/preview/enable.js +4 -1
  170. package/dist/server-fns/singleton-document-read.d.ts +1 -1
  171. package/dist/server-fns/singleton-document-read.js +7 -3
  172. package/dist/server-fns/singletons/cancel-scheduled-publish.d.ts +9 -2
  173. package/dist/server-fns/singletons/cancel-scheduled-publish.js +7 -1
  174. package/dist/server-fns/singletons/change-status.d.ts +5 -1
  175. package/dist/server-fns/singletons/change-status.js +7 -1
  176. package/dist/server-fns/singletons/confirm-scheduled-publish.d.ts +8 -2
  177. package/dist/server-fns/singletons/confirm-scheduled-publish.js +7 -2
  178. package/dist/server-fns/singletons/copy-to-locale.d.ts +5 -1
  179. package/dist/server-fns/singletons/copy-to-locale.js +7 -2
  180. package/dist/server-fns/singletons/find-by-version.d.ts +3 -1
  181. package/dist/server-fns/singletons/find-by-version.js +4 -1
  182. package/dist/server-fns/singletons/get-scheduled-publish.d.ts +3 -1
  183. package/dist/server-fns/singletons/get-scheduled-publish.js +4 -1
  184. package/dist/server-fns/singletons/get.d.ts +6 -4
  185. package/dist/server-fns/singletons/get.js +4 -1
  186. package/dist/server-fns/singletons/history.d.ts +3 -1
  187. package/dist/server-fns/singletons/history.js +4 -1
  188. package/dist/server-fns/singletons/restore-version.d.ts +5 -1
  189. package/dist/server-fns/singletons/restore-version.js +9 -3
  190. package/dist/server-fns/singletons/schedule-publish.d.ts +8 -2
  191. package/dist/server-fns/singletons/schedule-publish.js +7 -2
  192. package/dist/server-fns/singletons/unpublish.d.ts +5 -1
  193. package/dist/server-fns/singletons/unpublish.js +7 -1
  194. package/dist/server-fns/singletons/update.d.ts +6 -4
  195. package/dist/server-fns/singletons/update.js +8 -4
  196. package/dist/server-fns/structural-receipt.d.ts +4 -0
  197. package/dist/server-fns/structural-receipt.js +31 -0
  198. package/package.json +20 -20
  199. package/src/admin-shell/chrome/admin-app-bar.tsx +11 -6
  200. package/src/admin-shell/chrome/session-change-boundary.test.tsx +78 -0
  201. package/src/admin-shell/chrome/session-change-boundary.tsx +94 -0
  202. package/src/admin-shell/chrome/sign-in-page.tsx +68 -3
  203. package/src/admin-shell/collections/edit.tsx +173 -54
  204. package/src/admin-shell/collections/history.tsx +11 -2
  205. package/src/admin-shell/collections/list.tsx +22 -6
  206. package/src/admin-shell/collections/restore-version-modal.tsx +12 -3
  207. package/src/admin-shell/collections/save-navigation.test.tsx +156 -8
  208. package/src/admin-shell/collections/tree-list.tsx +16 -6
  209. package/src/admin-shell/collections/version-history.tsx +13 -3
  210. package/src/admin-shell/document-mutation-notice.tsx +45 -0
  211. package/src/admin-shell/document-mutation-state.test.tsx +146 -0
  212. package/src/admin-shell/document-mutation-state.ts +95 -0
  213. package/src/admin-shell/scheduled-publications/list.tsx +16 -6
  214. package/src/admin-shell/singletons/history.test.tsx +3 -1
  215. package/src/admin-shell/singletons/history.tsx +10 -2
  216. package/src/admin-shell/singletons/view.test.tsx +59 -18
  217. package/src/admin-shell/singletons/view.tsx +110 -29
  218. package/src/integrations/byline-admin-services.ts +7 -1
  219. package/src/integrations/byline-field-services.ts +2 -3
  220. package/src/integrations/client-ip.test.node.ts +45 -0
  221. package/src/integrations/client-ip.ts +54 -0
  222. package/src/integrations/framework-fetch-shape.test.node.ts +56 -0
  223. package/src/integrations/session-client.test.node.ts +121 -0
  224. package/src/integrations/session-coordination.test.node.ts +77 -0
  225. package/src/integrations/session-coordination.ts +96 -0
  226. package/src/integrations/session-middleware.test.node.ts +87 -0
  227. package/src/integrations/session-middleware.ts +107 -0
  228. package/src/integrations/session-request-kind.ts +18 -0
  229. package/src/integrations/session-request-middleware.ts +17 -0
  230. package/src/integrations/sign-in-body.test.node.ts +59 -0
  231. package/src/integrations/sign-in-body.ts +50 -0
  232. package/src/integrations/sign-in-middleware.ts +24 -0
  233. package/src/routes/create-admin-layout-route.tsx +48 -30
  234. package/src/routes/create-collection-edit-route.tsx +1 -0
  235. package/src/routes/create-collection-list-route.tsx +13 -2
  236. package/src/routes/create-sign-in-route.tsx +10 -2
  237. package/src/routes/create-singleton-route.test.node.ts +10 -2
  238. package/src/routes/create-singleton-route.tsx +6 -4
  239. package/src/server-fns/admin-account/change-password.test.node.ts +69 -0
  240. package/src/server-fns/admin-account/change-password.ts +13 -2
  241. package/src/server-fns/admin-account/get.ts +2 -0
  242. package/src/server-fns/admin-account/update.ts +2 -0
  243. package/src/server-fns/admin-activity/get.ts +2 -0
  244. package/src/server-fns/admin-permissions/get-role-abilities.ts +2 -0
  245. package/src/server-fns/admin-permissions/list-registered.ts +5 -4
  246. package/src/server-fns/admin-permissions/set-role-abilities.ts +2 -0
  247. package/src/server-fns/admin-permissions/who-has.ts +2 -0
  248. package/src/server-fns/admin-roles/create.ts +2 -0
  249. package/src/server-fns/admin-roles/delete.ts +2 -0
  250. package/src/server-fns/admin-roles/get.ts +2 -0
  251. package/src/server-fns/admin-roles/list.ts +5 -4
  252. package/src/server-fns/admin-roles/reorder.ts +2 -0
  253. package/src/server-fns/admin-roles/update.ts +2 -0
  254. package/src/server-fns/admin-users/create.ts +2 -0
  255. package/src/server-fns/admin-users/delete.ts +2 -0
  256. package/src/server-fns/admin-users/disable.ts +2 -0
  257. package/src/server-fns/admin-users/enable.ts +2 -0
  258. package/src/server-fns/admin-users/get-user-roles.ts +2 -0
  259. package/src/server-fns/admin-users/get.ts +2 -0
  260. package/src/server-fns/admin-users/list.ts +2 -0
  261. package/src/server-fns/admin-users/set-password.ts +2 -0
  262. package/src/server-fns/admin-users/set-user-roles.ts +2 -0
  263. package/src/server-fns/admin-users/update.ts +2 -0
  264. package/src/server-fns/ai/execute.ts +3 -0
  265. package/src/server-fns/analytics/maintenance.ts +4 -0
  266. package/src/server-fns/analytics/queries.ts +14 -8
  267. package/src/server-fns/auth/current-user.ts +7 -3
  268. package/src/server-fns/auth/renew.test.node.ts +85 -0
  269. package/src/server-fns/auth/renew.ts +54 -0
  270. package/src/server-fns/auth/sign-in.test.node.ts +114 -0
  271. package/src/server-fns/auth/sign-in.ts +80 -27
  272. package/src/server-fns/auth/sign-out.test.node.ts +85 -0
  273. package/src/server-fns/auth/sign-out.ts +44 -19
  274. package/src/server-fns/collections/audit.ts +2 -0
  275. package/src/server-fns/collections/copy-to-locale.ts +43 -36
  276. package/src/server-fns/collections/create.ts +56 -50
  277. package/src/server-fns/collections/delete-locale.ts +43 -32
  278. package/src/server-fns/collections/delete-outcome.test.node.ts +16 -0
  279. package/src/server-fns/collections/delete-outcome.ts +27 -16
  280. package/src/server-fns/collections/delete.ts +46 -38
  281. package/src/server-fns/collections/duplicate.ts +40 -32
  282. package/src/server-fns/collections/get.ts +11 -4
  283. package/src/server-fns/collections/history.ts +2 -0
  284. package/src/server-fns/collections/list.ts +10 -3
  285. package/src/server-fns/collections/reindex.ts +2 -0
  286. package/src/server-fns/collections/reorder.ts +34 -124
  287. package/src/server-fns/collections/restore-version.ts +49 -39
  288. package/src/server-fns/collections/revision-input.test.node.ts +122 -0
  289. package/src/server-fns/collections/save-outcome.test.node.ts +3 -0
  290. package/src/server-fns/collections/save-outcome.ts +2 -0
  291. package/src/server-fns/collections/scheduled-publication.ts +149 -115
  292. package/src/server-fns/collections/set-list-view-preference.ts +2 -0
  293. package/src/server-fns/collections/stats.ts +2 -0
  294. package/src/server-fns/collections/status.ts +89 -64
  295. package/src/server-fns/collections/tree-mutation.test.node.ts +87 -29
  296. package/src/server-fns/collections/tree-mutation.ts +28 -11
  297. package/src/server-fns/collections/tree.ts +156 -122
  298. package/src/server-fns/collections/update.ts +113 -86
  299. package/src/server-fns/collections/upload-singleton.test.node.ts +10 -7
  300. package/src/server-fns/collections/upload.ts +91 -77
  301. package/src/server-fns/document-mutation-errors.ts +67 -0
  302. package/src/server-fns/document-mutation-transport.test.node.ts +211 -0
  303. package/src/server-fns/editable-revision.test.node.ts +23 -0
  304. package/src/server-fns/editable-revision.ts +18 -0
  305. package/src/server-fns/i18n/set-locale.ts +19 -3
  306. package/src/server-fns/preview/disable.ts +8 -4
  307. package/src/server-fns/preview/enable.ts +9 -5
  308. package/src/server-fns/singleton-document-read.ts +7 -3
  309. package/src/server-fns/singletons/cancel-scheduled-publish.ts +12 -3
  310. package/src/server-fns/singletons/change-status.ts +12 -3
  311. package/src/server-fns/singletons/confirm-scheduled-publish.ts +14 -6
  312. package/src/server-fns/singletons/copy-to-locale.ts +22 -15
  313. package/src/server-fns/singletons/find-by-version.ts +2 -0
  314. package/src/server-fns/singletons/get-scheduled-publish.ts +2 -0
  315. package/src/server-fns/singletons/get.ts +5 -3
  316. package/src/server-fns/singletons/history.ts +2 -0
  317. package/src/server-fns/singletons/restore-version.ts +19 -12
  318. package/src/server-fns/singletons/schedule-publish.ts +20 -7
  319. package/src/server-fns/singletons/singletons.test.node.ts +69 -25
  320. package/src/server-fns/singletons/unpublish.ts +12 -3
  321. package/src/server-fns/singletons/update.ts +23 -16
  322. package/src/server-fns/structural-receipt.ts +41 -0
@@ -3,6 +3,8 @@ import { getAdminBylineClient, getAdminRequestContext } from "@byline/client/ser
3
3
  import { ERR_NOT_FOUND, ERR_VALIDATION, isSingleton } from "@byline/core";
4
4
  import { listDocumentPublishSchedules } from "@byline/core/services";
5
5
  import { bylineCore } from "../../integrations/byline-core.js";
6
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
7
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
6
8
  import { omitScheduleExecutionState } from "./scheduled-publication-response.js";
7
9
  import { serialise } from "./utils.js";
8
10
  const TASK_NAME = 'documents.publish-scheduled';
@@ -52,44 +54,66 @@ async function scheduledPublicationRuntime() {
52
54
  }
53
55
  const getScheduledPublicationRuntime = createServerFn({
54
56
  method: 'GET'
55
- }).handler(async ()=>{
57
+ }).middleware([
58
+ adminSessionMiddleware
59
+ ]).handler(withDocumentMutationErrors(async ()=>{
56
60
  await getAdminRequestContext();
57
61
  return scheduledPublicationRuntime();
58
- });
62
+ }));
59
63
  const scheduleCollectionDocumentPublish = createServerFn({
60
64
  method: 'POST'
61
- }).validator((input)=>input).handler(async ({ data })=>{
65
+ }).middleware([
66
+ adminSessionMiddleware
67
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data })=>{
62
68
  assertFeatureEnabled();
63
69
  const schedule = await getAdminBylineClient().collection(data.collection).schedulePublish(data.id, {
64
70
  publishAt: data.publishAt,
71
+ expectedRevision: data.expectedRevision,
65
72
  expectedVersionId: data.expectedVersionId
66
73
  });
67
- return serializeSchedule(schedule);
68
- });
74
+ return {
75
+ ...serializeSchedule(schedule),
76
+ revision: schedule.revision
77
+ };
78
+ }));
69
79
  const confirmCollectionDocumentScheduledPublish = createServerFn({
70
80
  method: 'POST'
71
- }).validator((input)=>input).handler(async ({ data })=>{
81
+ }).middleware([
82
+ adminSessionMiddleware
83
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data })=>{
72
84
  assertFeatureEnabled();
73
85
  const schedule = await getAdminBylineClient().collection(data.collection).confirmScheduledPublish(data.id, {
86
+ expectedRevision: data.expectedRevision,
74
87
  expectedVersionId: data.expectedVersionId
75
88
  });
76
- return serializeSchedule(schedule);
77
- });
89
+ return {
90
+ ...serializeSchedule(schedule),
91
+ revision: schedule.revision
92
+ };
93
+ }));
78
94
  const cancelCollectionDocumentScheduledPublish = createServerFn({
79
95
  method: 'POST'
80
- }).validator((input)=>input).handler(async ({ data })=>{
96
+ }).middleware([
97
+ adminSessionMiddleware
98
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data })=>{
81
99
  assertFeatureEnabled();
82
- const schedule = await getAdminBylineClient().collection(data.collection).cancelScheduledPublish(data.id);
83
- return null == schedule ? {
84
- status: 'not_found'
100
+ const schedule = await getAdminBylineClient().collection(data.collection).cancelScheduledPublish(data.id, {
101
+ expectedRevision: data.expectedRevision
102
+ });
103
+ return null == schedule.schedule ? {
104
+ status: 'not_found',
105
+ revision: schedule.revision
85
106
  } : {
86
107
  status: 'cancelled',
87
- schedule: serializeSchedule(schedule)
108
+ schedule: serializeSchedule(schedule.schedule),
109
+ revision: schedule.revision
88
110
  };
89
- });
111
+ }));
90
112
  const listScheduledPublications = createServerFn({
91
113
  method: 'GET'
92
- }).validator((input)=>input).handler(async ({ data })=>{
114
+ }).middleware([
115
+ adminSessionMiddleware
116
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data })=>{
93
117
  assertFeatureEnabled();
94
118
  if (data.states?.some((state)=>'armed' !== state && 'needs_reconfirm' !== state) === true) throw ERR_VALIDATION({
95
119
  message: 'state must be armed or needs_reconfirm'
@@ -131,15 +155,12 @@ const listScheduledPublications = createServerFn({
131
155
  }
132
156
  const schedules = await Promise.all(result.schedules.map(async (schedule)=>{
133
157
  const definition = collections.get(schedule.collectionId);
134
- const documentPath = await core.db.queries.documents.getCurrentPath({
135
- collection_id: schedule.collectionId,
136
- document_id: schedule.documentId
137
- });
138
158
  return {
139
159
  ...serializeSchedule(schedule),
140
160
  collectionPath: definition?.path ?? schedule.collectionId,
141
161
  collectionLabel: null == definition ? schedule.collectionId : isSingleton(definition) ? definition.label : definition.labels.plural,
142
- documentPath,
162
+ documentPath: schedule.documentPath,
163
+ revision: schedule.revision,
143
164
  lastAuthorizedByName: null == schedule.lastAuthorizedBy ? null : authorizerNames.get(schedule.lastAuthorizedBy) ?? null
144
165
  };
145
166
  }));
@@ -153,5 +174,5 @@ const listScheduledPublications = createServerFn({
153
174
  },
154
175
  runtime: await scheduledPublicationRuntime()
155
176
  };
156
- });
177
+ }));
157
178
  export { cancelCollectionDocumentScheduledPublish, confirmCollectionDocumentScheduledPublish, getScheduledPublicationRuntime, listScheduledPublications, scheduleCollectionDocumentPublish };
@@ -13,6 +13,8 @@ export interface SetListViewPreferenceInput {
13
13
  desc?: boolean;
14
14
  };
15
15
  }
16
- export declare const setListViewPreference: import("@tanstack/react-start").RequiredFetcher<undefined, (input: SetListViewPreferenceInput) => SetListViewPreferenceInput, Promise<{
16
+ export declare const setListViewPreference: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
17
+ bylineExpectedSessionId: string | null;
18
+ }, undefined, undefined>], (input: SetListViewPreferenceInput) => SetListViewPreferenceInput, Promise<{
17
19
  ok: true;
18
20
  }>>;
@@ -4,9 +4,12 @@ import { getAdminRequestContext } from "@byline/client/server";
4
4
  import { ERR_NOT_FOUND, getLogger } from "@byline/core";
5
5
  import { ensureCollection } from "../../integrations/api-utils.js";
6
6
  import { bylineCore } from "../../integrations/byline-core.js";
7
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
7
8
  const setListViewPreference = createServerFn({
8
9
  method: 'POST'
9
- }).validator((input)=>input).handler(async ({ data })=>{
10
+ }).middleware([
11
+ adminSessionMiddleware
12
+ ]).validator((input)=>input).handler(async ({ data })=>{
10
13
  const config = await ensureCollection(data.collection);
11
14
  if (!config) throw ERR_NOT_FOUND({
12
15
  message: 'Collection not found',
@@ -1,9 +1,12 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAdminBylineClient } from "@byline/client/server";
3
3
  import { ensureCollection } from "../../integrations/api-utils.js";
4
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
4
5
  const getCollectionStatsFn = createServerFn({
5
6
  method: 'GET'
6
- }).validator((input)=>input).handler(async ({ data })=>{
7
+ }).middleware([
8
+ adminSessionMiddleware
9
+ ]).validator((input)=>input).handler(async ({ data })=>{
7
10
  const config = await ensureCollection(data.collection);
8
11
  if (!config) return {
9
12
  stats: []
@@ -5,26 +5,38 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- export declare const updateDocumentStatus: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const updateDocumentStatus: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], (input: {
11
+ expectedRevision: number;
9
12
  collection: string;
10
13
  id: string;
11
14
  status: string;
12
15
  }) => {
16
+ expectedRevision: number;
13
17
  collection: string;
14
18
  id: string;
15
19
  status: string;
16
20
  }, Promise<{
17
21
  status: 'ok';
22
+ documentId: string;
23
+ revision: number;
18
24
  previousStatus: string;
19
25
  newStatus: string;
20
26
  }>>;
21
- export declare const unpublishDocument: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
27
+ export declare const unpublishDocument: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
28
+ bylineExpectedSessionId: string | null;
29
+ }, undefined, undefined>], (input: {
30
+ expectedRevision: number;
22
31
  collection: string;
23
32
  id: string;
24
33
  }) => {
34
+ expectedRevision: number;
25
35
  collection: string;
26
36
  id: string;
27
37
  }, Promise<{
28
38
  status: 'ok';
39
+ documentId: string;
40
+ revision: number;
29
41
  archivedCount: number;
30
42
  }>>;
@@ -3,9 +3,13 @@ import { getAdminRequestContext } from "@byline/client/server";
3
3
  import { ERR_NOT_FOUND, getLogger, getServerConfig } from "@byline/core";
4
4
  import { changeDocumentStatus, unpublishDocument } from "@byline/core/services";
5
5
  import { ensureCollection } from "../../integrations/api-utils.js";
6
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
7
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
6
8
  const updateDocumentStatus = createServerFn({
7
9
  method: 'POST'
8
- }).validator((input)=>input).handler(async ({ data: input })=>{
10
+ }).middleware([
11
+ adminSessionMiddleware
12
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
9
13
  const { collection: path, id, status: nextStatus } = input;
10
14
  const logger = getLogger();
11
15
  const config = await ensureCollection(path);
@@ -29,17 +33,22 @@ const updateDocumentStatus = createServerFn({
29
33
  };
30
34
  const result = await changeDocumentStatus(ctx, {
31
35
  documentId: id,
36
+ expectedRevision: input.expectedRevision,
32
37
  nextStatus
33
38
  });
34
39
  return {
35
40
  status: 'ok',
41
+ documentId: result.documentId,
42
+ revision: result.revision,
36
43
  previousStatus: result.previousStatus,
37
44
  newStatus: result.newStatus
38
45
  };
39
- });
46
+ }));
40
47
  const status_unpublishDocument = createServerFn({
41
48
  method: 'POST'
42
- }).validator((input)=>input).handler(async ({ data: input })=>{
49
+ }).middleware([
50
+ adminSessionMiddleware
51
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
43
52
  const { collection: path, id } = input;
44
53
  const logger = getLogger();
45
54
  const config = await ensureCollection(path);
@@ -62,18 +71,22 @@ const status_unpublishDocument = createServerFn({
62
71
  requestContext: await getAdminRequestContext()
63
72
  };
64
73
  const result = await unpublishDocument(ctx, {
65
- documentId: id
74
+ documentId: id,
75
+ expectedRevision: input.expectedRevision
66
76
  });
67
77
  if (0 === result.archivedCount) throw ERR_NOT_FOUND({
68
78
  message: 'No published version found for this document',
69
79
  details: {
70
80
  documentId: id,
81
+ expectedRevision: input.expectedRevision,
71
82
  collectionPath: path
72
83
  }
73
84
  }).log(logger);
74
85
  return {
75
86
  status: 'ok',
87
+ documentId: result.documentId,
88
+ revision: result.revision,
76
89
  archivedCount: result.archivedCount
77
90
  };
78
- });
91
+ }));
79
92
  export { status_unpublishDocument as unpublishDocument, updateDocumentStatus };
@@ -1,10 +1,12 @@
1
1
  import type { CollectionHandle, PlaceTreeNodeOptions, RemoveFromTreeOptions } from '@byline/client';
2
+ import { structuralReceipt } from '../structural-receipt.js';
2
3
  /** Prefer the code; the marker survives transports that reconstruct a code-less Error. */
3
4
  export declare function isTreeMutationConflict(error: unknown): boolean;
4
5
  /** Detect when tree/audit committed even if transport reconstruction dropped the code. */
5
6
  export declare function isCommittedTreeHookFailure(error: unknown): boolean;
6
7
  export type AdminTreeMoveOutcome = {
7
8
  status: 'ok';
9
+ receipt?: ReturnType<typeof structuralReceipt>;
8
10
  } | {
9
11
  status: 'suppressed';
10
12
  } | {
@@ -18,6 +20,7 @@ export type AdminTreeMoveOutcome = {
18
20
  } | {
19
21
  status: 'refresh-failed';
20
22
  error: unknown;
23
+ receipt?: ReturnType<typeof structuralReceipt>;
21
24
  };
22
25
  export interface AdminTreeMoveUiEffects {
23
26
  rollback: boolean;
@@ -38,9 +41,7 @@ export interface AdminTreeMoveController {
38
41
  }
39
42
  /** Single-flight controller shared by pointer and keyboard tree moves. */
40
43
  export declare function createAdminTreeMoveController(): AdminTreeMoveController;
41
- /** Admin retries reconcile post-commit tree hooks unless explicitly disabled. */
42
- export declare function placeAdminTreeNode(handle: Pick<CollectionHandle, 'placeTreeNode'>, documentId: string, options: PlaceTreeNodeOptions): Promise<{
43
- orderKey: string;
44
- }>;
45
- /** Admin retries reconcile post-commit tree hooks unless explicitly disabled. */
46
- export declare function removeAdminTreeNode(handle: Pick<CollectionHandle, 'removeFromTree'>, documentId: string, options?: RemoveFromTreeOptions): Promise<void>;
44
+ /** Request reconciliation for explicit caller actions; never retry or replace their revision. */
45
+ export declare function placeAdminTreeNode(handle: Pick<CollectionHandle, 'placeTreeNode'>, documentId: string, options: PlaceTreeNodeOptions): ReturnType<CollectionHandle['placeTreeNode']>;
46
+ /** Request reconciliation for explicit caller actions; never retry or replace their revision. */
47
+ export declare function removeAdminTreeNode(handle: Pick<CollectionHandle, 'removeFromTree'>, documentId: string, options: RemoveFromTreeOptions): ReturnType<CollectionHandle['removeFromTree']>;
@@ -1,4 +1,5 @@
1
- import { ErrorCodes, TREE_HOOK_COMMITTED_MARKER, TREE_PLACEMENT_STALE_MARKER } from "@byline/core";
1
+ import { ErrorCodes, TREE_HOOK_COMMITTED_MARKER, TREE_PLACEMENT_STALE_MARKER, getDocumentRevisionValidationDetails, getDocumentStaleDetails, getLockConflictDetails } from "@byline/core";
2
+ import { structuralReceipt } from "../structural-receipt.js";
2
3
  function hasErrorCode(error, code) {
3
4
  return 'object' == typeof error && null != error && 'code' in error && error.code === code;
4
5
  }
@@ -47,9 +48,14 @@ function shouldSyncAdminTreeRows(rows, preservedRows, isMoving) {
47
48
  return !isMoving && rows !== preservedRows;
48
49
  }
49
50
  async function executeAdminTreeMove(mutate, refresh) {
51
+ let receipt;
50
52
  try {
51
- await mutate();
53
+ receipt = structuralReceipt(await mutate());
52
54
  } catch (error) {
55
+ if (getDocumentStaleDetails(error) || getDocumentRevisionValidationDetails(error) || getLockConflictDetails(error) || hasErrorCode(error, ErrorCodes.NOT_FOUND)) return {
56
+ status: 'mutation-failed',
57
+ error
58
+ };
53
59
  const status = isCommittedTreeHookFailure(error) ? 'committed-hook-failed' : 'mutation-failed';
54
60
  try {
55
61
  await refresh();
@@ -68,12 +74,18 @@ async function executeAdminTreeMove(mutate, refresh) {
68
74
  try {
69
75
  await refresh();
70
76
  return {
71
- status: 'ok'
77
+ status: 'ok',
78
+ ...receipt ? {
79
+ receipt
80
+ } : {}
72
81
  };
73
82
  } catch (error) {
74
83
  return {
75
84
  status: 'refresh-failed',
76
- error
85
+ error,
86
+ ...receipt ? {
87
+ receipt
88
+ } : {}
77
89
  };
78
90
  }
79
91
  }
@@ -100,7 +112,7 @@ function placeAdminTreeNode(handle, documentId, options) {
100
112
  reconcile: options.reconcile ?? true
101
113
  });
102
114
  }
103
- function removeAdminTreeNode(handle, documentId, options = {}) {
115
+ function removeAdminTreeNode(handle, documentId, options) {
104
116
  return handle.removeFromTree(documentId, {
105
117
  ...options,
106
118
  reconcile: options.reconcile ?? true
@@ -5,7 +5,10 @@
5
5
  *
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
- export declare const placeTreeNode: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
8
+ export declare const placeTreeNode: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
9
+ bylineExpectedSessionId: string | null;
10
+ }, undefined, undefined>], (input: {
11
+ expectedRevision: number;
9
12
  collection: string;
10
13
  documentId: string;
11
14
  parentDocumentId: string | null;
@@ -13,6 +16,7 @@ export declare const placeTreeNode: import("@tanstack/react-start").RequiredFetc
13
16
  afterDocumentId?: string | null;
14
17
  reconcile?: boolean;
15
18
  }) => {
19
+ expectedRevision: number;
16
20
  collection: string;
17
21
  documentId: string;
18
22
  parentDocumentId: string | null;
@@ -20,21 +24,35 @@ export declare const placeTreeNode: import("@tanstack/react-start").RequiredFetc
20
24
  afterDocumentId?: string | null;
21
25
  reconcile?: boolean;
22
26
  }, Promise<{
23
- status: 'ok';
27
+ documentId: string;
28
+ revision: number;
29
+ affectedDocuments: import("@byline/core").DocumentRevisionReceipt[];
30
+ scheduledPublicationsNeedReconfirmation: boolean;
24
31
  orderKey: string;
32
+ status: 'ok';
25
33
  }>>;
26
- export declare const removeFromTree: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
34
+ export declare const removeFromTree: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
35
+ bylineExpectedSessionId: string | null;
36
+ }, undefined, undefined>], (input: {
37
+ expectedRevision: number;
27
38
  collection: string;
28
39
  documentId: string;
29
40
  reconcile?: boolean;
30
41
  }) => {
42
+ expectedRevision: number;
31
43
  collection: string;
32
44
  documentId: string;
33
45
  reconcile?: boolean;
34
46
  }, Promise<{
47
+ documentId: string;
48
+ revision: number;
49
+ affectedDocuments: import("@byline/core").DocumentRevisionReceipt[];
50
+ scheduledPublicationsNeedReconfirmation: boolean;
35
51
  status: 'ok';
36
52
  }>>;
37
- export declare const getTreeAncestors: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
53
+ export declare const getTreeAncestors: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
54
+ bylineExpectedSessionId: string | null;
55
+ }, undefined, undefined>], (input: {
38
56
  collection: string;
39
57
  documentId: string;
40
58
  }) => {
@@ -45,7 +63,9 @@ export declare const getTreeAncestors: import("@tanstack/react-start").RequiredF
45
63
  title: string;
46
64
  path: string;
47
65
  }[]>>;
48
- export declare const getTreeParent: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
66
+ export declare const getTreeParent: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
67
+ bylineExpectedSessionId: string | null;
68
+ }, undefined, undefined>], (input: {
49
69
  collection: string;
50
70
  documentId: string;
51
71
  }) => {
@@ -53,6 +73,7 @@ export declare const getTreeParent: import("@tanstack/react-start").RequiredFetc
53
73
  documentId: string;
54
74
  }, Promise<import("@byline/client").TreeParentResult>>;
55
75
  export interface CollectionTreeRow {
76
+ revision: number;
56
77
  id: string;
57
78
  /** Parent document id, or `null` for a root or unplaced node. Drives the
58
79
  * client-side tree reconstruction for drag-to-reorder / re-parent. */
@@ -65,7 +86,9 @@ export interface CollectionTreeRow {
65
86
  updatedAt: Date;
66
87
  fields: Record<string, any>;
67
88
  }
68
- export declare const getCollectionTree: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
89
+ export declare const getCollectionTree: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
90
+ bylineExpectedSessionId: string | null;
91
+ }, undefined, undefined>], (input: {
69
92
  collection: string;
70
93
  locale?: string;
71
94
  }) => {
@@ -2,11 +2,15 @@ import { createServerFn } from "@tanstack/react-start";
2
2
  import { getAdminBylineClient } from "@byline/client/server";
3
3
  import { ERR_NOT_FOUND, createReadContext, getLogger } from "@byline/core";
4
4
  import { ensureCollection } from "../../integrations/api-utils.js";
5
+ import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
6
+ import { withDocumentMutationErrors } from "../document-mutation-errors.js";
5
7
  import { placeAdminTreeNode, removeAdminTreeNode } from "./tree-mutation.js";
6
- import { getAdminTreeParent, getAdminUnplacedTreeDocuments } from "./tree-read.js";
8
+ import { getAdminTreeParent } from "./tree-read.js";
7
9
  const placeTreeNode = createServerFn({
8
10
  method: 'POST'
9
- }).validator((input)=>input).handler(async ({ data })=>{
11
+ }).middleware([
12
+ adminSessionMiddleware
13
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data })=>{
10
14
  const { collection: path, documentId } = data;
11
15
  const config = await ensureCollection(path);
12
16
  if (!config) throw ERR_NOT_FOUND({
@@ -17,6 +21,7 @@ const placeTreeNode = createServerFn({
17
21
  }).log(getLogger());
18
22
  const handle = getAdminBylineClient().collection(path);
19
23
  const result = await placeAdminTreeNode(handle, documentId, {
24
+ expectedRevision: data.expectedRevision,
20
25
  parentDocumentId: data.parentDocumentId,
21
26
  beforeDocumentId: data.beforeDocumentId ?? null,
22
27
  afterDocumentId: data.afterDocumentId ?? null,
@@ -24,12 +29,14 @@ const placeTreeNode = createServerFn({
24
29
  });
25
30
  return {
26
31
  status: 'ok',
27
- orderKey: result.orderKey
32
+ ...result
28
33
  };
29
- });
34
+ }));
30
35
  const removeFromTree = createServerFn({
31
36
  method: 'POST'
32
- }).validator((input)=>input).handler(async ({ data })=>{
37
+ }).middleware([
38
+ adminSessionMiddleware
39
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data })=>{
33
40
  const { collection: path, documentId } = data;
34
41
  const config = await ensureCollection(path);
35
42
  if (!config) throw ERR_NOT_FOUND({
@@ -38,16 +45,20 @@ const removeFromTree = createServerFn({
38
45
  collectionPath: path
39
46
  }
40
47
  }).log(getLogger());
41
- await removeAdminTreeNode(getAdminBylineClient().collection(path), documentId, {
48
+ const result = await removeAdminTreeNode(getAdminBylineClient().collection(path), documentId, {
49
+ expectedRevision: data.expectedRevision,
42
50
  reconcile: data.reconcile
43
51
  });
44
52
  return {
45
- status: 'ok'
53
+ status: 'ok',
54
+ ...result
46
55
  };
47
- });
56
+ }));
48
57
  const getTreeAncestors = createServerFn({
49
58
  method: 'GET'
50
- }).validator((input)=>input).handler(async ({ data })=>{
59
+ }).middleware([
60
+ adminSessionMiddleware
61
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data })=>{
51
62
  const { collection: path, documentId } = data;
52
63
  const config = await ensureCollection(path);
53
64
  if (!config) throw ERR_NOT_FOUND({
@@ -69,10 +80,12 @@ const getTreeAncestors = createServerFn({
69
80
  path: doc.path
70
81
  };
71
82
  });
72
- });
83
+ }));
73
84
  const getTreeParent = createServerFn({
74
85
  method: 'GET'
75
- }).validator((input)=>input).handler(async ({ data })=>{
86
+ }).middleware([
87
+ adminSessionMiddleware
88
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data })=>{
76
89
  const { collection: path, documentId } = data;
77
90
  const config = await ensureCollection(path);
78
91
  if (!config) throw ERR_NOT_FOUND({
@@ -82,10 +95,12 @@ const getTreeParent = createServerFn({
82
95
  }
83
96
  }).log(getLogger());
84
97
  return getAdminTreeParent(getAdminBylineClient().collection(path), documentId);
85
- });
98
+ }));
86
99
  const getCollectionTree = createServerFn({
87
100
  method: 'GET'
88
- }).validator((input)=>input).handler(async ({ data })=>{
101
+ }).middleware([
102
+ adminSessionMiddleware
103
+ ]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data })=>{
89
104
  const { collection: path } = data;
90
105
  const config = await ensureCollection(path);
91
106
  if (!config) throw ERR_NOT_FOUND({
@@ -96,8 +111,7 @@ const getCollectionTree = createServerFn({
96
111
  }).log(getLogger());
97
112
  const handle = getAdminBylineClient().collection(path);
98
113
  const readContext = createReadContext();
99
- const forest = await handle.getSubtree({
100
- status: 'any',
114
+ const { forest, unplaced } = await handle.getTreeForEdit({
101
115
  locale: data.locale,
102
116
  _readContext: readContext
103
117
  });
@@ -108,6 +122,7 @@ const getCollectionTree = createServerFn({
108
122
  const doc = node.document;
109
123
  rows.push({
110
124
  id: doc.id,
125
+ revision: doc.revision,
111
126
  parentId,
112
127
  depth,
113
128
  unplaced: false,
@@ -122,9 +137,9 @@ const getCollectionTree = createServerFn({
122
137
  }
123
138
  };
124
139
  walk(forest, 0, null);
125
- const unplaced = await getAdminUnplacedTreeDocuments(handle, placed, readContext, data.locale);
126
140
  for (const doc of unplaced)rows.push({
127
141
  id: doc.id,
142
+ revision: doc.revision,
128
143
  parentId: null,
129
144
  depth: 0,
130
145
  unplaced: true,
@@ -143,5 +158,5 @@ const getCollectionTree = createServerFn({
143
158
  }
144
159
  }
145
160
  };
146
- });
161
+ }));
147
162
  export { getCollectionTree, getTreeAncestors, getTreeParent, placeTreeNode, removeFromTree };
@@ -6,26 +6,36 @@
6
6
  * Copyright (c) Infonomic Company Limited
7
7
  */
8
8
  import type { DocumentPatch } from '@byline/core/patches';
9
- export declare const updateCollectionDocumentWithPatches: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
9
+ export declare const updateCollectionDocumentWithPatches: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
10
+ bylineExpectedSessionId: string | null;
11
+ }, undefined, undefined>], (input: {
10
12
  collection: string;
11
13
  id: string;
12
14
  patches: DocumentPatch[];
13
- versionId?: string;
15
+ expectedRevision: number;
16
+ path?: string | null;
17
+ availableLocales?: string[];
14
18
  locale?: string;
15
19
  }) => {
16
20
  collection: string;
17
21
  id: string;
18
22
  patches: DocumentPatch[];
19
- versionId?: string;
23
+ expectedRevision: number;
24
+ path?: string | null;
25
+ availableLocales?: string[];
20
26
  locale?: string;
21
27
  }, Promise<import("./save-outcome.js").CollectionDocumentCommittedHookFailureResponse | {
22
28
  status: 'ok';
23
29
  documentId: string;
24
- documentVersionId: string;
30
+ documentVersionId?: string | undefined;
31
+ revision: number;
25
32
  }>>;
26
- export declare const updateCollectionDocumentSystemFields: import("@tanstack/react-start").RequiredFetcher<undefined, (input: {
33
+ export declare const updateCollectionDocumentSystemFields: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
34
+ bylineExpectedSessionId: string | null;
35
+ }, undefined, undefined>], (input: {
27
36
  collection: string;
28
37
  id: string;
38
+ expectedRevision: number;
29
39
  locale?: string;
30
40
  /** Path override; `null`/omitted means no path write. */
31
41
  path?: string | null;
@@ -34,11 +44,13 @@ export declare const updateCollectionDocumentSystemFields: import("@tanstack/rea
34
44
  }) => {
35
45
  collection: string;
36
46
  id: string;
47
+ expectedRevision: number;
37
48
  locale?: string;
38
49
  /** Path override; `null`/omitted means no path write. */
39
50
  path?: string | null;
40
51
  /** Editorial advertised-locale set; omitted means no advertised-locale write. */
41
52
  availableLocales?: string[];
42
- }, Promise<{
53
+ }, Promise<import("./save-outcome.js").CollectionDocumentCommittedHookFailureResponse | {
43
54
  status: 'ok';
55
+ revision: number;
44
56
  }>>;