@byline/host-tanstack-start 5.0.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 (252) 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/integrations/byline-admin-services.js +7 -1
  9. package/dist/integrations/client-ip.d.ts +19 -0
  10. package/dist/integrations/client-ip.js +34 -0
  11. package/dist/integrations/session-coordination.d.ts +24 -0
  12. package/dist/integrations/session-coordination.js +85 -0
  13. package/dist/integrations/session-middleware.d.ts +11 -0
  14. package/dist/integrations/session-middleware.js +94 -0
  15. package/dist/integrations/session-request-kind.d.ts +9 -0
  16. package/dist/integrations/session-request-kind.js +10 -0
  17. package/dist/integrations/session-request-middleware.d.ts +9 -0
  18. package/dist/integrations/session-request-middleware.js +7 -0
  19. package/dist/integrations/sign-in-body.d.ts +12 -0
  20. package/dist/integrations/sign-in-body.js +52 -0
  21. package/dist/integrations/sign-in-middleware.d.ts +9 -0
  22. package/dist/integrations/sign-in-middleware.js +10 -0
  23. package/dist/routes/create-admin-layout-route.js +46 -31
  24. package/dist/routes/create-sign-in-route.js +4 -2
  25. package/dist/server-fns/admin-account/change-password.d.ts +3 -1
  26. package/dist/server-fns/admin-account/change-password.js +9 -3
  27. package/dist/server-fns/admin-account/get.d.ts +3 -1
  28. package/dist/server-fns/admin-account/get.js +4 -1
  29. package/dist/server-fns/admin-account/index.d.ts +5 -5
  30. package/dist/server-fns/admin-account/update.d.ts +3 -1
  31. package/dist/server-fns/admin-account/update.js +4 -1
  32. package/dist/server-fns/admin-activity/get.d.ts +3 -1
  33. package/dist/server-fns/admin-activity/get.js +4 -1
  34. package/dist/server-fns/admin-permissions/get-role-abilities.d.ts +3 -1
  35. package/dist/server-fns/admin-permissions/get-role-abilities.js +4 -1
  36. package/dist/server-fns/admin-permissions/index.d.ts +4 -4
  37. package/dist/server-fns/admin-permissions/list-registered.d.ts +3 -1
  38. package/dist/server-fns/admin-permissions/list-registered.js +4 -1
  39. package/dist/server-fns/admin-permissions/set-role-abilities.d.ts +3 -1
  40. package/dist/server-fns/admin-permissions/set-role-abilities.js +4 -1
  41. package/dist/server-fns/admin-permissions/who-has.d.ts +3 -1
  42. package/dist/server-fns/admin-permissions/who-has.js +4 -1
  43. package/dist/server-fns/admin-roles/create.d.ts +3 -1
  44. package/dist/server-fns/admin-roles/create.js +4 -1
  45. package/dist/server-fns/admin-roles/delete.d.ts +3 -1
  46. package/dist/server-fns/admin-roles/delete.js +4 -1
  47. package/dist/server-fns/admin-roles/get.d.ts +3 -1
  48. package/dist/server-fns/admin-roles/get.js +4 -1
  49. package/dist/server-fns/admin-roles/index.d.ts +6 -6
  50. package/dist/server-fns/admin-roles/list.d.ts +3 -1
  51. package/dist/server-fns/admin-roles/list.js +4 -1
  52. package/dist/server-fns/admin-roles/reorder.d.ts +3 -1
  53. package/dist/server-fns/admin-roles/reorder.js +4 -1
  54. package/dist/server-fns/admin-roles/update.d.ts +3 -1
  55. package/dist/server-fns/admin-roles/update.js +4 -1
  56. package/dist/server-fns/admin-users/create.d.ts +3 -1
  57. package/dist/server-fns/admin-users/create.js +4 -1
  58. package/dist/server-fns/admin-users/delete.d.ts +3 -1
  59. package/dist/server-fns/admin-users/delete.js +4 -1
  60. package/dist/server-fns/admin-users/disable.d.ts +3 -1
  61. package/dist/server-fns/admin-users/disable.js +4 -1
  62. package/dist/server-fns/admin-users/enable.d.ts +3 -1
  63. package/dist/server-fns/admin-users/enable.js +4 -1
  64. package/dist/server-fns/admin-users/get-user-roles.d.ts +3 -1
  65. package/dist/server-fns/admin-users/get-user-roles.js +4 -1
  66. package/dist/server-fns/admin-users/get.d.ts +3 -1
  67. package/dist/server-fns/admin-users/get.js +4 -1
  68. package/dist/server-fns/admin-users/index.d.ts +10 -10
  69. package/dist/server-fns/admin-users/list.d.ts +3 -1
  70. package/dist/server-fns/admin-users/list.js +4 -1
  71. package/dist/server-fns/admin-users/set-password.d.ts +3 -1
  72. package/dist/server-fns/admin-users/set-password.js +4 -1
  73. package/dist/server-fns/admin-users/set-user-roles.d.ts +3 -1
  74. package/dist/server-fns/admin-users/set-user-roles.js +4 -1
  75. package/dist/server-fns/admin-users/update.d.ts +3 -1
  76. package/dist/server-fns/admin-users/update.js +4 -1
  77. package/dist/server-fns/ai/execute.d.ts +3 -1
  78. package/dist/server-fns/ai/execute.js +4 -1
  79. package/dist/server-fns/ai/index.d.ts +1 -1
  80. package/dist/server-fns/analytics/maintenance.d.ts +6 -2
  81. package/dist/server-fns/analytics/maintenance.js +7 -2
  82. package/dist/server-fns/analytics/queries.d.ts +18 -6
  83. package/dist/server-fns/analytics/queries.js +19 -6
  84. package/dist/server-fns/auth/current-user.d.ts +1 -0
  85. package/dist/server-fns/auth/current-user.js +5 -2
  86. package/dist/server-fns/auth/renew.d.ts +13 -0
  87. package/dist/server-fns/auth/renew.js +45 -0
  88. package/dist/server-fns/auth/sign-in.d.ts +2 -1
  89. package/dist/server-fns/auth/sign-in.js +88 -17
  90. package/dist/server-fns/auth/sign-out.d.ts +3 -1
  91. package/dist/server-fns/auth/sign-out.js +38 -6
  92. package/dist/server-fns/collections/audit.d.ts +3 -1
  93. package/dist/server-fns/collections/audit.js +4 -1
  94. package/dist/server-fns/collections/copy-to-locale.d.ts +10 -1
  95. package/dist/server-fns/collections/copy-to-locale.js +5 -2
  96. package/dist/server-fns/collections/create.d.ts +10 -1
  97. package/dist/server-fns/collections/create.js +5 -2
  98. package/dist/server-fns/collections/delete-locale.d.ts +10 -1
  99. package/dist/server-fns/collections/delete-locale.js +5 -2
  100. package/dist/server-fns/collections/delete.d.ts +10 -1
  101. package/dist/server-fns/collections/delete.js +5 -2
  102. package/dist/server-fns/collections/duplicate.d.ts +10 -1
  103. package/dist/server-fns/collections/duplicate.js +5 -2
  104. package/dist/server-fns/collections/get.d.ts +7 -0
  105. package/dist/server-fns/collections/get.js +8 -3
  106. package/dist/server-fns/collections/history.d.ts +3 -1
  107. package/dist/server-fns/collections/history.js +4 -1
  108. package/dist/server-fns/collections/index.d.ts +21 -21
  109. package/dist/server-fns/collections/list.d.ts +10 -1
  110. package/dist/server-fns/collections/list.js +5 -2
  111. package/dist/server-fns/collections/reindex.d.ts +3 -1
  112. package/dist/server-fns/collections/reindex.js +4 -1
  113. package/dist/server-fns/collections/reorder.d.ts +10 -1
  114. package/dist/server-fns/collections/reorder.js +5 -2
  115. package/dist/server-fns/collections/restore-version.d.ts +10 -1
  116. package/dist/server-fns/collections/restore-version.js +5 -2
  117. package/dist/server-fns/collections/scheduled-publication.d.ts +22 -5
  118. package/dist/server-fns/collections/scheduled-publication.js +17 -6
  119. package/dist/server-fns/collections/set-list-view-preference.d.ts +3 -1
  120. package/dist/server-fns/collections/set-list-view-preference.js +4 -1
  121. package/dist/server-fns/collections/stats.js +4 -1
  122. package/dist/server-fns/collections/status.d.ts +13 -2
  123. package/dist/server-fns/collections/status.js +8 -3
  124. package/dist/server-fns/collections/tree.d.ts +22 -5
  125. package/dist/server-fns/collections/tree.js +17 -6
  126. package/dist/server-fns/collections/update.d.ts +13 -2
  127. package/dist/server-fns/collections/update.js +8 -3
  128. package/dist/server-fns/collections/upload.d.ts +10 -1
  129. package/dist/server-fns/collections/upload.js +4 -1
  130. package/dist/server-fns/i18n/set-locale.d.ts +3 -1
  131. package/dist/server-fns/i18n/set-locale.js +18 -3
  132. package/dist/server-fns/preview/disable.d.ts +3 -1
  133. package/dist/server-fns/preview/disable.js +4 -1
  134. package/dist/server-fns/preview/enable.d.ts +3 -1
  135. package/dist/server-fns/preview/enable.js +4 -1
  136. package/dist/server-fns/singletons/cancel-scheduled-publish.d.ts +10 -1
  137. package/dist/server-fns/singletons/cancel-scheduled-publish.js +5 -2
  138. package/dist/server-fns/singletons/change-status.d.ts +10 -1
  139. package/dist/server-fns/singletons/change-status.js +5 -2
  140. package/dist/server-fns/singletons/confirm-scheduled-publish.d.ts +10 -1
  141. package/dist/server-fns/singletons/confirm-scheduled-publish.js +5 -2
  142. package/dist/server-fns/singletons/copy-to-locale.d.ts +10 -1
  143. package/dist/server-fns/singletons/copy-to-locale.js +5 -2
  144. package/dist/server-fns/singletons/find-by-version.d.ts +3 -1
  145. package/dist/server-fns/singletons/find-by-version.js +4 -1
  146. package/dist/server-fns/singletons/get-scheduled-publish.d.ts +3 -1
  147. package/dist/server-fns/singletons/get-scheduled-publish.js +4 -1
  148. package/dist/server-fns/singletons/get.d.ts +3 -1
  149. package/dist/server-fns/singletons/get.js +4 -1
  150. package/dist/server-fns/singletons/history.d.ts +3 -1
  151. package/dist/server-fns/singletons/history.js +4 -1
  152. package/dist/server-fns/singletons/restore-version.d.ts +10 -1
  153. package/dist/server-fns/singletons/restore-version.js +5 -2
  154. package/dist/server-fns/singletons/schedule-publish.d.ts +10 -1
  155. package/dist/server-fns/singletons/schedule-publish.js +5 -2
  156. package/dist/server-fns/singletons/unpublish.d.ts +10 -1
  157. package/dist/server-fns/singletons/unpublish.js +5 -2
  158. package/dist/server-fns/singletons/update.d.ts +10 -1
  159. package/dist/server-fns/singletons/update.js +5 -2
  160. package/package.json +19 -19
  161. package/src/admin-shell/chrome/admin-app-bar.tsx +11 -6
  162. package/src/admin-shell/chrome/session-change-boundary.test.tsx +78 -0
  163. package/src/admin-shell/chrome/session-change-boundary.tsx +94 -0
  164. package/src/admin-shell/chrome/sign-in-page.tsx +68 -3
  165. package/src/integrations/byline-admin-services.ts +7 -1
  166. package/src/integrations/client-ip.test.node.ts +45 -0
  167. package/src/integrations/client-ip.ts +54 -0
  168. package/src/integrations/framework-fetch-shape.test.node.ts +56 -0
  169. package/src/integrations/session-client.test.node.ts +121 -0
  170. package/src/integrations/session-coordination.test.node.ts +77 -0
  171. package/src/integrations/session-coordination.ts +96 -0
  172. package/src/integrations/session-middleware.test.node.ts +87 -0
  173. package/src/integrations/session-middleware.ts +107 -0
  174. package/src/integrations/session-request-kind.ts +18 -0
  175. package/src/integrations/session-request-middleware.ts +17 -0
  176. package/src/integrations/sign-in-body.test.node.ts +59 -0
  177. package/src/integrations/sign-in-body.ts +50 -0
  178. package/src/integrations/sign-in-middleware.ts +24 -0
  179. package/src/routes/create-admin-layout-route.tsx +48 -30
  180. package/src/routes/create-sign-in-route.tsx +10 -2
  181. package/src/server-fns/admin-account/change-password.test.node.ts +69 -0
  182. package/src/server-fns/admin-account/change-password.ts +13 -2
  183. package/src/server-fns/admin-account/get.ts +2 -0
  184. package/src/server-fns/admin-account/update.ts +2 -0
  185. package/src/server-fns/admin-activity/get.ts +2 -0
  186. package/src/server-fns/admin-permissions/get-role-abilities.ts +2 -0
  187. package/src/server-fns/admin-permissions/list-registered.ts +5 -4
  188. package/src/server-fns/admin-permissions/set-role-abilities.ts +2 -0
  189. package/src/server-fns/admin-permissions/who-has.ts +2 -0
  190. package/src/server-fns/admin-roles/create.ts +2 -0
  191. package/src/server-fns/admin-roles/delete.ts +2 -0
  192. package/src/server-fns/admin-roles/get.ts +2 -0
  193. package/src/server-fns/admin-roles/list.ts +5 -4
  194. package/src/server-fns/admin-roles/reorder.ts +2 -0
  195. package/src/server-fns/admin-roles/update.ts +2 -0
  196. package/src/server-fns/admin-users/create.ts +2 -0
  197. package/src/server-fns/admin-users/delete.ts +2 -0
  198. package/src/server-fns/admin-users/disable.ts +2 -0
  199. package/src/server-fns/admin-users/enable.ts +2 -0
  200. package/src/server-fns/admin-users/get-user-roles.ts +2 -0
  201. package/src/server-fns/admin-users/get.ts +2 -0
  202. package/src/server-fns/admin-users/list.ts +2 -0
  203. package/src/server-fns/admin-users/set-password.ts +2 -0
  204. package/src/server-fns/admin-users/set-user-roles.ts +2 -0
  205. package/src/server-fns/admin-users/update.ts +2 -0
  206. package/src/server-fns/ai/execute.ts +3 -0
  207. package/src/server-fns/analytics/maintenance.ts +4 -0
  208. package/src/server-fns/analytics/queries.ts +14 -8
  209. package/src/server-fns/auth/current-user.ts +7 -3
  210. package/src/server-fns/auth/renew.test.node.ts +85 -0
  211. package/src/server-fns/auth/renew.ts +54 -0
  212. package/src/server-fns/auth/sign-in.test.node.ts +114 -0
  213. package/src/server-fns/auth/sign-in.ts +80 -27
  214. package/src/server-fns/auth/sign-out.test.node.ts +85 -0
  215. package/src/server-fns/auth/sign-out.ts +44 -19
  216. package/src/server-fns/collections/audit.ts +2 -0
  217. package/src/server-fns/collections/copy-to-locale.ts +3 -1
  218. package/src/server-fns/collections/create.ts +3 -1
  219. package/src/server-fns/collections/delete-locale.ts +3 -1
  220. package/src/server-fns/collections/delete.ts +3 -1
  221. package/src/server-fns/collections/duplicate.ts +3 -1
  222. package/src/server-fns/collections/get.ts +4 -1
  223. package/src/server-fns/collections/history.ts +2 -0
  224. package/src/server-fns/collections/list.ts +3 -1
  225. package/src/server-fns/collections/reindex.ts +2 -0
  226. package/src/server-fns/collections/reorder.ts +3 -1
  227. package/src/server-fns/collections/restore-version.ts +3 -1
  228. package/src/server-fns/collections/revision-input.test.node.ts +14 -0
  229. package/src/server-fns/collections/scheduled-publication.ts +14 -7
  230. package/src/server-fns/collections/set-list-view-preference.ts +2 -0
  231. package/src/server-fns/collections/stats.ts +2 -0
  232. package/src/server-fns/collections/status.ts +4 -1
  233. package/src/server-fns/collections/tree.ts +7 -1
  234. package/src/server-fns/collections/update.ts +4 -1
  235. package/src/server-fns/collections/upload-singleton.test.node.ts +8 -1
  236. package/src/server-fns/collections/upload.ts +10 -0
  237. package/src/server-fns/i18n/set-locale.ts +19 -3
  238. package/src/server-fns/preview/disable.ts +8 -4
  239. package/src/server-fns/preview/enable.ts +9 -5
  240. package/src/server-fns/singletons/cancel-scheduled-publish.ts +3 -1
  241. package/src/server-fns/singletons/change-status.ts +3 -1
  242. package/src/server-fns/singletons/confirm-scheduled-publish.ts +3 -1
  243. package/src/server-fns/singletons/copy-to-locale.ts +3 -1
  244. package/src/server-fns/singletons/find-by-version.ts +2 -0
  245. package/src/server-fns/singletons/get-scheduled-publish.ts +2 -0
  246. package/src/server-fns/singletons/get.ts +2 -0
  247. package/src/server-fns/singletons/history.ts +2 -0
  248. package/src/server-fns/singletons/restore-version.ts +3 -1
  249. package/src/server-fns/singletons/schedule-publish.ts +3 -1
  250. package/src/server-fns/singletons/singletons.test.node.ts +6 -0
  251. package/src/server-fns/singletons/unpublish.ts +3 -1
  252. package/src/server-fns/singletons/update.ts +3 -1
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -15,6 +14,8 @@ import type { DocumentLifecycleContext } from '@byline/core/services'
15
14
  import { restoreDocumentVersion as restoreDocumentVersionService } from '@byline/core/services'
16
15
 
17
16
  import { ensureCollection } from '../../integrations/api-utils.js'
17
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
18
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
18
19
  import { toCommittedDocumentHookFailureResponse } from './save-outcome.js'
19
20
 
20
21
  // ---------------------------------------------------------------------------
@@ -22,6 +23,7 @@ import { toCommittedDocumentHookFailureResponse } from './save-outcome.js'
22
23
  // ---------------------------------------------------------------------------
23
24
 
24
25
  export const restoreDocumentVersion = createServerFn({ method: 'POST' })
26
+ .middleware([adminSessionMiddleware])
25
27
  .validator(
26
28
  (input: { expectedRevision: number; collection: string; id: string; versionId: string }) =>
27
29
  input
@@ -1,3 +1,14 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+
9
+ // Handler-level tests isolate transport; session-middleware tests exercise the real pre-handler boundary.
10
+ vi.mock('../../integrations/session-middleware.js', () => ({ adminSessionMiddleware: {} }))
11
+
1
12
  import { createSuperAdminContext } from '@byline/auth'
2
13
  import {
3
14
  defineCollection,
@@ -16,6 +27,9 @@ vi.mock('@tanstack/react-start', () => ({
16
27
  createServerFn: () => {
17
28
  let validate = (value: unknown) => value
18
29
  const chain = {
30
+ middleware() {
31
+ return chain
32
+ },
19
33
  validator(fn: (value: unknown) => unknown) {
20
34
  validate = fn
21
35
  return chain
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -22,6 +21,8 @@ import {
22
21
  import { listDocumentPublishSchedules } from '@byline/core/services'
23
22
 
24
23
  import { bylineCore } from '../../integrations/byline-core.js'
24
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
25
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
25
26
  import { omitScheduleExecutionState } from './scheduled-publication-response.js'
26
27
  import { serialise } from './utils.js'
27
28
 
@@ -138,14 +139,17 @@ async function scheduledPublicationRuntime(): Promise<ScheduledPublicationRuntim
138
139
  }
139
140
 
140
141
  /** Authenticated feature discovery for the admin shell and health warning. */
141
- export const getScheduledPublicationRuntime = createServerFn({ method: 'GET' }).handler(
142
- withDocumentMutationErrors(async () => {
143
- await getAdminRequestContext()
144
- return scheduledPublicationRuntime()
145
- })
146
- )
142
+ export const getScheduledPublicationRuntime = createServerFn({ method: 'GET' })
143
+ .middleware([adminSessionMiddleware])
144
+ .handler(
145
+ withDocumentMutationErrors(async () => {
146
+ await getAdminRequestContext()
147
+ return scheduledPublicationRuntime()
148
+ })
149
+ )
147
150
 
148
151
  export const scheduleCollectionDocumentPublish = createServerFn({ method: 'POST' })
152
+ .middleware([adminSessionMiddleware])
149
153
  .validator(
150
154
  (input: {
151
155
  expectedRevision: number
@@ -170,6 +174,7 @@ export const scheduleCollectionDocumentPublish = createServerFn({ method: 'POST'
170
174
  )
171
175
 
172
176
  export const confirmCollectionDocumentScheduledPublish = createServerFn({ method: 'POST' })
177
+ .middleware([adminSessionMiddleware])
173
178
  .validator(
174
179
  (input: {
175
180
  expectedRevision: number
@@ -192,6 +197,7 @@ export const confirmCollectionDocumentScheduledPublish = createServerFn({ method
192
197
  )
193
198
 
194
199
  export const cancelCollectionDocumentScheduledPublish = createServerFn({ method: 'POST' })
200
+ .middleware([adminSessionMiddleware])
195
201
  .validator((input: { expectedRevision: number; collection: string; id: string }) => input)
196
202
  .handler(
197
203
  withDocumentMutationErrors(async ({ data }) => {
@@ -210,6 +216,7 @@ export const cancelCollectionDocumentScheduledPublish = createServerFn({ method:
210
216
  )
211
217
 
212
218
  export const listScheduledPublications = createServerFn({ method: 'GET' })
219
+ .middleware([adminSessionMiddleware])
213
220
  .validator(
214
221
  (input: {
215
222
  states?: readonly DocumentPublishScheduleState[]
@@ -27,6 +27,7 @@ import { ERR_NOT_FOUND, getLogger } from '@byline/core'
27
27
 
28
28
  import { ensureCollection } from '../../integrations/api-utils.js'
29
29
  import { bylineCore } from '../../integrations/byline-core.js'
30
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
30
31
 
31
32
  export interface SetListViewPreferenceInput {
32
33
  collection: string
@@ -38,6 +39,7 @@ export interface SetListViewPreferenceInput {
38
39
  }
39
40
 
40
41
  export const setListViewPreference = createServerFn({ method: 'POST' })
42
+ .middleware([adminSessionMiddleware])
41
43
  .validator((input: SetListViewPreferenceInput) => input)
42
44
  .handler(async ({ data }) => {
43
45
  // Scopes are keyed by collection path — refuse to mint rows for
@@ -11,6 +11,7 @@ import { createServerFn } from '@tanstack/react-start'
11
11
  import { getAdminBylineClient } from '@byline/client/server'
12
12
 
13
13
  import { ensureCollection } from '../../integrations/api-utils.js'
14
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
15
 
15
16
  // ---------------------------------------------------------------------------
16
17
  // Shared types
@@ -26,6 +27,7 @@ export interface CollectionStatusCount {
26
27
  // ---------------------------------------------------------------------------
27
28
 
28
29
  const getCollectionStatsFn = createServerFn({ method: 'GET' })
30
+ .middleware([adminSessionMiddleware])
29
31
  .validator((input: { collection: string }) => input)
30
32
  .handler(async ({ data }) => {
31
33
  const config = await ensureCollection(data.collection)
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -18,12 +17,15 @@ import {
18
17
  } from '@byline/core/services'
19
18
 
20
19
  import { ensureCollection } from '../../integrations/api-utils.js'
20
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
21
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
21
22
 
22
23
  // ---------------------------------------------------------------------------
23
24
  // Change document workflow status
24
25
  // ---------------------------------------------------------------------------
25
26
 
26
27
  export const updateDocumentStatus = createServerFn({ method: 'POST' })
28
+ .middleware([adminSessionMiddleware])
27
29
  .validator(
28
30
  (input: { expectedRevision: number; collection: string; id: string; status: string }) => input
29
31
  )
@@ -72,6 +74,7 @@ export const updateDocumentStatus = createServerFn({ method: 'POST' })
72
74
  // ---------------------------------------------------------------------------
73
75
 
74
76
  export const unpublishDocument = createServerFn({ method: 'POST' })
77
+ .middleware([adminSessionMiddleware])
75
78
  .validator((input: { expectedRevision: number; collection: string; id: string }) => input)
76
79
  .handler(
77
80
  withDocumentMutationErrors(async ({ data: input }) => {
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -21,6 +20,8 @@ import { getAdminBylineClient } from '@byline/client/server'
21
20
  import { createReadContext, ERR_NOT_FOUND, getLogger } from '@byline/core'
22
21
 
23
22
  import { ensureCollection } from '../../integrations/api-utils.js'
23
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
24
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
24
25
  import { placeAdminTreeNode, removeAdminTreeNode } from './tree-mutation.js'
25
26
  import { getAdminTreeParent } from './tree-read.js'
26
27
 
@@ -29,6 +30,7 @@ import { getAdminTreeParent } from './tree-read.js'
29
30
  // ---------------------------------------------------------------------------
30
31
 
31
32
  export const placeTreeNode = createServerFn({ method: 'POST' })
33
+ .middleware([adminSessionMiddleware])
32
34
  .validator(
33
35
  (input: {
34
36
  expectedRevision: number
@@ -67,6 +69,7 @@ export const placeTreeNode = createServerFn({ method: 'POST' })
67
69
  // ---------------------------------------------------------------------------
68
70
 
69
71
  export const removeFromTree = createServerFn({ method: 'POST' })
72
+ .middleware([adminSessionMiddleware])
70
73
  .validator(
71
74
  (input: {
72
75
  expectedRevision: number
@@ -102,6 +105,7 @@ export const removeFromTree = createServerFn({ method: 'POST' })
102
105
  // ---------------------------------------------------------------------------
103
106
 
104
107
  export const getTreeAncestors = createServerFn({ method: 'GET' })
108
+ .middleware([adminSessionMiddleware])
105
109
  .validator((input: { collection: string; documentId: string }) => input)
106
110
  .handler(
107
111
  withDocumentMutationErrors(async ({ data }) => {
@@ -135,6 +139,7 @@ export const getTreeAncestors = createServerFn({ method: 'GET' })
135
139
  // ---------------------------------------------------------------------------
136
140
 
137
141
  export const getTreeParent = createServerFn({ method: 'GET' })
142
+ .middleware([adminSessionMiddleware])
138
143
  .validator((input: { collection: string; documentId: string }) => input)
139
144
  .handler(
140
145
  withDocumentMutationErrors(async ({ data }) => {
@@ -173,6 +178,7 @@ export interface CollectionTreeRow {
173
178
  }
174
179
 
175
180
  export const getCollectionTree = createServerFn({ method: 'GET' })
181
+ .middleware([adminSessionMiddleware])
176
182
  .validator((input: { collection: string; locale?: string }) => input)
177
183
  .handler(
178
184
  withDocumentMutationErrors(async ({ data }) => {
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -16,6 +15,8 @@ import type { DocumentLifecycleContext } from '@byline/core/services'
16
15
  import { saveDocument, updateDocumentSystemFields } from '@byline/core/services'
17
16
 
18
17
  import { ensureCollection } from '../../integrations/api-utils.js'
18
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
19
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
19
20
  import { toCommittedDocumentHookFailureResponse } from './save-outcome.js'
20
21
 
21
22
  // ---------------------------------------------------------------------------
@@ -24,6 +25,7 @@ import { toCommittedDocumentHookFailureResponse } from './save-outcome.js'
24
25
  // ---------------------------------------------------------------------------
25
26
 
26
27
  export const updateCollectionDocumentWithPatches = createServerFn({ method: 'POST' })
28
+ .middleware([adminSessionMiddleware])
27
29
  .validator(
28
30
  (input: {
29
31
  collection: string
@@ -102,6 +104,7 @@ export const updateCollectionDocumentWithPatches = createServerFn({ method: 'POS
102
104
  // ---------------------------------------------------------------------------
103
105
 
104
106
  export const updateCollectionDocumentSystemFields = createServerFn({ method: 'POST' })
107
+ .middleware([adminSessionMiddleware])
105
108
  .validator(
106
109
  (input: {
107
110
  collection: string
@@ -1,4 +1,3 @@
1
- import { testAdapter } from '../../../../core/src/storage/db-adapter.test-helper.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -21,6 +20,9 @@ vi.mock('@tanstack/react-start', () => ({
21
20
  createServerFn: () => {
22
21
  let validate = (input: unknown) => input
23
22
  const chain = {
23
+ middleware() {
24
+ return chain
25
+ },
24
26
  validator(validator: (input: unknown) => unknown) {
25
27
  validate = validator
26
28
  return chain
@@ -50,6 +52,11 @@ vi.mock('../../integrations/byline-core.js', () => ({
50
52
  import { ensureCollection, ensureDocumentResource } from '../../integrations/api-utils.js'
51
53
  import { uploadField } from './upload.js'
52
54
 
55
+ // Handler-level tests isolate transport; session-middleware tests exercise the real pre-handler boundary.
56
+ vi.mock('../../integrations/session-middleware.js', () => ({ adminSessionMiddleware: {} }))
57
+
58
+ import { testAdapter } from '../../../../core/src/storage/db-adapter.test-helper.js'
59
+
53
60
  const SERVER_CONFIG = Symbol.for('__byline_server_config__')
54
61
  const BYLINE_LOGGER = Symbol.for('__byline_logger__')
55
62
  const previousServer = (globalThis as Record<PropertyKey, unknown>)[SERVER_CONFIG]
@@ -1,3 +1,11 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+
1
9
  import { createServerFn } from '@tanstack/react-start'
2
10
 
3
11
  import { getAdminRequestContext } from '@byline/client/server'
@@ -14,6 +22,7 @@ import { getLogger, withLogContext } from '@byline/core/logger'
14
22
  import { uploadField as coreUploadField } from '@byline/core/services'
15
23
 
16
24
  import { ensureDocumentResource } from '../../integrations/api-utils.js'
25
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
17
26
  import { withDocumentMutationErrors } from '../document-mutation-errors.js'
18
27
 
19
28
  /**
@@ -150,6 +159,7 @@ function resolveUploadField(
150
159
  * without depending on TanStack Start server-function transport details.
151
160
  */
152
161
  export const uploadCollectionField = createServerFn({ method: 'POST' })
162
+ .middleware([adminSessionMiddleware])
153
163
  .validator(parseUploadFormData)
154
164
  .handler(
155
165
  withDocumentMutationErrors(async ({ data }) => {
@@ -25,7 +25,7 @@
25
25
  * switcher works on the sign-in surface — the DB write simply skips.
26
26
  */
27
27
 
28
- import { createServerFn } from '@tanstack/react-start'
28
+ import { createMiddleware, createServerFn } from '@tanstack/react-start'
29
29
 
30
30
  import type { AccountResponse } from '@byline/admin/admin-account'
31
31
  import { setPreferredLocaleCommand } from '@byline/admin/admin-account'
@@ -34,6 +34,7 @@ import { getAdminRequestContext } from '@byline/client/server'
34
34
 
35
35
  import { clearAdminLocaleCookie, setAdminLocaleCookie } from '../../i18n/locale-cookie.js'
36
36
  import { bylineCore } from '../../integrations/byline-core.js'
37
+ import { expectedSession } from '../../integrations/session-coordination.js'
37
38
 
38
39
  export interface SetAdminLocaleInput {
39
40
  /** BCP 47 tag, or `null` to clear the preference. */
@@ -53,9 +54,18 @@ export interface SetAdminLocaleResult {
53
54
  account: AccountResponse | null
54
55
  }
55
56
 
57
+ const localeSession = createMiddleware({ type: 'function' }).client(({ next }) =>
58
+ next({
59
+ sendContext: {
60
+ expectedSessionId: expectedSession(),
61
+ },
62
+ })
63
+ )
64
+
56
65
  export const setAdminLocaleFn = createServerFn({ method: 'POST' })
66
+ .middleware([localeSession])
57
67
  .validator((input: SetAdminLocaleInput) => input)
58
- .handler(async ({ data }): Promise<SetAdminLocaleResult> => {
68
+ .handler(async ({ data, context: caller }): Promise<SetAdminLocaleResult> => {
59
69
  const core = bylineCore()
60
70
  const locales = core.config.i18n.admin.locales
61
71
 
@@ -87,6 +97,9 @@ export const setAdminLocaleFn = createServerFn({ method: 'POST' })
87
97
 
88
98
  try {
89
99
  const context = await getAdminRequestContext()
100
+ if (!caller.expectedSessionId || caller.expectedSessionId !== context.sessionId) {
101
+ return { ok: true as const, locale: data.locale, account: null }
102
+ }
90
103
  const account = await setPreferredLocaleCommand(
91
104
  context,
92
105
  { locale: data.locale },
@@ -94,7 +107,10 @@ export const setAdminLocaleFn = createServerFn({ method: 'POST' })
94
107
  )
95
108
  return { ok: true as const, locale: data.locale, account }
96
109
  } catch (err) {
97
- if (err instanceof AuthError && err.code === AuthErrorCodes.UNAUTHENTICATED) {
110
+ if (
111
+ err instanceof AuthError &&
112
+ (err.code === AuthErrorCodes.UNAUTHENTICATED || err.code === AuthErrorCodes.ACCESS_EXPIRED)
113
+ ) {
98
114
  // Expected on the pre-auth path. Cookie already written.
99
115
  return { ok: true as const, locale: data.locale, account: null }
100
116
  }
@@ -18,7 +18,11 @@ import { createServerFn } from '@tanstack/react-start'
18
18
 
19
19
  import { clearPreviewCookie } from '@byline/client/server'
20
20
 
21
- export const disablePreviewModeFn = createServerFn({ method: 'POST' }).handler(async () => {
22
- clearPreviewCookie()
23
- return { status: 'ok' as const, preview: false as const }
24
- })
21
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
22
+
23
+ export const disablePreviewModeFn = createServerFn({ method: 'POST' })
24
+ .middleware([adminSessionMiddleware])
25
+ .handler(async () => {
26
+ clearPreviewCookie()
27
+ return { status: 'ok' as const, preview: false as const }
28
+ })
@@ -19,8 +19,12 @@ import { createServerFn } from '@tanstack/react-start'
19
19
 
20
20
  import { getAdminRequestContext, setPreviewCookie } from '@byline/client/server'
21
21
 
22
- export const enablePreviewModeFn = createServerFn({ method: 'POST' }).handler(async () => {
23
- await getAdminRequestContext()
24
- setPreviewCookie()
25
- return { status: 'ok' as const, preview: true as const }
26
- })
22
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
23
+
24
+ export const enablePreviewModeFn = createServerFn({ method: 'POST' })
25
+ .middleware([adminSessionMiddleware])
26
+ .handler(async () => {
27
+ await getAdminRequestContext()
28
+ setPreviewCookie()
29
+ return { status: 'ok' as const, preview: true as const }
30
+ })
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,9 +10,12 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
14
15
  import { serialise } from '../serialise.js'
15
16
 
16
17
  export const cancelSingletonScheduledPublish = createServerFn({ method: 'POST' })
18
+ .middleware([adminSessionMiddleware])
17
19
  .validator((input: { expectedRevision: number; singleton: string }) => input)
18
20
  .handler(
19
21
  withDocumentMutationErrors(async ({ data }) =>
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,9 +10,12 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
14
15
  import { serialise } from '../serialise.js'
15
16
 
16
17
  export const changeSingletonStatus = createServerFn({ method: 'POST' })
18
+ .middleware([adminSessionMiddleware])
17
19
  .validator((input: { expectedRevision: number; singleton: string; status: string }) => input)
18
20
  .handler(
19
21
  withDocumentMutationErrors(async ({ data }) =>
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,9 +10,12 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
14
15
  import { serialise } from '../serialise.js'
15
16
 
16
17
  export const confirmSingletonScheduledPublish = createServerFn({ method: 'POST' })
18
+ .middleware([adminSessionMiddleware])
17
19
  .validator(
18
20
  (input: { expectedRevision: number; singleton: string; expectedVersionId: string }) => input
19
21
  )
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,10 +10,13 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
14
  import { toCommittedDocumentHookFailureResponse } from '../collections/save-outcome.js'
15
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
15
16
  import { serialise } from '../serialise.js'
16
17
 
17
18
  export const copySingletonToLocale = createServerFn({ method: 'POST' })
19
+ .middleware([adminSessionMiddleware])
18
20
  .validator(
19
21
  (input: {
20
22
  expectedRevision: number
@@ -10,9 +10,11 @@ import { createServerFn } from '@tanstack/react-start'
10
10
 
11
11
  import { getAdminBylineClient } from '@byline/client/server'
12
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
13
14
  import { serialise } from '../serialise.js'
14
15
 
15
16
  export const findSingletonByVersion = createServerFn({ method: 'GET' })
17
+ .middleware([adminSessionMiddleware])
16
18
  .validator((input: { singleton: string; versionId: string; locale?: string }) => input)
17
19
  .handler(async ({ data }) =>
18
20
  serialise(
@@ -10,9 +10,11 @@ import { createServerFn } from '@tanstack/react-start'
10
10
 
11
11
  import { getAdminBylineClient } from '@byline/client/server'
12
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
13
14
  import { serialise } from '../serialise.js'
14
15
 
15
16
  export const getSingletonScheduledPublish = createServerFn({ method: 'GET' })
17
+ .middleware([adminSessionMiddleware])
16
18
  .validator((input: { singleton: string }) => input)
17
19
  .handler(async ({ data }) =>
18
20
  serialise(await getAdminBylineClient().singleton(data.singleton).getScheduledPublish())
@@ -8,6 +8,7 @@
8
8
 
9
9
  import { createServerFn } from '@tanstack/react-start'
10
10
 
11
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
11
12
  import { readSingletonDocument } from '../singleton-document-read.js'
12
13
 
13
14
  export interface GetSingletonInput {
@@ -28,5 +29,6 @@ export interface GetSingletonInput {
28
29
  * from the same editable snapshot as the source document.
29
30
  */
30
31
  export const getSingleton = createServerFn({ method: 'GET' })
32
+ .middleware([adminSessionMiddleware])
31
33
  .validator((input: GetSingletonInput) => input)
32
34
  .handler(async ({ data }) => readSingletonDocument(data))
@@ -10,6 +10,7 @@ import { createServerFn } from '@tanstack/react-start'
10
10
 
11
11
  import { getAdminBylineClient } from '@byline/client/server'
12
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
13
14
  import { type ActorLabelMap, resolveActorLabels } from '../actors.js'
14
15
  import { serialise } from '../serialise.js'
15
16
 
@@ -22,6 +23,7 @@ export interface SingletonHistorySearchParams {
22
23
  }
23
24
 
24
25
  export const getSingletonHistory = createServerFn({ method: 'GET' })
26
+ .middleware([adminSessionMiddleware])
25
27
  .validator((input: { singleton: string; params?: SingletonHistorySearchParams }) => input)
26
28
  .handler(async ({ data }) => {
27
29
  const params = data.params ?? {}
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,10 +10,13 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
14
  import { toCommittedDocumentHookFailureResponse } from '../collections/save-outcome.js'
15
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
15
16
  import { serialise } from '../serialise.js'
16
17
 
17
18
  export const restoreSingletonVersion = createServerFn({ method: 'POST' })
19
+ .middleware([adminSessionMiddleware])
18
20
  .validator((input: { expectedRevision: number; singleton: string; versionId: string }) => input)
19
21
  .handler(
20
22
  withDocumentMutationErrors(async ({ data }) => {
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,9 +10,12 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
14
15
  import { serialise } from '../serialise.js'
15
16
 
16
17
  export const scheduleSingletonPublish = createServerFn({ method: 'POST' })
18
+ .middleware([adminSessionMiddleware])
17
19
  .validator(
18
20
  (input: {
19
21
  expectedRevision: number
@@ -23,6 +23,9 @@ vi.mock('@tanstack/react-start', () => ({
23
23
  createServerFn: () => {
24
24
  let validate = (input: unknown) => input
25
25
  const chain = {
26
+ middleware() {
27
+ return chain
28
+ },
26
29
  validator(validator: (input: unknown) => unknown) {
27
30
  validate = validator
28
31
  return chain
@@ -56,6 +59,9 @@ import { scheduleSingletonPublish } from './schedule-publish.js'
56
59
  import { unpublishSingleton } from './unpublish.js'
57
60
  import { updateSingleton } from './update.js'
58
61
 
62
+ // Handler-level tests isolate transport; session-middleware tests exercise the real pre-handler boundary.
63
+ vi.mock('../../integrations/session-middleware.js', () => ({ adminSessionMiddleware: {} }))
64
+
59
65
  type ServerFunction = (options: { data: any }) => Promise<any>
60
66
 
61
67
  const invoke = (serverFunction: unknown, data: Record<string, any>) =>
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -11,9 +10,12 @@ import { createServerFn } from '@tanstack/react-start'
11
10
 
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
 
13
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
14
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
14
15
  import { serialise } from '../serialise.js'
15
16
 
16
17
  export const unpublishSingleton = createServerFn({ method: 'POST' })
18
+ .middleware([adminSessionMiddleware])
17
19
  .validator((input: { expectedRevision: number; singleton: string }) => input)
18
20
  .handler(
19
21
  withDocumentMutationErrors(async ({ data }) =>
@@ -1,4 +1,3 @@
1
- import { withDocumentMutationErrors } from '../document-mutation-errors.js'
2
1
  /**
3
2
  * This Source Code is subject to the terms of the Mozilla Public
4
3
  * License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -12,7 +11,9 @@ import { createServerFn } from '@tanstack/react-start'
12
11
  import { getAdminBylineClient } from '@byline/client/server'
13
12
  import type { SingletonSavePrecondition } from '@byline/core'
14
13
 
14
+ import { adminSessionMiddleware } from '../../integrations/session-middleware.js'
15
15
  import { toCommittedDocumentHookFailureResponse } from '../collections/save-outcome.js'
16
+ import { withDocumentMutationErrors } from '../document-mutation-errors.js'
16
17
  import { serialise } from '../serialise.js'
17
18
 
18
19
  export type UpdateSingletonInput = SingletonSavePrecondition & {
@@ -22,6 +23,7 @@ export type UpdateSingletonInput = SingletonSavePrecondition & {
22
23
  }
23
24
 
24
25
  export const updateSingleton = createServerFn({ method: 'POST' })
26
+ .middleware([adminSessionMiddleware])
25
27
  .validator((input: UpdateSingletonInput) => input)
26
28
  .handler(
27
29
  withDocumentMutationErrors(async ({ data }) => {