@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
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { createMiddleware } from "@tanstack/react-start";
|
|
2
|
+
import { getRequest, setResponseHeader } from "@tanstack/react-start/server";
|
|
3
|
+
import { AuthError, ERR_ACCESS_EXPIRED, ERR_SESSION_CHANGED, ERR_UNAUTHENTICATED } from "@byline/auth";
|
|
4
|
+
import { getAdminRequestContext } from "@byline/client/server";
|
|
5
|
+
import { renewAdminSession } from "../server-fns/auth/renew.js";
|
|
6
|
+
import { coordinateAuthAction, flagSessionChanged, observeSession, renewSingleFlight, requireUnchanged, sessionSnapshot } from "./session-coordination.js";
|
|
7
|
+
import { sessionRequestKind } from "./session-request-kind.js";
|
|
8
|
+
const outcomeHeader = 'x-byline-auth-boundary';
|
|
9
|
+
const adminSessionMiddleware = createMiddleware({
|
|
10
|
+
type: 'function'
|
|
11
|
+
}).client(async ({ next })=>{
|
|
12
|
+
if ("u" < typeof window) return next({
|
|
13
|
+
sendContext: {
|
|
14
|
+
bylineExpectedSessionId: null
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
const snapshot = sessionSnapshot();
|
|
18
|
+
requireUnchanged(snapshot);
|
|
19
|
+
return next({
|
|
20
|
+
sendContext: {
|
|
21
|
+
bylineExpectedSessionId: snapshot.sessionId
|
|
22
|
+
},
|
|
23
|
+
fetch: async (input, init)=>{
|
|
24
|
+
const reusable = !(input instanceof Request) && !(init?.body instanceof ReadableStream);
|
|
25
|
+
let response = await fetch(input, init);
|
|
26
|
+
if ('changed' === response.headers.get(outcomeHeader)) {
|
|
27
|
+
flagSessionChanged();
|
|
28
|
+
throw ERR_SESSION_CHANGED({
|
|
29
|
+
message: 'session changed'
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if ('renew' === response.headers.get(outcomeHeader)) {
|
|
33
|
+
requireUnchanged(snapshot);
|
|
34
|
+
await renewSingleFlight(()=>coordinateAuthAction(async ()=>{
|
|
35
|
+
const result = await renewAdminSession({
|
|
36
|
+
data: {
|
|
37
|
+
expectedSessionId: snapshot.sessionId ?? void 0
|
|
38
|
+
}
|
|
39
|
+
}).catch((error)=>{
|
|
40
|
+
if (error?.code === 'ERR_SESSION_CHANGED') flagSessionChanged();
|
|
41
|
+
throw error;
|
|
42
|
+
});
|
|
43
|
+
if (snapshot.sessionId && result.sessionId !== snapshot.sessionId) {
|
|
44
|
+
flagSessionChanged();
|
|
45
|
+
throw ERR_SESSION_CHANGED({
|
|
46
|
+
message: 'session changed during renewal'
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
observeSession(result.sessionId);
|
|
50
|
+
}));
|
|
51
|
+
requireUnchanged(snapshot);
|
|
52
|
+
if (!reusable) throw ERR_ACCESS_EXPIRED({
|
|
53
|
+
message: 'Session renewed. Please retry the operation.'
|
|
54
|
+
});
|
|
55
|
+
response = await fetch(input, init);
|
|
56
|
+
if ('changed' === response.headers.get(outcomeHeader)) flagSessionChanged();
|
|
57
|
+
}
|
|
58
|
+
requireUnchanged(snapshot);
|
|
59
|
+
return response;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}).server(async ({ next, context, method })=>{
|
|
63
|
+
const kind = sessionRequestKind(getRequest());
|
|
64
|
+
if (!kind) throw new Error('sessionRequestMiddleware is not configured');
|
|
65
|
+
let auth;
|
|
66
|
+
try {
|
|
67
|
+
auth = await getAdminRequestContext();
|
|
68
|
+
} catch (error) {
|
|
69
|
+
if (error instanceof AuthError && 'ERR_ACCESS_EXPIRED' === error.code) setResponseHeader(outcomeHeader, 'renew');
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
const expected = context.bylineExpectedSessionId;
|
|
73
|
+
if (('serverFn' === kind || 'GET' !== method) && (!expected || expected !== auth.sessionId)) {
|
|
74
|
+
setResponseHeader(outcomeHeader, 'changed');
|
|
75
|
+
throw ERR_SESSION_CHANGED({
|
|
76
|
+
message: 'session changed before operation'
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if (!auth.sessionId) throw ERR_UNAUTHENTICATED({
|
|
80
|
+
message: 'provider omitted login identity'
|
|
81
|
+
});
|
|
82
|
+
try {
|
|
83
|
+
const result = await next();
|
|
84
|
+
const response = result.result;
|
|
85
|
+
if (response instanceof Response) response.headers.delete(outcomeHeader);
|
|
86
|
+
return result;
|
|
87
|
+
} catch (error) {
|
|
88
|
+
if (error instanceof Response) error.headers.delete(outcomeHeader);
|
|
89
|
+
throw error;
|
|
90
|
+
} finally{
|
|
91
|
+
setResponseHeader(outcomeHeader, 'handled');
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
export { adminSessionMiddleware };
|
|
@@ -0,0 +1,9 @@
|
|
|
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 function recordSessionRequestKind(request: object, kind: string): void;
|
|
9
|
+
export declare function sessionRequestKind(request: object): string | undefined;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const key = Symbol.for('byline.sessionRequestKinds');
|
|
2
|
+
const kinds = globalThis[key] ?? new WeakMap();
|
|
3
|
+
globalThis[key] = kinds;
|
|
4
|
+
function recordSessionRequestKind(request, kind) {
|
|
5
|
+
kinds.set(request, kind);
|
|
6
|
+
}
|
|
7
|
+
function sessionRequestKind(request) {
|
|
8
|
+
return kinds.get(request);
|
|
9
|
+
}
|
|
10
|
+
export { recordSessionRequestKind, sessionRequestKind };
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
/** Register after CSRF. Classifies SSR separately from remotely invoked business functions. */
|
|
9
|
+
export declare const sessionRequestMiddleware: import("@tanstack/react-start").RequestMiddlewareAfterServer<{}, undefined, undefined>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { createMiddleware } from "@tanstack/react-start";
|
|
2
|
+
import { recordSessionRequestKind } from "./session-request-kind.js";
|
|
3
|
+
const sessionRequestMiddleware = createMiddleware().server(async (ctx)=>{
|
|
4
|
+
recordSessionRequestKind(ctx.request, ctx.handlerType);
|
|
5
|
+
return ctx.next();
|
|
6
|
+
});
|
|
7
|
+
export { sessionRequestMiddleware };
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
/** Limit the serialized RPC envelope, not just its eventual credential fields. */
|
|
9
|
+
export declare const SIGN_IN_MAX_BODY_BYTES: number;
|
|
10
|
+
export declare function wasSignInBodyChecked(request: Request): boolean;
|
|
11
|
+
/** Read a bounded clone before Start parses the original. Never await tee cancellation. */
|
|
12
|
+
export declare function checkSignInBody(request: Request): Promise<Response | undefined>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const SIGN_IN_MAX_BODY_BYTES = 16384;
|
|
2
|
+
const checked = new WeakSet();
|
|
3
|
+
function wasSignInBodyChecked(request) {
|
|
4
|
+
return checked.has(request);
|
|
5
|
+
}
|
|
6
|
+
async function checkSignInBody(request) {
|
|
7
|
+
if ('POST' !== request.method) return new Response('Method not allowed', {
|
|
8
|
+
status: 405,
|
|
9
|
+
headers: {
|
|
10
|
+
Allow: 'POST'
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
if (!request.headers.get('content-type')?.toLowerCase().startsWith('application/json')) return new Response('Expected JSON', {
|
|
14
|
+
status: 415
|
|
15
|
+
});
|
|
16
|
+
const declared = request.headers.get('content-length');
|
|
17
|
+
if (null !== declared && (!/^\d+$/.test(declared) || Number(declared) > SIGN_IN_MAX_BODY_BYTES)) return new Response('Payload too large', {
|
|
18
|
+
status: 413
|
|
19
|
+
});
|
|
20
|
+
const reader = request.clone().body?.getReader();
|
|
21
|
+
if (!reader) return new Response('Missing body', {
|
|
22
|
+
status: 400
|
|
23
|
+
});
|
|
24
|
+
let timer;
|
|
25
|
+
const deadline = new Promise((_, reject)=>{
|
|
26
|
+
timer = setTimeout(()=>reject(new Error('Body timeout')), 5000);
|
|
27
|
+
});
|
|
28
|
+
try {
|
|
29
|
+
let size = 0;
|
|
30
|
+
while(true){
|
|
31
|
+
const { value, done } = await Promise.race([
|
|
32
|
+
reader.read(),
|
|
33
|
+
deadline
|
|
34
|
+
]);
|
|
35
|
+
if (done) break;
|
|
36
|
+
size += value.byteLength;
|
|
37
|
+
if (size > SIGN_IN_MAX_BODY_BYTES) return new Response('Payload too large', {
|
|
38
|
+
status: 413
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
checked.add(request);
|
|
42
|
+
return;
|
|
43
|
+
} catch {
|
|
44
|
+
return new Response('Incomplete request body', {
|
|
45
|
+
status: 408
|
|
46
|
+
});
|
|
47
|
+
} finally{
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
reader.cancel().catch(()=>{});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export { SIGN_IN_MAX_BODY_BYTES, checkSignInBody, wasSignInBodyChecked };
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
/** Register after CSRF in Start's global requestMiddleware, before RPC deserialization. */
|
|
9
|
+
export declare const passwordSignInMiddleware: import("@tanstack/react-start").RequestMiddlewareAfterServer<{}, undefined, undefined>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createMiddleware } from "@tanstack/react-start";
|
|
2
|
+
import { adminSignIn } from "../server-fns/auth/sign-in.js";
|
|
3
|
+
import { checkSignInBody } from "./sign-in-body.js";
|
|
4
|
+
const passwordSignInMiddleware = createMiddleware().server(async (ctx)=>{
|
|
5
|
+
const endpoint = new URL(adminSignIn.url, ctx.request.url).pathname.replace(/\/$/, '');
|
|
6
|
+
if ('serverFn' !== ctx.handlerType || ctx.pathname !== endpoint && !ctx.pathname.startsWith(`${endpoint}/`)) return ctx.next();
|
|
7
|
+
const rejected = await checkSignInBody(ctx.request);
|
|
8
|
+
return rejected ?? ctx.next();
|
|
9
|
+
});
|
|
10
|
+
export { passwordSignInMiddleware };
|
|
@@ -14,10 +14,12 @@ import { AdminMenuProvider } from "../admin-shell/chrome/admin-menu-provider.js"
|
|
|
14
14
|
import { Content } from "../admin-shell/chrome/content.js";
|
|
15
15
|
import { RouteError, RouteNotFound } from "../admin-shell/chrome/route-error.js";
|
|
16
16
|
import { RouteProgressBar } from "../admin-shell/chrome/route-progress-bar.js";
|
|
17
|
+
import { SessionChangeBoundary } from "../admin-shell/chrome/session-change-boundary.js";
|
|
17
18
|
import { buildLocaleDefinitions } from "../i18n/locale-definitions.js";
|
|
18
19
|
import { bylineAdminServices } from "../integrations/byline-admin-services.js";
|
|
19
20
|
import { BylineAiAdminProvider } from "../integrations/byline-ai.js";
|
|
20
21
|
import { bylineFieldServices } from "../integrations/byline-field-services.js";
|
|
22
|
+
import { observeSession, sessionIsChanged } from "../integrations/session-coordination.js";
|
|
21
23
|
import { getAnalyticsRuntime } from "../server-fns/analytics/index.js";
|
|
22
24
|
import { getCurrentAdminUser } from "../server-fns/auth/index.js";
|
|
23
25
|
import { getScheduledPublicationRuntime } from "../server-fns/collections/index.js";
|
|
@@ -29,6 +31,7 @@ function createAdminLayoutRoute(path) {
|
|
|
29
31
|
const signInPath = getSignInRoutePath();
|
|
30
32
|
try {
|
|
31
33
|
const user = await getCurrentAdminUser();
|
|
34
|
+
if ("u" > typeof window) observeSession(user.sessionId);
|
|
32
35
|
const [activeLocale, scheduledPublicationRuntime, analyticsRuntime] = await Promise.all([
|
|
33
36
|
getActiveLocaleFn(),
|
|
34
37
|
getScheduledPublicationRuntime(),
|
|
@@ -40,7 +43,16 @@ function createAdminLayoutRoute(path) {
|
|
|
40
43
|
scheduledPublicationRuntime,
|
|
41
44
|
analyticsRuntime
|
|
42
45
|
};
|
|
43
|
-
} catch
|
|
46
|
+
} catch (error) {
|
|
47
|
+
const code = error?.code;
|
|
48
|
+
if (!("u" > typeof window && sessionIsChanged()) && ![
|
|
49
|
+
'ERR_UNAUTHENTICATED',
|
|
50
|
+
'ERR_ACCESS_EXPIRED',
|
|
51
|
+
'ERR_INVALID_TOKEN',
|
|
52
|
+
'ERR_REVOKED_TOKEN',
|
|
53
|
+
'ERR_ACCOUNT_DISABLED',
|
|
54
|
+
'ERR_SESSION_CHANGED'
|
|
55
|
+
].includes(code ?? '')) throw error;
|
|
44
56
|
throw redirect({
|
|
45
57
|
to: signInPath,
|
|
46
58
|
search: {
|
|
@@ -64,36 +76,39 @@ function createAdminLayoutRoute(path) {
|
|
|
64
76
|
});
|
|
65
77
|
window.location.reload();
|
|
66
78
|
};
|
|
67
|
-
return /*#__PURE__*/ jsx(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
children: /*#__PURE__*/ jsx(
|
|
76
|
-
services:
|
|
77
|
-
children: /*#__PURE__*/ jsx(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
79
|
+
return /*#__PURE__*/ jsx(SessionChangeBoundary, {
|
|
80
|
+
user: user,
|
|
81
|
+
children: /*#__PURE__*/ jsx(I18nProvider, {
|
|
82
|
+
bundle: i18n.translations ?? {},
|
|
83
|
+
activeLocale: activeLocale,
|
|
84
|
+
defaultLocale: i18n.admin.defaultLocale,
|
|
85
|
+
localeDefinitions: localeDefinitions,
|
|
86
|
+
setLocale: handleSetLocale,
|
|
87
|
+
children: /*#__PURE__*/ jsx(BylineAdminServicesProvider, {
|
|
88
|
+
services: bylineAdminServices,
|
|
89
|
+
children: /*#__PURE__*/ jsx(BylineFieldServicesProvider, {
|
|
90
|
+
services: bylineFieldServices,
|
|
91
|
+
children: /*#__PURE__*/ jsx(BylineAiAdminProvider, {
|
|
92
|
+
children: /*#__PURE__*/ jsxs(AdminMenuProvider, {
|
|
93
|
+
children: [
|
|
94
|
+
/*#__PURE__*/ jsx(RouteProgressBar, {}),
|
|
95
|
+
/*#__PURE__*/ jsx(AdminAppBar, {
|
|
96
|
+
user: user
|
|
97
|
+
}),
|
|
98
|
+
/*#__PURE__*/ jsxs("main", {
|
|
99
|
+
className: clsx('byline-admin-layout-main', admin_layout_module.main),
|
|
100
|
+
children: [
|
|
101
|
+
/*#__PURE__*/ jsx(AdminMenuDrawer, {
|
|
102
|
+
analyticsEnabled: analyticsRuntime.enabled,
|
|
103
|
+
scheduledPublicationEnabled: scheduledPublicationRuntime.enabled
|
|
104
|
+
}),
|
|
105
|
+
/*#__PURE__*/ jsx(Content, {
|
|
106
|
+
children: /*#__PURE__*/ jsx(Outlet, {})
|
|
107
|
+
})
|
|
108
|
+
]
|
|
109
|
+
})
|
|
110
|
+
]
|
|
111
|
+
})
|
|
97
112
|
})
|
|
98
113
|
})
|
|
99
114
|
})
|
|
@@ -10,7 +10,8 @@ function createSignInRoute(path, { homeUrl } = {}) {
|
|
|
10
10
|
validateSearch: (search)=>{
|
|
11
11
|
const callbackUrl = resolveAdminCallbackPath(search.callbackUrl);
|
|
12
12
|
return {
|
|
13
|
-
callbackUrl
|
|
13
|
+
callbackUrl,
|
|
14
|
+
reauthenticate: '1' === search.reauthenticate || 1 === search.reauthenticate || true === search.reauthenticate
|
|
14
15
|
};
|
|
15
16
|
},
|
|
16
17
|
beforeLoad: async ()=>{
|
|
@@ -20,10 +21,11 @@ function createSignInRoute(path, { homeUrl } = {}) {
|
|
|
20
21
|
};
|
|
21
22
|
},
|
|
22
23
|
component: function() {
|
|
23
|
-
const { callbackUrl } = Route.useSearch();
|
|
24
|
+
const { callbackUrl, reauthenticate } = Route.useSearch();
|
|
24
25
|
const { activeLocale } = Route.useRouteContext();
|
|
25
26
|
return /*#__PURE__*/ jsx(SignInPage, {
|
|
26
27
|
redirectTo: resolveAdminSignInRedirect(callbackUrl),
|
|
28
|
+
reauthenticate: reauthenticate,
|
|
27
29
|
activeLocale: activeLocale,
|
|
28
30
|
homeUrl: resolvedHomeUrl
|
|
29
31
|
});
|
|
@@ -10,7 +10,9 @@ export interface ChangeAccountPasswordInput {
|
|
|
10
10
|
currentPassword: string;
|
|
11
11
|
newPassword: string;
|
|
12
12
|
}
|
|
13
|
-
export declare const changeAccountPassword: import("@tanstack/react-start").RequiredFetcher<
|
|
13
|
+
export declare const changeAccountPassword: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
14
|
+
bylineExpectedSessionId: string | null;
|
|
15
|
+
}, undefined, undefined>], (input: ChangeAccountPasswordInput) => ChangeAccountPasswordInput, Promise<{
|
|
14
16
|
id: string;
|
|
15
17
|
vid: number;
|
|
16
18
|
email: string;
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { createServerFn } from "@tanstack/react-start";
|
|
2
2
|
import { changeAccountPasswordCommand } from "@byline/admin/admin-account";
|
|
3
|
-
import { getAdminRequestContext } from "@byline/client/server";
|
|
3
|
+
import { clearPreviewCookie, clearSessionCookies, getAdminRequestContext } from "@byline/client/server";
|
|
4
4
|
import { bylineCore } from "../../integrations/byline-core.js";
|
|
5
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
5
6
|
const changeAccountPassword = createServerFn({
|
|
6
7
|
method: 'POST'
|
|
7
|
-
}).
|
|
8
|
+
}).middleware([
|
|
9
|
+
adminSessionMiddleware
|
|
10
|
+
]).validator((input)=>input).handler(async ({ data })=>{
|
|
8
11
|
const context = await getAdminRequestContext();
|
|
9
|
-
|
|
12
|
+
const account = await changeAccountPasswordCommand(context, data, {
|
|
10
13
|
store: bylineCore().adminStore
|
|
11
14
|
});
|
|
15
|
+
clearSessionCookies();
|
|
16
|
+
clearPreviewCookie();
|
|
17
|
+
return account;
|
|
12
18
|
});
|
|
13
19
|
export { changeAccountPassword };
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
* status fields that the slim `CurrentAdminUser` on route context
|
|
12
12
|
* doesn't carry.
|
|
13
13
|
*/
|
|
14
|
-
export declare const getAccount: import("@tanstack/react-start").OptionalFetcher<
|
|
14
|
+
export declare const getAccount: import("@tanstack/react-start").OptionalFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
15
|
+
bylineExpectedSessionId: string | null;
|
|
16
|
+
}, undefined, undefined>], (input?: Record<string, never>) => Record<string, never>, Promise<{
|
|
15
17
|
id: string;
|
|
16
18
|
vid: number;
|
|
17
19
|
email: string;
|
|
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
|
|
|
2
2
|
import { getAccountCommand } from "@byline/admin/admin-account";
|
|
3
3
|
import { getAdminRequestContext } from "@byline/client/server";
|
|
4
4
|
import { bylineCore } from "../../integrations/byline-core.js";
|
|
5
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
5
6
|
const getAccount = createServerFn({
|
|
6
7
|
method: 'GET'
|
|
7
|
-
}).
|
|
8
|
+
}).middleware([
|
|
9
|
+
adminSessionMiddleware
|
|
10
|
+
]).validator((input)=>input ?? {}).handler(async ({ data })=>{
|
|
8
11
|
const context = await getAdminRequestContext();
|
|
9
12
|
return getAccountCommand(context, data, {
|
|
10
13
|
store: bylineCore().adminStore
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
* actor is the target — none of these accept an `id`.
|
|
15
15
|
*/
|
|
16
16
|
export type { AccountResponse } from '@byline/admin/admin-account';
|
|
17
|
-
export { changeAccountPassword } from './change-password';
|
|
18
|
-
export { getAccount } from './get';
|
|
19
|
-
export { updateAccount } from './update';
|
|
20
|
-
export type { ChangeAccountPasswordInput } from './change-password';
|
|
21
|
-
export type { UpdateAccountInput } from './update';
|
|
17
|
+
export { changeAccountPassword } from './change-password.js';
|
|
18
|
+
export { getAccount } from './get.js';
|
|
19
|
+
export { updateAccount } from './update.js';
|
|
20
|
+
export type { ChangeAccountPasswordInput } from './change-password.js';
|
|
21
|
+
export type { UpdateAccountInput } from './update.js';
|
|
@@ -14,7 +14,9 @@ export interface UpdateAccountInput {
|
|
|
14
14
|
username?: string | null;
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
|
-
export declare const updateAccount: import("@tanstack/react-start").RequiredFetcher<
|
|
17
|
+
export declare const updateAccount: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
18
|
+
bylineExpectedSessionId: string | null;
|
|
19
|
+
}, undefined, undefined>], (input: UpdateAccountInput) => UpdateAccountInput, Promise<{
|
|
18
20
|
id: string;
|
|
19
21
|
vid: number;
|
|
20
22
|
email: string;
|
|
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
|
|
|
2
2
|
import { updateAccountCommand } from "@byline/admin/admin-account";
|
|
3
3
|
import { getAdminRequestContext } from "@byline/client/server";
|
|
4
4
|
import { bylineCore } from "../../integrations/byline-core.js";
|
|
5
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
5
6
|
const updateAccount = createServerFn({
|
|
6
7
|
method: 'POST'
|
|
7
|
-
}).
|
|
8
|
+
}).middleware([
|
|
9
|
+
adminSessionMiddleware
|
|
10
|
+
]).validator((input)=>input).handler(async ({ data })=>{
|
|
8
11
|
const context = await getAdminRequestContext();
|
|
9
12
|
return updateAccountCommand(context, data, {
|
|
10
13
|
store: bylineCore().adminStore
|
|
@@ -47,4 +47,6 @@ export interface SystemActivityResponse {
|
|
|
47
47
|
* queries directly and is gated system-wide by `admin.activity.read` rather
|
|
48
48
|
* than by any document's own read gate.
|
|
49
49
|
*/
|
|
50
|
-
export declare const getSystemActivityLog: import("@tanstack/react-start").RequiredFetcher<
|
|
50
|
+
export declare const getSystemActivityLog: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
51
|
+
bylineExpectedSessionId: string | null;
|
|
52
|
+
}, undefined, undefined>], (input: SystemActivitySearchParams) => SystemActivitySearchParams, Promise<SystemActivityResponse>>;
|
|
@@ -3,10 +3,13 @@ import { assertAdminActor } from "@byline/admin";
|
|
|
3
3
|
import { ADMIN_ACTIVITY_ABILITIES } from "@byline/admin/admin-activity";
|
|
4
4
|
import { getAdminRequestContext } from "@byline/client/server";
|
|
5
5
|
import { ERR_AUDIT_UNSUPPORTED, getLogger, getServerConfig } from "@byline/core";
|
|
6
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
6
7
|
import { resolveActorLabels } from "../collections/actors.js";
|
|
7
8
|
const getSystemActivityLog = createServerFn({
|
|
8
9
|
method: 'GET'
|
|
9
|
-
}).
|
|
10
|
+
}).middleware([
|
|
11
|
+
adminSessionMiddleware
|
|
12
|
+
]).validator((input)=>input ?? {}).handler(async ({ data })=>{
|
|
10
13
|
const context = await getAdminRequestContext();
|
|
11
14
|
assertAdminActor(context, ADMIN_ACTIVITY_ABILITIES.read);
|
|
12
15
|
const queries = getServerConfig().db.queries;
|
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Copyright (c) Infonomic Company Limited
|
|
7
7
|
*/
|
|
8
|
-
export declare const getRoleAbilities: import("@tanstack/react-start").RequiredFetcher<undefined,
|
|
8
|
+
export declare const getRoleAbilities: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
9
|
+
bylineExpectedSessionId: string | null;
|
|
10
|
+
}, undefined, undefined>], (input: {
|
|
9
11
|
id: string;
|
|
10
12
|
}) => {
|
|
11
13
|
id: string;
|
|
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
|
|
|
2
2
|
import { getRoleAbilitiesCommand } from "@byline/admin/admin-permissions";
|
|
3
3
|
import { getAdminRequestContext } from "@byline/client/server";
|
|
4
4
|
import { bylineCore } from "../../integrations/byline-core.js";
|
|
5
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
5
6
|
const getRoleAbilities = createServerFn({
|
|
6
7
|
method: 'GET'
|
|
7
|
-
}).
|
|
8
|
+
}).middleware([
|
|
9
|
+
adminSessionMiddleware
|
|
10
|
+
]).validator((input)=>input).handler(async ({ data })=>{
|
|
8
11
|
const context = await getAdminRequestContext();
|
|
9
12
|
return getRoleAbilitiesCommand(context, data, {
|
|
10
13
|
store: bylineCore().adminStore,
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* mounts on the admin-roles role detail page.
|
|
19
19
|
*/
|
|
20
20
|
export type { AbilityDescriptorResponse, AbilityGroupResponse, AbilityHolderRole, AbilityHolderUser, GetRoleAbilitiesResponse, ListRegisteredAbilitiesResponse, SetRoleAbilitiesResponse, WhoHasAbilityResponse, } from '@byline/admin/admin-permissions';
|
|
21
|
-
export { getRoleAbilities } from './get-role-abilities';
|
|
22
|
-
export { listRegisteredAbilities } from './list-registered';
|
|
23
|
-
export { type SetRoleAbilitiesInput, setRoleAbilities } from './set-role-abilities';
|
|
24
|
-
export { whoHasAbility } from './who-has';
|
|
21
|
+
export { getRoleAbilities } from './get-role-abilities.js';
|
|
22
|
+
export { listRegisteredAbilities } from './list-registered.js';
|
|
23
|
+
export { type SetRoleAbilitiesInput, setRoleAbilities } from './set-role-abilities.js';
|
|
24
|
+
export { whoHasAbility } from './who-has.js';
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
* populated at init time by collection auto-registration plus
|
|
11
11
|
* `registerAdminAbilities`. No DB read.
|
|
12
12
|
*/
|
|
13
|
-
export declare const listRegisteredAbilities: import("@tanstack/react-start").OptionalFetcher<undefined, undefined,
|
|
13
|
+
export declare const listRegisteredAbilities: import("@tanstack/react-start").OptionalFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
14
|
+
bylineExpectedSessionId: string | null;
|
|
15
|
+
}, undefined, undefined>], undefined, Promise<{
|
|
14
16
|
abilities: {
|
|
15
17
|
key: string;
|
|
16
18
|
label: string;
|
|
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
|
|
|
2
2
|
import { listRegisteredAbilitiesCommand } from "@byline/admin/admin-permissions";
|
|
3
3
|
import { getAdminRequestContext } from "@byline/client/server";
|
|
4
4
|
import { bylineCore } from "../../integrations/byline-core.js";
|
|
5
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
5
6
|
const listRegisteredAbilities = createServerFn({
|
|
6
7
|
method: 'GET'
|
|
7
|
-
}).
|
|
8
|
+
}).middleware([
|
|
9
|
+
adminSessionMiddleware
|
|
10
|
+
]).handler(async ()=>{
|
|
8
11
|
const context = await getAdminRequestContext();
|
|
9
12
|
return listRegisteredAbilitiesCommand(context, {}, {
|
|
10
13
|
store: bylineCore().adminStore,
|
|
@@ -9,7 +9,9 @@ export interface SetRoleAbilitiesInput {
|
|
|
9
9
|
id: string;
|
|
10
10
|
abilities: string[];
|
|
11
11
|
}
|
|
12
|
-
export declare const setRoleAbilities: import("@tanstack/react-start").RequiredFetcher<
|
|
12
|
+
export declare const setRoleAbilities: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
13
|
+
bylineExpectedSessionId: string | null;
|
|
14
|
+
}, undefined, undefined>], (input: SetRoleAbilitiesInput) => SetRoleAbilitiesInput, Promise<{
|
|
13
15
|
roleId: string;
|
|
14
16
|
abilities: string[];
|
|
15
17
|
}>>;
|
|
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
|
|
|
2
2
|
import { setRoleAbilitiesCommand } from "@byline/admin/admin-permissions";
|
|
3
3
|
import { getAdminRequestContext } from "@byline/client/server";
|
|
4
4
|
import { bylineCore } from "../../integrations/byline-core.js";
|
|
5
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
5
6
|
const setRoleAbilities = createServerFn({
|
|
6
7
|
method: 'POST'
|
|
7
|
-
}).
|
|
8
|
+
}).middleware([
|
|
9
|
+
adminSessionMiddleware
|
|
10
|
+
]).validator((input)=>input).handler(async ({ data })=>{
|
|
8
11
|
const context = await getAdminRequestContext();
|
|
9
12
|
return setRoleAbilitiesCommand(context, data, {
|
|
10
13
|
store: bylineCore().adminStore,
|
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Copyright (c) Infonomic Company Limited
|
|
7
7
|
*/
|
|
8
|
-
export declare const whoHasAbility: import("@tanstack/react-start").RequiredFetcher<undefined,
|
|
8
|
+
export declare const whoHasAbility: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
9
|
+
bylineExpectedSessionId: string | null;
|
|
10
|
+
}, undefined, undefined>], (input: {
|
|
9
11
|
ability: string;
|
|
10
12
|
}) => {
|
|
11
13
|
ability: string;
|
|
@@ -2,9 +2,12 @@ import { createServerFn } from "@tanstack/react-start";
|
|
|
2
2
|
import { whoHasAbilityCommand } from "@byline/admin/admin-permissions";
|
|
3
3
|
import { getAdminRequestContext } from "@byline/client/server";
|
|
4
4
|
import { bylineCore } from "../../integrations/byline-core.js";
|
|
5
|
+
import { adminSessionMiddleware } from "../../integrations/session-middleware.js";
|
|
5
6
|
const whoHasAbility = createServerFn({
|
|
6
7
|
method: 'GET'
|
|
7
|
-
}).
|
|
8
|
+
}).middleware([
|
|
9
|
+
adminSessionMiddleware
|
|
10
|
+
]).validator((input)=>input).handler(async ({ data })=>{
|
|
8
11
|
const context = await getAdminRequestContext();
|
|
9
12
|
return whoHasAbilityCommand(context, data, {
|
|
10
13
|
store: bylineCore().adminStore,
|
|
@@ -11,7 +11,9 @@ export interface CreateAdminRoleInput {
|
|
|
11
11
|
description?: string | null;
|
|
12
12
|
order?: number;
|
|
13
13
|
}
|
|
14
|
-
export declare const createAdminRole: import("@tanstack/react-start").RequiredFetcher<
|
|
14
|
+
export declare const createAdminRole: import("@tanstack/react-start").RequiredFetcher<readonly [import("@tanstack/react-start").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, {
|
|
15
|
+
bylineExpectedSessionId: string | null;
|
|
16
|
+
}, undefined, undefined>], (input: CreateAdminRoleInput) => CreateAdminRoleInput, Promise<{
|
|
15
17
|
id: string;
|
|
16
18
|
vid: number;
|
|
17
19
|
name: string;
|