1
1
import { setOf } from '@seedcompany/common' ;
2
2
import { DateTime } from 'luxon' ;
3
3
import { type ID , Role , type Session } from '~/common' ;
4
+ import { type SessionHost } from '../authentication' ;
4
5
import { type Privileges , type UserResourcePrivileges } from '../authorization' ;
5
6
import { Condition } from '../authorization/policy/conditions' ;
6
7
import { type Workflow } from './define-workflow' ;
7
8
import { type SerializedWorkflowTransitionPermission as SerializedTransitionPermission } from './dto/serialized-workflow.dto' ;
8
9
import { TransitionCondition } from './workflow.granter' ;
9
10
10
11
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
+ ) =>
12
17
( transition : W [ 'transition' ] ) : readonly SerializedTransitionPermission [ ] => {
13
18
const all = [ ...Role ] . flatMap ( ( role ) => {
14
19
const session : Session = {
@@ -18,21 +23,23 @@ export const transitionPermissionSerializer =
18
23
anonymous : false ,
19
24
roles : [ `global:${ role } ` ] ,
20
25
} ;
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
+ } ) ;
36
43
} ) ;
37
44
38
45
// Remove roles that are never applicable.
0 commit comments