@byline/host-tanstack-start 5.0.0 → 5.1.1
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.
- package/dist/admin-shell/chrome/admin-app-bar.d.ts +7 -0
- package/dist/admin-shell/chrome/admin-app-bar.js +10 -2
- package/dist/admin-shell/chrome/optional-i18n-provider.d.ts +29 -0
- package/dist/admin-shell/chrome/optional-i18n-provider.js +24 -0
- package/dist/admin-shell/chrome/session-change-boundary.d.ts +14 -0
- package/dist/admin-shell/chrome/session-change-boundary.js +119 -0
- package/dist/admin-shell/chrome/session-change-boundary.module.js +11 -0
- package/dist/admin-shell/chrome/session-change-boundary.test.d.ts +8 -0
- package/dist/admin-shell/chrome/session-change-boundary_module.css +81 -0
- package/dist/admin-shell/chrome/sign-in-page.d.ts +2 -1
- package/dist/admin-shell/chrome/sign-in-page.js +60 -3
- package/dist/integrations/byline-admin-services.js +7 -1
- package/dist/integrations/client-ip.d.ts +19 -0
- package/dist/integrations/client-ip.js +34 -0
- package/dist/integrations/session-coordination.d.ts +24 -0
- package/dist/integrations/session-coordination.js +85 -0
- package/dist/integrations/session-middleware.d.ts +11 -0
- package/dist/integrations/session-middleware.js +94 -0
- package/dist/integrations/session-request-kind.d.ts +9 -0
- package/dist/integrations/session-request-kind.js +10 -0
- package/dist/integrations/session-request-middleware.d.ts +9 -0
- package/dist/integrations/session-request-middleware.js +7 -0
- package/dist/integrations/sign-in-body.d.ts +12 -0
- package/dist/integrations/sign-in-body.js +52 -0
- package/dist/integrations/sign-in-middleware.d.ts +9 -0
- package/dist/integrations/sign-in-middleware.js +10 -0
- package/dist/routes/create-admin-layout-route.js +46 -31
- package/dist/routes/create-sign-in-route.js +4 -2
- package/dist/server-fns/admin-account/change-password.d.ts +3 -1
- package/dist/server-fns/admin-account/change-password.js +9 -3
- package/dist/server-fns/admin-account/get.d.ts +3 -1
- package/dist/server-fns/admin-account/get.js +4 -1
- package/dist/server-fns/admin-account/index.d.ts +5 -5
- package/dist/server-fns/admin-account/update.d.ts +3 -1
- package/dist/server-fns/admin-account/update.js +4 -1
- package/dist/server-fns/admin-activity/get.d.ts +3 -1
- package/dist/server-fns/admin-activity/get.js +4 -1
- package/dist/server-fns/admin-permissions/get-role-abilities.d.ts +3 -1
- package/dist/server-fns/admin-permissions/get-role-abilities.js +4 -1
- package/dist/server-fns/admin-permissions/index.d.ts +4 -4
- package/dist/server-fns/admin-permissions/list-registered.d.ts +3 -1
- package/dist/server-fns/admin-permissions/list-registered.js +4 -1
- package/dist/server-fns/admin-permissions/set-role-abilities.d.ts +3 -1
- package/dist/server-fns/admin-permissions/set-role-abilities.js +4 -1
- package/dist/server-fns/admin-permissions/who-has.d.ts +3 -1
- package/dist/server-fns/admin-permissions/who-has.js +4 -1
- package/dist/server-fns/admin-roles/create.d.ts +3 -1
- package/dist/server-fns/admin-roles/create.js +4 -1
- package/dist/server-fns/admin-roles/delete.d.ts +3 -1
- package/dist/server-fns/admin-roles/delete.js +4 -1
- package/dist/server-fns/admin-roles/get.d.ts +3 -1
- package/dist/server-fns/admin-roles/get.js +4 -1
- package/dist/server-fns/admin-roles/index.d.ts +6 -6
- package/dist/server-fns/admin-roles/list.d.ts +3 -1
- package/dist/server-fns/admin-roles/list.js +4 -1
- package/dist/server-fns/admin-roles/reorder.d.ts +3 -1
- package/dist/server-fns/admin-roles/reorder.js +4 -1
- package/dist/server-fns/admin-roles/update.d.ts +3 -1
- package/dist/server-fns/admin-roles/update.js +4 -1
- package/dist/server-fns/admin-users/create.d.ts +3 -1
- package/dist/server-fns/admin-users/create.js +4 -1
- package/dist/server-fns/admin-users/delete.d.ts +3 -1
- package/dist/server-fns/admin-users/delete.js +4 -1
- package/dist/server-fns/admin-users/disable.d.ts +3 -1
- package/dist/server-fns/admin-users/disable.js +4 -1
- package/dist/server-fns/admin-users/enable.d.ts +3 -1
- package/dist/server-fns/admin-users/enable.js +4 -1
- package/dist/server-fns/admin-users/get-user-roles.d.ts +3 -1
- package/dist/server-fns/admin-users/get-user-roles.js +4 -1
- package/dist/server-fns/admin-users/get.d.ts +3 -1
- package/dist/server-fns/admin-users/get.js +4 -1
- package/dist/server-fns/admin-users/index.d.ts +10 -10
- package/dist/server-fns/admin-users/list.d.ts +3 -1
- package/dist/server-fns/admin-users/list.js +4 -1
- package/dist/server-fns/admin-users/set-password.d.ts +3 -1
- package/dist/server-fns/admin-users/set-password.js +4 -1
- package/dist/server-fns/admin-users/set-user-roles.d.ts +3 -1
- package/dist/server-fns/admin-users/set-user-roles.js +4 -1
- package/dist/server-fns/admin-users/update.d.ts +3 -1
- package/dist/server-fns/admin-users/update.js +4 -1
- package/dist/server-fns/ai/execute.d.ts +3 -1
- package/dist/server-fns/ai/execute.js +4 -1
- package/dist/server-fns/ai/index.d.ts +1 -1
- package/dist/server-fns/analytics/maintenance.d.ts +6 -2
- package/dist/server-fns/analytics/maintenance.js +7 -2
- package/dist/server-fns/analytics/queries.d.ts +18 -6
- package/dist/server-fns/analytics/queries.js +19 -6
- package/dist/server-fns/auth/current-user.d.ts +1 -0
- package/dist/server-fns/auth/current-user.js +5 -2
- package/dist/server-fns/auth/renew.d.ts +13 -0
- package/dist/server-fns/auth/renew.js +45 -0
- package/dist/server-fns/auth/sign-in.d.ts +2 -1
- package/dist/server-fns/auth/sign-in.js +88 -17
- package/dist/server-fns/auth/sign-out.d.ts +3 -1
- package/dist/server-fns/auth/sign-out.js +38 -6
- package/dist/server-fns/collections/audit.d.ts +3 -1
- package/dist/server-fns/collections/audit.js +4 -1
- package/dist/server-fns/collections/copy-to-locale.d.ts +10 -1
- package/dist/server-fns/collections/copy-to-locale.js +5 -2
- package/dist/server-fns/collections/create.d.ts +10 -1
- package/dist/server-fns/collections/create.js +5 -2
- package/dist/server-fns/collections/delete-locale.d.ts +10 -1
- package/dist/server-fns/collections/delete-locale.js +5 -2
- package/dist/server-fns/collections/delete.d.ts +10 -1
- package/dist/server-fns/collections/delete.js +5 -2
- package/dist/server-fns/collections/duplicate.d.ts +10 -1
- package/dist/server-fns/collections/duplicate.js +5 -2
- package/dist/server-fns/collections/get.d.ts +7 -0
- package/dist/server-fns/collections/get.js +8 -3
- package/dist/server-fns/collections/history.d.ts +3 -1
- package/dist/server-fns/collections/history.js +4 -1
- package/dist/server-fns/collections/index.d.ts +21 -21
- package/dist/server-fns/collections/list.d.ts +10 -1
- package/dist/server-fns/collections/list.js +5 -2
- package/dist/server-fns/collections/reindex.d.ts +3 -1
- package/dist/server-fns/collections/reindex.js +4 -1
- package/dist/server-fns/collections/reorder.d.ts +10 -1
- package/dist/server-fns/collections/reorder.js +5 -2
- package/dist/server-fns/collections/restore-version.d.ts +10 -1
- package/dist/server-fns/collections/restore-version.js +5 -2
- package/dist/server-fns/collections/scheduled-publication.d.ts +22 -5
- package/dist/server-fns/collections/scheduled-publication.js +17 -6
- package/dist/server-fns/collections/set-list-view-preference.d.ts +3 -1
- package/dist/server-fns/collections/set-list-view-preference.js +4 -1
- package/dist/server-fns/collections/stats.js +4 -1
- package/dist/server-fns/collections/status.d.ts +13 -2
- package/dist/server-fns/collections/status.js +8 -3
- package/dist/server-fns/collections/tree.d.ts +22 -5
- package/dist/server-fns/collections/tree.js +17 -6
- package/dist/server-fns/collections/update.d.ts +13 -2
- package/dist/server-fns/collections/update.js +8 -3
- package/dist/server-fns/collections/upload.d.ts +10 -1
- package/dist/server-fns/collections/upload.js +4 -1
- package/dist/server-fns/i18n/set-locale.d.ts +3 -1
- package/dist/server-fns/i18n/set-locale.js +18 -3
- package/dist/server-fns/preview/disable.d.ts +3 -1
- package/dist/server-fns/preview/disable.js +4 -1
- package/dist/server-fns/preview/enable.d.ts +3 -1
- package/dist/server-fns/preview/enable.js +4 -1
- package/dist/server-fns/singletons/cancel-scheduled-publish.d.ts +10 -1
- package/dist/server-fns/singletons/cancel-scheduled-publish.js +5 -2
- package/dist/server-fns/singletons/change-status.d.ts +10 -1
- package/dist/server-fns/singletons/change-status.js +5 -2
- package/dist/server-fns/singletons/confirm-scheduled-publish.d.ts +10 -1
- package/dist/server-fns/singletons/confirm-scheduled-publish.js +5 -2
- package/dist/server-fns/singletons/copy-to-locale.d.ts +10 -1
- package/dist/server-fns/singletons/copy-to-locale.js +5 -2
- package/dist/server-fns/singletons/find-by-version.d.ts +3 -1
- package/dist/server-fns/singletons/find-by-version.js +4 -1
- package/dist/server-fns/singletons/get-scheduled-publish.d.ts +3 -1
- package/dist/server-fns/singletons/get-scheduled-publish.js +4 -1
- package/dist/server-fns/singletons/get.d.ts +3 -1
- package/dist/server-fns/singletons/get.js +4 -1
- package/dist/server-fns/singletons/history.d.ts +3 -1
- package/dist/server-fns/singletons/history.js +4 -1
- package/dist/server-fns/singletons/restore-version.d.ts +10 -1
- package/dist/server-fns/singletons/restore-version.js +5 -2
- package/dist/server-fns/singletons/schedule-publish.d.ts +10 -1
- package/dist/server-fns/singletons/schedule-publish.js +5 -2
- package/dist/server-fns/singletons/unpublish.d.ts +10 -1
- package/dist/server-fns/singletons/unpublish.js +5 -2
- package/dist/server-fns/singletons/update.d.ts +10 -1
- package/dist/server-fns/singletons/update.js +5 -2
- package/package.json +19 -19
- package/src/admin-shell/chrome/admin-app-bar.tsx +11 -6
- package/src/admin-shell/chrome/optional-i18n-provider.tsx +61 -0
- package/src/admin-shell/chrome/session-change-boundary.module.css +112 -0
- package/src/admin-shell/chrome/session-change-boundary.test.tsx +91 -0
- package/src/admin-shell/chrome/session-change-boundary.tsx +155 -0
- package/src/admin-shell/chrome/sign-in-page.tsx +68 -3
- package/src/integrations/byline-admin-services.ts +7 -1
- package/src/integrations/client-ip.test.node.ts +45 -0
- package/src/integrations/client-ip.ts +54 -0
- package/src/integrations/framework-fetch-shape.test.node.ts +56 -0
- package/src/integrations/session-client.test.node.ts +121 -0
- package/src/integrations/session-coordination.test.node.ts +77 -0
- package/src/integrations/session-coordination.ts +96 -0
- package/src/integrations/session-middleware.test.node.ts +87 -0
- package/src/integrations/session-middleware.ts +107 -0
- package/src/integrations/session-request-kind.ts +18 -0
- package/src/integrations/session-request-middleware.ts +17 -0
- package/src/integrations/sign-in-body.test.node.ts +59 -0
- package/src/integrations/sign-in-body.ts +50 -0
- package/src/integrations/sign-in-middleware.ts +24 -0
- package/src/routes/create-admin-layout-route.tsx +48 -30
- package/src/routes/create-sign-in-route.tsx +10 -2
- package/src/server-fns/admin-account/change-password.test.node.ts +69 -0
- package/src/server-fns/admin-account/change-password.ts +13 -2
- package/src/server-fns/admin-account/get.ts +2 -0
- package/src/server-fns/admin-account/update.ts +2 -0
- package/src/server-fns/admin-activity/get.ts +2 -0
- package/src/server-fns/admin-permissions/get-role-abilities.ts +2 -0
- package/src/server-fns/admin-permissions/list-registered.ts +5 -4
- package/src/server-fns/admin-permissions/set-role-abilities.ts +2 -0
- package/src/server-fns/admin-permissions/who-has.ts +2 -0
- package/src/server-fns/admin-roles/create.ts +2 -0
- package/src/server-fns/admin-roles/delete.ts +2 -0
- package/src/server-fns/admin-roles/get.ts +2 -0
- package/src/server-fns/admin-roles/list.ts +5 -4
- package/src/server-fns/admin-roles/reorder.ts +2 -0
- package/src/server-fns/admin-roles/update.ts +2 -0
- package/src/server-fns/admin-users/create.ts +2 -0
- package/src/server-fns/admin-users/delete.ts +2 -0
- package/src/server-fns/admin-users/disable.ts +2 -0
- package/src/server-fns/admin-users/enable.ts +2 -0
- package/src/server-fns/admin-users/get-user-roles.ts +2 -0
- package/src/server-fns/admin-users/get.ts +2 -0
- package/src/server-fns/admin-users/list.ts +2 -0
- package/src/server-fns/admin-users/set-password.ts +2 -0
- package/src/server-fns/admin-users/set-user-roles.ts +2 -0
- package/src/server-fns/admin-users/update.ts +2 -0
- package/src/server-fns/ai/execute.ts +3 -0
- package/src/server-fns/analytics/maintenance.ts +4 -0
- package/src/server-fns/analytics/queries.ts +14 -8
- package/src/server-fns/auth/current-user.ts +7 -3
- package/src/server-fns/auth/renew.test.node.ts +85 -0
- package/src/server-fns/auth/renew.ts +54 -0
- package/src/server-fns/auth/sign-in.test.node.ts +114 -0
- package/src/server-fns/auth/sign-in.ts +80 -27
- package/src/server-fns/auth/sign-out.test.node.ts +85 -0
- package/src/server-fns/auth/sign-out.ts +44 -19
- package/src/server-fns/collections/audit.ts +2 -0
- package/src/server-fns/collections/copy-to-locale.ts +3 -1
- package/src/server-fns/collections/create.ts +3 -1
- package/src/server-fns/collections/delete-locale.ts +3 -1
- package/src/server-fns/collections/delete.ts +3 -1
- package/src/server-fns/collections/duplicate.ts +3 -1
- package/src/server-fns/collections/get.ts +4 -1
- package/src/server-fns/collections/history.ts +2 -0
- package/src/server-fns/collections/list.ts +3 -1
- package/src/server-fns/collections/reindex.ts +2 -0
- package/src/server-fns/collections/reorder.ts +3 -1
- package/src/server-fns/collections/restore-version.ts +3 -1
- package/src/server-fns/collections/revision-input.test.node.ts +14 -0
- package/src/server-fns/collections/scheduled-publication.ts +14 -7
- package/src/server-fns/collections/set-list-view-preference.ts +2 -0
- package/src/server-fns/collections/stats.ts +2 -0
- package/src/server-fns/collections/status.ts +4 -1
- package/src/server-fns/collections/tree.ts +7 -1
- package/src/server-fns/collections/update.ts +4 -1
- package/src/server-fns/collections/upload-singleton.test.node.ts +8 -1
- package/src/server-fns/collections/upload.ts +10 -0
- package/src/server-fns/i18n/set-locale.ts +19 -3
- package/src/server-fns/preview/disable.ts +8 -4
- package/src/server-fns/preview/enable.ts +9 -5
- package/src/server-fns/singletons/cancel-scheduled-publish.ts +3 -1
- package/src/server-fns/singletons/change-status.ts +3 -1
- package/src/server-fns/singletons/confirm-scheduled-publish.ts +3 -1
- package/src/server-fns/singletons/copy-to-locale.ts +3 -1
- package/src/server-fns/singletons/find-by-version.ts +2 -0
- package/src/server-fns/singletons/get-scheduled-publish.ts +2 -0
- package/src/server-fns/singletons/get.ts +2 -0
- package/src/server-fns/singletons/history.ts +2 -0
- package/src/server-fns/singletons/restore-version.ts +3 -1
- package/src/server-fns/singletons/schedule-publish.ts +3 -1
- package/src/server-fns/singletons/singletons.test.node.ts +6 -0
- package/src/server-fns/singletons/unpublish.ts +3 -1
- package/src/server-fns/singletons/update.ts +3 -1
|
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
|
|
|
2
2
|
import { assertAdminActor, requireAdminActor } from "@byline/admin";
|
|
3
3
|
import { ANALYTICS_ABILITIES } from "@byline/admin/analytics";
|
|
4
4
|
import { getAdminRequestContext } from "@byline/client/server";
|
|
5
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
5
6
|
const getAnalyticsRuntime = createServerFn({
|
|
6
7
|
method: 'GET'
|
|
7
|
-
}).
|
|
8
|
+
}).middleware([
|
|
9
|
+
adminSessionMiddleware
|
|
10
|
+
]).handler(async ()=>{
|
|
8
11
|
const context = await getAdminRequestContext();
|
|
9
12
|
requireAdminActor(context, 'reading analytics runtime state');
|
|
10
13
|
const { isAnalyticsRegistered } = await import("@byline/analytics");
|
|
@@ -14,35 +17,45 @@ const getAnalyticsRuntime = createServerFn({
|
|
|
14
17
|
});
|
|
15
18
|
const getAnalyticsSummary = createServerFn({
|
|
16
19
|
method: 'GET'
|
|
17
|
-
}).
|
|
20
|
+
}).middleware([
|
|
21
|
+
adminSessionMiddleware
|
|
22
|
+
]).validator((input)=>input).handler(async ({ data })=>{
|
|
18
23
|
await assertAnalyticsRead();
|
|
19
24
|
const { getAnalytics } = await import("@byline/analytics");
|
|
20
25
|
return getAnalytics().getSummary(data);
|
|
21
26
|
});
|
|
22
27
|
const getAnalyticsReportCoverage = createServerFn({
|
|
23
28
|
method: 'GET'
|
|
24
|
-
}).
|
|
29
|
+
}).middleware([
|
|
30
|
+
adminSessionMiddleware
|
|
31
|
+
]).handler(async ()=>{
|
|
25
32
|
await assertAnalyticsRead();
|
|
26
33
|
const { getAnalytics } = await import("@byline/analytics");
|
|
27
34
|
return getAnalytics().getReportCoverage();
|
|
28
35
|
});
|
|
29
36
|
const getAnalyticsTop = createServerFn({
|
|
30
37
|
method: 'GET'
|
|
31
|
-
}).
|
|
38
|
+
}).middleware([
|
|
39
|
+
adminSessionMiddleware
|
|
40
|
+
]).validator((input)=>input).handler(async ({ data })=>{
|
|
32
41
|
await assertAnalyticsRead();
|
|
33
42
|
const { getAnalytics } = await import("@byline/analytics");
|
|
34
43
|
return getAnalytics().getTopPaths(data);
|
|
35
44
|
});
|
|
36
45
|
const getAnalyticsReferrers = createServerFn({
|
|
37
46
|
method: 'GET'
|
|
38
|
-
}).
|
|
47
|
+
}).middleware([
|
|
48
|
+
adminSessionMiddleware
|
|
49
|
+
]).validator((input)=>input).handler(async ({ data })=>{
|
|
39
50
|
await assertAnalyticsRead();
|
|
40
51
|
const { getAnalytics } = await import("@byline/analytics");
|
|
41
52
|
return getAnalytics().getReferrers(data);
|
|
42
53
|
});
|
|
43
54
|
const getAnalyticsCountries = createServerFn({
|
|
44
55
|
method: 'GET'
|
|
45
|
-
}).
|
|
56
|
+
}).middleware([
|
|
57
|
+
adminSessionMiddleware
|
|
58
|
+
]).validator((input)=>input).handler(async ({ data })=>{
|
|
46
59
|
await assertAnalyticsRead();
|
|
47
60
|
const { getAnalytics } = await import("@byline/analytics");
|
|
48
61
|
return getAnalytics().getCountries(data);
|
|
@@ -5,11 +5,12 @@ import { bylineCore } from "../../integrations/byline-core.js";
|
|
|
5
5
|
const getCurrentAdminUser = createServerFn({
|
|
6
6
|
method: 'GET'
|
|
7
7
|
}).handler(async ()=>{
|
|
8
|
-
const { actor } = await getAdminRequestContext();
|
|
8
|
+
const { actor, sessionId } = await getAdminRequestContext();
|
|
9
9
|
if (!actor) throw new Error('unexpected null actor after getAdminRequestContext');
|
|
10
10
|
const row = await bylineCore().adminStore?.adminUsers.getById(actor.id);
|
|
11
11
|
if (!row) throw new Error('admin user not found for current session');
|
|
12
12
|
return {
|
|
13
|
+
sessionId: sessionId,
|
|
13
14
|
id: row.id,
|
|
14
15
|
email: row.email,
|
|
15
16
|
given_name: row.given_name,
|
|
@@ -23,8 +24,9 @@ const getCurrentAdminUserSoft = createServerFn({
|
|
|
23
24
|
}).handler(async ()=>{
|
|
24
25
|
try {
|
|
25
26
|
let actor;
|
|
27
|
+
let sessionId;
|
|
26
28
|
try {
|
|
27
|
-
({ actor } = await getAdminRequestContext());
|
|
29
|
+
({ actor, sessionId } = await getAdminRequestContext());
|
|
28
30
|
} catch (err) {
|
|
29
31
|
if (err instanceof AuthError) return null;
|
|
30
32
|
throw err;
|
|
@@ -33,6 +35,7 @@ const getCurrentAdminUserSoft = createServerFn({
|
|
|
33
35
|
const row = await bylineCore().adminStore?.adminUsers.getById(actor.id);
|
|
34
36
|
if (!row) return null;
|
|
35
37
|
return {
|
|
38
|
+
sessionId: sessionId,
|
|
36
39
|
id: row.id,
|
|
37
40
|
email: row.email,
|
|
38
41
|
given_name: row.given_name,
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
/** Explicit renewal only. Global CSRF protection applies before this POST handler. */
|
|
9
|
+
export declare const renewAdminSession: import("@tanstack/react-start").OptionalFetcher<undefined, (value: unknown) => {
|
|
10
|
+
expectedSessionId?: string;
|
|
11
|
+
}, Promise<{
|
|
12
|
+
sessionId: string;
|
|
13
|
+
}>>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createServerFn } from "@tanstack/react-start";
|
|
2
|
+
import { setResponseHeader } from "@tanstack/react-start/server";
|
|
3
|
+
import { AuthError, ERR_SESSION_CHANGED, ERR_UNAUTHENTICATED } from "@byline/auth";
|
|
4
|
+
import { readAccessTokenCookie, readRefreshTokenCookie, setSessionCookies } from "@byline/client/server";
|
|
5
|
+
import { getServerConfig } from "@byline/core";
|
|
6
|
+
const renewAdminSession = createServerFn({
|
|
7
|
+
method: 'POST'
|
|
8
|
+
}).validator((value)=>{
|
|
9
|
+
if (null == value) return {};
|
|
10
|
+
if ('object' != typeof value) throw new Error('Invalid renewal input');
|
|
11
|
+
const sid = value.expectedSessionId;
|
|
12
|
+
if (void 0 !== sid && ('string' != typeof sid || !sid || sid.length > 256)) throw new Error('Invalid login identity');
|
|
13
|
+
return {
|
|
14
|
+
expectedSessionId: sid
|
|
15
|
+
};
|
|
16
|
+
}).handler(async ({ data })=>{
|
|
17
|
+
setResponseHeader('Cache-Control', 'no-store');
|
|
18
|
+
const provider = getServerConfig().sessionProvider;
|
|
19
|
+
if (!provider) throw new Error('no sessionProvider configured');
|
|
20
|
+
const access = readAccessTokenCookie();
|
|
21
|
+
if (access) try {
|
|
22
|
+
const verified = await provider.verifyAccessToken(access);
|
|
23
|
+
if (data.expectedSessionId && data.expectedSessionId !== verified.sessionId) throw ERR_SESSION_CHANGED({
|
|
24
|
+
message: 'session changed'
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
sessionId: verified.sessionId
|
|
28
|
+
};
|
|
29
|
+
} catch (error) {
|
|
30
|
+
if (!(error instanceof AuthError) || 'ERR_ACCESS_EXPIRED' !== error.code) throw error;
|
|
31
|
+
}
|
|
32
|
+
const refreshToken = readRefreshTokenCookie();
|
|
33
|
+
if (!refreshToken) throw ERR_UNAUTHENTICATED({
|
|
34
|
+
message: 'no session to renew'
|
|
35
|
+
});
|
|
36
|
+
const tokens = await provider.refreshSession({
|
|
37
|
+
refreshToken,
|
|
38
|
+
expectedSessionId: data.expectedSessionId
|
|
39
|
+
});
|
|
40
|
+
setSessionCookies(tokens);
|
|
41
|
+
return {
|
|
42
|
+
sessionId: tokens.sessionId
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
export { renewAdminSession };
|
|
@@ -11,8 +11,9 @@ export interface SignInInput {
|
|
|
11
11
|
}
|
|
12
12
|
export interface SignInResult {
|
|
13
13
|
userId: string;
|
|
14
|
+
sessionId: string;
|
|
14
15
|
}
|
|
15
|
-
export declare const adminSignIn: import("@tanstack/react-start").
|
|
16
|
+
export declare const adminSignIn: import("@tanstack/react-start").OptionalFetcher<undefined, (input: unknown) => {
|
|
16
17
|
email: string;
|
|
17
18
|
password: string;
|
|
18
19
|
}, Promise<SignInResult>>;
|
|
@@ -1,36 +1,107 @@
|
|
|
1
1
|
import { createServerFn } from "@tanstack/react-start";
|
|
2
|
-
import { getRequestHeader } from "@tanstack/react-start/server";
|
|
3
|
-
import { setSessionCookies } from "@byline/client/server";
|
|
2
|
+
import { getRequest, getRequestHeader } from "@tanstack/react-start/server";
|
|
3
|
+
import { readAccessTokenCookie, readRefreshTokenCookie, setSessionCookies } from "@byline/client/server";
|
|
4
4
|
import { getServerConfig } from "@byline/core";
|
|
5
|
+
import { passwordSignInSchema } from "@byline/core/validation";
|
|
5
6
|
import { readAdminLocaleCookie } from "../../i18n/locale-cookie.js";
|
|
6
7
|
import { bylineCore } from "../../integrations/byline-core.js";
|
|
8
|
+
import { normalizeClientIp } from "../../integrations/client-ip.js";
|
|
9
|
+
import { wasSignInBodyChecked } from "../../integrations/sign-in-body.js";
|
|
7
10
|
const adminSignIn = createServerFn({
|
|
8
11
|
method: 'POST'
|
|
9
12
|
}).validator((input)=>{
|
|
10
|
-
|
|
11
|
-
if (
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
};
|
|
13
|
+
const parsed = passwordSignInSchema.safeParse(input);
|
|
14
|
+
if (!parsed.success) throw new Response('Invalid sign-in input', {
|
|
15
|
+
status: 400
|
|
16
|
+
});
|
|
17
|
+
return parsed.data;
|
|
16
18
|
}).handler(async ({ data })=>{
|
|
17
19
|
const provider = getServerConfig().sessionProvider;
|
|
18
20
|
if (!provider) throw new Error('no sessionProvider configured');
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
ip
|
|
21
|
+
const request = getRequest();
|
|
22
|
+
const protection = getServerConfig().passwordSignIn;
|
|
23
|
+
if (!wasSignInBodyChecked(request)) throw new Response('Password sign-in request middleware is not configured', {
|
|
24
|
+
status: 503
|
|
25
|
+
});
|
|
26
|
+
if (!protection) throw new Response('Password sign-in protection is not configured', {
|
|
27
|
+
status: 503
|
|
27
28
|
});
|
|
29
|
+
const userAgent = getRequestHeader('user-agent')?.slice(0, 512);
|
|
30
|
+
let ip;
|
|
31
|
+
try {
|
|
32
|
+
ip = normalizeClientIp(await protection.resolveClientIp(request));
|
|
33
|
+
} catch {
|
|
34
|
+
throw new Response('Client address unavailable', {
|
|
35
|
+
status: 503
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
if (!ip) throw new Response('Client address unavailable', {
|
|
39
|
+
status: 503
|
|
40
|
+
});
|
|
41
|
+
const tooMany = (seconds)=>new Response('Too many sign-in attempts', {
|
|
42
|
+
status: 429,
|
|
43
|
+
headers: {
|
|
44
|
+
'Retry-After': String(seconds),
|
|
45
|
+
'Cache-Control': 'no-store'
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
let release;
|
|
49
|
+
try {
|
|
50
|
+
release = await protection.limiter.acquire();
|
|
51
|
+
} catch {
|
|
52
|
+
throw new Response('Sign-in temporarily unavailable', {
|
|
53
|
+
status: 503
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
if (!release) throw tooMany(1);
|
|
57
|
+
const recordResult = (outcome)=>{
|
|
58
|
+
try {
|
|
59
|
+
protection.limiter.recordResult?.({
|
|
60
|
+
email: data.email,
|
|
61
|
+
ip
|
|
62
|
+
}, outcome);
|
|
63
|
+
} catch {}
|
|
64
|
+
};
|
|
65
|
+
const result = await (async ()=>{
|
|
66
|
+
try {
|
|
67
|
+
let admission;
|
|
68
|
+
try {
|
|
69
|
+
admission = await protection.limiter.consume({
|
|
70
|
+
email: data.email,
|
|
71
|
+
ip
|
|
72
|
+
});
|
|
73
|
+
} catch {
|
|
74
|
+
throw new Response('Sign-in temporarily unavailable', {
|
|
75
|
+
status: 503
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if (!admission.allowed) throw tooMany(admission.retryAfterSeconds);
|
|
79
|
+
try {
|
|
80
|
+
const result = await provider.signInWithPassword({
|
|
81
|
+
previousAccessToken: readAccessTokenCookie(),
|
|
82
|
+
previousRefreshToken: readRefreshTokenCookie(),
|
|
83
|
+
email: data.email,
|
|
84
|
+
password: data.password,
|
|
85
|
+
userAgent,
|
|
86
|
+
ip
|
|
87
|
+
});
|
|
88
|
+
recordResult('success');
|
|
89
|
+
return result;
|
|
90
|
+
} catch (error) {
|
|
91
|
+
recordResult('failure');
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
} finally{
|
|
95
|
+
release();
|
|
96
|
+
}
|
|
97
|
+
})();
|
|
28
98
|
setSessionCookies(result);
|
|
29
99
|
try {
|
|
30
100
|
await reconcileLocaleAfterSignIn(result.actor.id);
|
|
31
101
|
} catch {}
|
|
32
102
|
return {
|
|
33
|
-
userId: result.actor.id
|
|
103
|
+
userId: result.actor.id,
|
|
104
|
+
sessionId: result.sessionId
|
|
34
105
|
};
|
|
35
106
|
});
|
|
36
107
|
async function reconcileLocaleAfterSignIn(adminUserId) {
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Copyright (c) Infonomic Company Limited
|
|
7
7
|
*/
|
|
8
|
-
export declare const adminSignOut: import("@tanstack/react-start").OptionalFetcher<
|
|
8
|
+
export declare const adminSignOut: import("@tanstack/react-start").OptionalFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterClient<{}, unknown, undefined, {
|
|
9
|
+
expectedSessionId: string | null;
|
|
10
|
+
}, undefined>], undefined, Promise<{
|
|
9
11
|
status: 'ok';
|
|
10
12
|
}>>;
|
|
@@ -1,14 +1,46 @@
|
|
|
1
|
-
import { createServerFn } from "@tanstack/react-start";
|
|
2
|
-
import {
|
|
1
|
+
import { createMiddleware, createServerFn } from "@tanstack/react-start";
|
|
2
|
+
import { ERR_SESSION_CHANGED } from "@byline/auth";
|
|
3
|
+
import { clearPreviewCookie, clearSessionCookies, readAccessTokenCookie, readRefreshTokenCookie } from "@byline/client/server";
|
|
3
4
|
import { getServerConfig } from "@byline/core";
|
|
5
|
+
import { coordinateAuthAction, flagSessionChanged, notifySessionAction, sessionSnapshot } from "../../integrations/session-coordination.js";
|
|
6
|
+
const signOutBoundary = createMiddleware({
|
|
7
|
+
type: 'function'
|
|
8
|
+
}).client(async ({ next })=>{
|
|
9
|
+
const snapshot = sessionSnapshot();
|
|
10
|
+
return coordinateAuthAction(async ()=>{
|
|
11
|
+
try {
|
|
12
|
+
const result = await next({
|
|
13
|
+
sendContext: {
|
|
14
|
+
expectedSessionId: snapshot.sessionId
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
notifySessionAction();
|
|
18
|
+
return result;
|
|
19
|
+
} catch (error) {
|
|
20
|
+
if (error?.code === 'ERR_SESSION_CHANGED') flagSessionChanged();
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
});
|
|
4
25
|
const adminSignOut = createServerFn({
|
|
5
26
|
method: 'POST'
|
|
6
|
-
}).
|
|
27
|
+
}).middleware([
|
|
28
|
+
signOutBoundary
|
|
29
|
+
]).handler(async ({ context })=>{
|
|
7
30
|
const provider = getServerConfig().sessionProvider;
|
|
8
31
|
const refreshToken = readRefreshTokenCookie();
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
32
|
+
const accessToken = readAccessTokenCookie();
|
|
33
|
+
if (refreshToken || accessToken) {
|
|
34
|
+
if (!provider) throw new Error('no sessionProvider configured');
|
|
35
|
+
if (!context.expectedSessionId) throw ERR_SESSION_CHANGED({
|
|
36
|
+
message: 'logout requires the page login identity'
|
|
37
|
+
});
|
|
38
|
+
await provider.revokeSession({
|
|
39
|
+
refreshToken,
|
|
40
|
+
accessToken,
|
|
41
|
+
expectedSessionId: context.expectedSessionId
|
|
42
|
+
});
|
|
43
|
+
}
|
|
12
44
|
clearSessionCookies();
|
|
13
45
|
clearPreviewCookie();
|
|
14
46
|
return {
|
|
@@ -30,7 +30,9 @@ export interface AuditLogEntryDto {
|
|
|
30
30
|
after: string | string[] | null;
|
|
31
31
|
occurredAt: string;
|
|
32
32
|
}
|
|
33
|
-
export declare const getCollectionDocumentAuditLog: import("@tanstack/react-start").RequiredFetcher<undefined,
|
|
33
|
+
export declare const getCollectionDocumentAuditLog: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
34
|
+
bylineExpectedSessionId: string | null;
|
|
35
|
+
}, undefined, undefined>], (input: {
|
|
34
36
|
collection: string;
|
|
35
37
|
id: string;
|
|
36
38
|
params?: AuditLogSearchParams;
|
|
@@ -2,10 +2,13 @@ import { createServerFn } from "@tanstack/react-start";
|
|
|
2
2
|
import { getAdminBylineClient } from "@byline/client/server";
|
|
3
3
|
import { ERR_NOT_FOUND, getLogger } from "@byline/core";
|
|
4
4
|
import { ensureCollection } from "../../integrations/api-utils.js";
|
|
5
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
5
6
|
import { resolveActorLabels } from "./actors.js";
|
|
6
7
|
const getCollectionDocumentAuditLog = createServerFn({
|
|
7
8
|
method: 'GET'
|
|
8
|
-
}).
|
|
9
|
+
}).middleware([
|
|
10
|
+
adminSessionMiddleware
|
|
11
|
+
]).validator((input)=>input).handler(async ({ data })=>{
|
|
9
12
|
const { collection: path, id, params } = data;
|
|
10
13
|
const config = await ensureCollection(path);
|
|
11
14
|
if (!config) throw ERR_NOT_FOUND({
|
|
@@ -1,3 +1,10 @@
|
|
|
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
|
+
*/
|
|
1
8
|
import type { CopyToLocaleResult } from '@byline/core/services';
|
|
2
9
|
import { type CollectionDocumentCommittedHookFailureResponse } from './save-outcome.js';
|
|
3
10
|
/**
|
|
@@ -9,7 +16,9 @@ import { type CollectionDocumentCommittedHookFailureResponse } from './save-outc
|
|
|
9
16
|
* `assertActorCanPerform('update')` runs inside the service; auth
|
|
10
17
|
* failures propagate to TanStack Start's transport layer.
|
|
11
18
|
*/
|
|
12
|
-
export declare const copyDocumentToLocale: import("@tanstack/react-start").RequiredFetcher<undefined,
|
|
19
|
+
export declare const copyDocumentToLocale: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
20
|
+
bylineExpectedSessionId: string | null;
|
|
21
|
+
}, undefined, undefined>], (input: {
|
|
13
22
|
expectedRevision: number;
|
|
14
23
|
collection: string;
|
|
15
24
|
id: string;
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import { withDocumentMutationErrors } from "../document-mutation-errors.js";
|
|
2
1
|
import { createServerFn } from "@tanstack/react-start";
|
|
3
2
|
import { getAdminRequestContext } from "@byline/client/server";
|
|
4
3
|
import { ERR_NOT_FOUND, getLogger, getServerConfig } from "@byline/core";
|
|
5
4
|
import { copyToLocale } from "@byline/core/services";
|
|
6
5
|
import { ensureCollection } from "../../integrations/api-utils.js";
|
|
6
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
7
|
+
import { withDocumentMutationErrors } from "../document-mutation-errors.js";
|
|
7
8
|
import { toCommittedDocumentHookFailureResponse } from "./save-outcome.js";
|
|
8
9
|
const copyDocumentToLocale = createServerFn({
|
|
9
10
|
method: 'POST'
|
|
10
|
-
}).
|
|
11
|
+
}).middleware([
|
|
12
|
+
adminSessionMiddleware
|
|
13
|
+
]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
|
|
11
14
|
const { collection: path, id, sourceLocale, targetLocale, overwrite } = input;
|
|
12
15
|
const logger = getLogger();
|
|
13
16
|
const config = await ensureCollection(path);
|
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*/
|
|
8
|
+
export declare const createCollectionDocument: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
9
|
+
bylineExpectedSessionId: string | null;
|
|
10
|
+
}, undefined, undefined>], (input: {
|
|
2
11
|
collection: string;
|
|
3
12
|
data: any;
|
|
4
13
|
locale?: string;
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import { withDocumentMutationErrors } from "../document-mutation-errors.js";
|
|
2
1
|
import { createServerFn } from "@tanstack/react-start";
|
|
3
2
|
import { getAdminRequestContext } from "@byline/client/server";
|
|
4
3
|
import { ERR_NOT_FOUND, getLogger, getServerConfig } from "@byline/core";
|
|
5
4
|
import { createDocument } from "@byline/core/services";
|
|
6
5
|
import { ensureCollection } from "../../integrations/api-utils.js";
|
|
6
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
7
|
+
import { withDocumentMutationErrors } from "../document-mutation-errors.js";
|
|
7
8
|
import { toCommittedDocumentHookFailureResponse } from "./save-outcome.js";
|
|
8
9
|
const createCollectionDocument = createServerFn({
|
|
9
10
|
method: 'POST'
|
|
10
|
-
}).
|
|
11
|
+
}).middleware([
|
|
12
|
+
adminSessionMiddleware
|
|
13
|
+
]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
|
|
11
14
|
const { collection: path, data: documentData, locale, path: explicitPath, availableLocales } = input;
|
|
12
15
|
const logger = getLogger();
|
|
13
16
|
const config = await ensureCollection(path);
|
|
@@ -1,3 +1,10 @@
|
|
|
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
|
+
*/
|
|
1
8
|
import type { DeleteLocaleResult } from '@byline/core/services';
|
|
2
9
|
import { type CollectionDocumentCommittedHookFailureResponse } from './save-outcome.js';
|
|
3
10
|
/**
|
|
@@ -10,7 +17,9 @@ import { type CollectionDocumentCommittedHookFailureResponse } from './save-outc
|
|
|
10
17
|
* the service; auth and validation failures propagate to TanStack Start's
|
|
11
18
|
* transport layer.
|
|
12
19
|
*/
|
|
13
|
-
export declare const deleteDocumentLocale: import("@tanstack/react-start").RequiredFetcher<undefined,
|
|
20
|
+
export declare const deleteDocumentLocale: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
21
|
+
bylineExpectedSessionId: string | null;
|
|
22
|
+
}, undefined, undefined>], (input: {
|
|
14
23
|
expectedRevision: number;
|
|
15
24
|
collection: string;
|
|
16
25
|
id: string;
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import { withDocumentMutationErrors } from "../document-mutation-errors.js";
|
|
2
1
|
import { createServerFn } from "@tanstack/react-start";
|
|
3
2
|
import { getAdminRequestContext } from "@byline/client/server";
|
|
4
3
|
import { ERR_NOT_FOUND, getLogger, getServerConfig } from "@byline/core";
|
|
5
4
|
import { deleteLocale } from "@byline/core/services";
|
|
6
5
|
import { ensureCollection } from "../../integrations/api-utils.js";
|
|
6
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
7
|
+
import { withDocumentMutationErrors } from "../document-mutation-errors.js";
|
|
7
8
|
import { toCommittedDocumentHookFailureResponse } from "./save-outcome.js";
|
|
8
9
|
const deleteDocumentLocale = createServerFn({
|
|
9
10
|
method: 'POST'
|
|
10
|
-
}).
|
|
11
|
+
}).middleware([
|
|
12
|
+
adminSessionMiddleware
|
|
13
|
+
]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
|
|
11
14
|
const { collection: path, id, locale } = input;
|
|
12
15
|
const logger = getLogger();
|
|
13
16
|
const config = await ensureCollection(path);
|
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*/
|
|
8
|
+
export declare const deleteDocument: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
9
|
+
bylineExpectedSessionId: string | null;
|
|
10
|
+
}, undefined, undefined>], (input: {
|
|
2
11
|
expectedRevision: number;
|
|
3
12
|
collection: string;
|
|
4
13
|
id: string;
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import { withDocumentMutationErrors } from "../document-mutation-errors.js";
|
|
2
1
|
import { createServerFn } from "@tanstack/react-start";
|
|
3
2
|
import { getAdminRequestContext } from "@byline/client/server";
|
|
4
3
|
import { ERR_NOT_FOUND, getLogger, getServerConfig, getUploadFields } from "@byline/core";
|
|
5
4
|
import { deleteDocument } from "@byline/core/services";
|
|
6
5
|
import { ensureCollection } from "../../integrations/api-utils.js";
|
|
6
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
7
|
+
import { withDocumentMutationErrors } from "../document-mutation-errors.js";
|
|
7
8
|
import { toDeleteDocumentResponse } from "./delete-outcome.js";
|
|
8
9
|
const delete_deleteDocument = createServerFn({
|
|
9
10
|
method: 'POST'
|
|
10
|
-
}).
|
|
11
|
+
}).middleware([
|
|
12
|
+
adminSessionMiddleware
|
|
13
|
+
]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
|
|
11
14
|
const { collection: path, id } = input;
|
|
12
15
|
const logger = getLogger();
|
|
13
16
|
const config = await ensureCollection(path);
|
|
@@ -1,3 +1,10 @@
|
|
|
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
|
+
*/
|
|
1
8
|
import type { DuplicateDocumentResult } from '@byline/core/services';
|
|
2
9
|
import { type CollectionDocumentCommittedHookFailureResponse } from './save-outcome.js';
|
|
3
10
|
/**
|
|
@@ -11,7 +18,9 @@ import { type CollectionDocumentCommittedHookFailureResponse } from './save-outc
|
|
|
11
18
|
* `assertActorCanPerform(..., 'create')`; any auth failure propagates to
|
|
12
19
|
* TanStack Start's transport layer for the client to branch on.
|
|
13
20
|
*/
|
|
14
|
-
export declare const duplicateCollectionDocument: import("@tanstack/react-start").RequiredFetcher<undefined,
|
|
21
|
+
export declare const duplicateCollectionDocument: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
22
|
+
bylineExpectedSessionId: string | null;
|
|
23
|
+
}, undefined, undefined>], (input: {
|
|
15
24
|
expectedRevision: number;
|
|
16
25
|
collection: string;
|
|
17
26
|
id: string;
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import { withDocumentMutationErrors } from "../document-mutation-errors.js";
|
|
2
1
|
import { createServerFn } from "@tanstack/react-start";
|
|
3
2
|
import { getAdminRequestContext } from "@byline/client/server";
|
|
4
3
|
import { ERR_NOT_FOUND, getLogger, getServerConfig } from "@byline/core";
|
|
5
4
|
import { duplicateDocument } from "@byline/core/services";
|
|
6
5
|
import { ensureCollection } from "../../integrations/api-utils.js";
|
|
6
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
7
|
+
import { withDocumentMutationErrors } from "../document-mutation-errors.js";
|
|
7
8
|
import { toCommittedDocumentHookFailureResponse } from "./save-outcome.js";
|
|
8
9
|
const duplicateCollectionDocument = createServerFn({
|
|
9
10
|
method: 'POST'
|
|
10
|
-
}).
|
|
11
|
+
}).middleware([
|
|
12
|
+
adminSessionMiddleware
|
|
13
|
+
]).validator((input)=>input).handler(withDocumentMutationErrors(async ({ data: input })=>{
|
|
11
14
|
const { collection: path, id: sourceDocumentId } = input;
|
|
12
15
|
const logger = getLogger();
|
|
13
16
|
const config = await ensureCollection(path);
|
|
@@ -1,3 +1,10 @@
|
|
|
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
|
+
*/
|
|
1
8
|
/**
|
|
2
9
|
* Fetch a single document by ID. Returns `null` when the document is not found
|
|
3
10
|
* so callers can degrade gracefully (e.g. `notFound()`).
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import { withEditableRevision } from "../editable-revision.js";
|
|
2
1
|
import { createServerFn } from "@tanstack/react-start";
|
|
3
2
|
import { getAdminBylineClient, getAdminRequestContext } from "@byline/client/server";
|
|
4
3
|
import { BylineError, ERR_NOT_FOUND, ErrorCodes, documentAbilityKey, getCollectionSchemasForPath, getLogger, getServerConfig } from "@byline/core";
|
|
5
4
|
import { ensureCollection } from "../../integrations/api-utils.js";
|
|
5
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
6
6
|
import { resolveAdminDocumentRead } from "../admin-document-presentation.js";
|
|
7
|
+
import { withEditableRevision } from "../editable-revision.js";
|
|
7
8
|
import { serialise } from "./utils.js";
|
|
8
9
|
const getDocumentFn = createServerFn({
|
|
9
10
|
method: 'GET'
|
|
10
|
-
}).
|
|
11
|
+
}).middleware([
|
|
12
|
+
adminSessionMiddleware
|
|
13
|
+
]).validator((input)=>input).handler(async ({ data })=>{
|
|
11
14
|
const { collection: path, id, locale, depth, populateRelations } = data;
|
|
12
15
|
const logger = getLogger();
|
|
13
16
|
const config = await ensureCollection(path);
|
|
@@ -88,7 +91,9 @@ const getDocumentFn = createServerFn({
|
|
|
88
91
|
});
|
|
89
92
|
const getDocumentByVersionFn = createServerFn({
|
|
90
93
|
method: 'GET'
|
|
91
|
-
}).
|
|
94
|
+
}).middleware([
|
|
95
|
+
adminSessionMiddleware
|
|
96
|
+
]).validator((input)=>input).handler(async ({ data })=>{
|
|
92
97
|
const { collection: path, versionId, locale } = data;
|
|
93
98
|
const resolvedLocale = locale ?? 'all';
|
|
94
99
|
const logger = getLogger();
|