Skip to content

Commit 8eb217d

Browse files
committed
Update Workflow serializer to use Session ALS
1 parent b513f49 commit 8eb217d

File tree

2 files changed

+30
-17
lines changed

2 files changed

+30
-17
lines changed

src/components/workflow/permission.serializer.ts

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
import { setOf } from '@seedcompany/common';
22
import { DateTime } from 'luxon';
33
import { type ID, Role, type Session } from '~/common';
4+
import { type SessionHost } from '../authentication';
45
import { type Privileges, type UserResourcePrivileges } from '../authorization';
56
import { Condition } from '../authorization/policy/conditions';
67
import { type Workflow } from './define-workflow';
78
import { type SerializedWorkflowTransitionPermission as SerializedTransitionPermission } from './dto/serialized-workflow.dto';
89
import { TransitionCondition } from './workflow.granter';
910

1011
export const transitionPermissionSerializer =
11-
<W extends Workflow>(workflow: W, privileges: Privileges) =>
12+
<W extends Workflow>(
13+
workflow: W,
14+
privileges: Privileges,
15+
sessionHost: SessionHost,
16+
) =>
1217
(transition: W['transition']): readonly SerializedTransitionPermission[] => {
1318
const all = [...Role].flatMap((role) => {
1419
const session: Session = {
@@ -18,21 +23,23 @@ export const transitionPermissionSerializer =
1823
anonymous: false,
1924
roles: [`global:${role}`],
2025
};
21-
const p = privileges.for(session, workflow.eventResource);
22-
const readEvent = resolve(p, 'read', transition.key);
23-
const execute = resolve(p, 'create', transition.key);
24-
return [
25-
{
26-
role,
27-
readEvent: readEvent !== false,
28-
condition: renderCondition(readEvent),
29-
},
30-
{
31-
role,
32-
execute: execute !== false,
33-
condition: renderCondition(execute),
34-
},
35-
];
26+
return sessionHost.withSession(session, () => {
27+
const p = privileges.for(workflow.eventResource);
28+
const readEvent = resolve(p, 'read', transition.key);
29+
const execute = resolve(p, 'create', transition.key);
30+
return [
31+
{
32+
role,
33+
readEvent: readEvent !== false,
34+
condition: renderCondition(readEvent),
35+
},
36+
{
37+
role,
38+
execute: execute !== false,
39+
condition: renderCondition(execute),
40+
},
41+
];
42+
});
3643
});
3744

3845
// Remove roles that are never applicable.

src/components/workflow/workflow.service.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Inject, Injectable } from '@nestjs/common';
22
import { type Nil } from '@seedcompany/common';
33
import { type ID, type Session, UnauthorizedException } from '~/common';
4+
import { SessionHost } from '../authentication';
45
import { Privileges } from '../authorization';
56
import { MissingContextException } from '../authorization/policy/conditions';
67
import { type Workflow } from './define-workflow';
@@ -19,6 +20,7 @@ export const WorkflowService = <W extends Workflow>(workflow: () => W) => {
1920
@Injectable()
2021
abstract class WorkflowServiceClass {
2122
@Inject() protected readonly privileges: Privileges;
23+
@Inject() protected readonly sessionHost: SessionHost;
2224
protected readonly workflow: W;
2325

2426
constructor() {
@@ -142,7 +144,11 @@ export const WorkflowService = <W extends Workflow>(workflow: () => W) => {
142144
serialize() {
143145
return SerializedWorkflow.from(
144146
this.workflow,
145-
transitionPermissionSerializer(this.workflow, this.privileges),
147+
transitionPermissionSerializer(
148+
this.workflow,
149+
this.privileges,
150+
this.sessionHost,
151+
),
146152
);
147153
}
148154
}

0 commit comments

Comments
 (0)