Skip to content

Commit 385a73c

Browse files
committed
Lazily reference workflow in policy name helpers
To prevent circular dependencies on initialization
1 parent 6f602d0 commit 385a73c

File tree

7 files changed

+59
-51
lines changed

7 files changed

+59
-51
lines changed

src/components/authorization/policies/by-role/consultant-manager.policy.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import * as Consultant from './consultant.policy';
4141
p.rootDirectory.whenAny(member, sensMediumOrLower).edit,
4242
])
4343
.children((c) => [c.posts.edit]),
44-
r.ProjectWorkflowEvent.transitions(...Consultant.projectTransitions).execute,
44+
r.ProjectWorkflowEvent.transitions(Consultant.projectTransitions).execute,
4545
[
4646
r.PeriodicReport,
4747
r.ProgressReportCommunityStory,

src/components/authorization/policies/by-role/consultant.policy.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { ProjectWorkflow } from '../../../project/workflow/project-workflow';
22
import { member, Policy, Role } from '../util';
33

4-
export const projectTransitions = ProjectWorkflow.pickNames(
5-
'Pending Consultant Endorsement -> Prep for Financial Endorsement With Consultant Endorsement',
6-
'Pending Consultant Endorsement -> Prep for Financial Endorsement Without Consultant Endorsement',
7-
);
4+
export const projectTransitions = () =>
5+
ProjectWorkflow.pickNames(
6+
'Pending Consultant Endorsement -> Prep for Financial Endorsement With Consultant Endorsement',
7+
'Pending Consultant Endorsement -> Prep for Financial Endorsement Without Consultant Endorsement',
8+
);
89

910
// NOTE: There could be other permissions for this role from other policies
1011
@Policy([Role.Consultant, Role.ConsultantManager], (r) => [
@@ -44,7 +45,7 @@ export const projectTransitions = ProjectWorkflow.pickNames(
4445
r.User.read.create,
4546
r.ProjectWorkflowEvent.read.whenAll(
4647
member,
47-
r.ProjectWorkflowEvent.isTransitions(...projectTransitions),
48+
r.ProjectWorkflowEvent.isTransitions(projectTransitions),
4849
).execute,
4950
])
5051
export class ConsultantPolicy {}

src/components/authorization/policies/by-role/financial-analyst-lead.policy.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import * as FA from './financial-analyst.policy';
3636
'financialReportReceivedAt',
3737
).edit,
3838
]),
39-
r.ProjectWorkflowEvent.transitions(...FA.projectTransitions).execute,
39+
r.ProjectWorkflowEvent.transitions(FA.projectTransitions).execute,
4040
r.ProjectMember.edit.create.delete,
4141
])
4242
export class FinancialAnalystLeadPolicy {}

src/components/authorization/policies/by-role/financial-analyst.policy.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ import {
88
sensOnlyLow,
99
} from '../util';
1010

11-
export const projectTransitions = ProjectWorkflow.pickNames(
12-
'Pending Financial Endorsement -> Finalizing Proposal With Financial Endorsement',
13-
'Pending Financial Endorsement -> Finalizing Proposal Without Financial Endorsement',
14-
'Finalizing Completion -> Back To Active',
15-
'Finalizing Completion -> Completed',
16-
);
11+
export const projectTransitions = () =>
12+
ProjectWorkflow.pickNames(
13+
'Pending Financial Endorsement -> Finalizing Proposal With Financial Endorsement',
14+
'Pending Financial Endorsement -> Finalizing Proposal Without Financial Endorsement',
15+
'Finalizing Completion -> Back To Active',
16+
'Finalizing Completion -> Completed',
17+
);
1718

1819
// NOTE: There could be other permissions for this role from other policies
1920
@Policy(
@@ -71,7 +72,7 @@ export const projectTransitions = ProjectWorkflow.pickNames(
7172
r.ProjectMember.read.when(member).edit.create.delete,
7273
r.ProjectWorkflowEvent.read.whenAll(
7374
member,
74-
r.ProjectWorkflowEvent.isTransitions(...projectTransitions),
75+
r.ProjectWorkflowEvent.isTransitions(projectTransitions),
7576
).execute,
7677
r.PeriodicReport.read.when(member).edit,
7778
r.StepProgress.read,

src/components/authorization/policies/by-role/project-manager.policy.ts

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,38 +19,39 @@ const stepsUntilFinancialEndorsement = takeWhile(
1919
(s) => s !== ProjectStep.PendingFinancialEndorsement,
2020
);
2121

22-
export const projectTransitions = ProjectWorkflow.pickNames([
23-
'Early Conversations -> Pending Regional Director Approval',
24-
'Early Conversations -> Pending Concept Approval',
25-
'Early Conversations -> Did Not Develop',
26-
'Prep for Consultant Endorsement -> Pending Consultant Endorsement',
27-
'Prep for Consultant & Financial Endorsement & Finalizing Proposal -> Pending Concept Approval',
28-
'Prep for Consultant & Financial Endorsement & Finalizing Proposal -> Did Not Develop',
29-
'Pending Consultant Endorsement -> Prep for Financial Endorsement With Consultant Endorsement',
30-
'Pending Consultant Endorsement -> Prep for Financial Endorsement Without Consultant Endorsement',
31-
'Prep for Financial Endorsement -> Pending Financial Endorsement',
32-
'Prep for Financial Endorsement & Finalizing Proposal -> Pending Consultant Endorsement',
33-
'Finalizing Proposal -> Pending Regional Director Approval',
34-
'Finalizing Proposal -> Pending Financial Endorsement',
35-
'Active -> Discussing Change To Plan',
36-
'Active -> Discussing Termination',
37-
'Active -> Finalizing Completion',
38-
'Discussing Change To Plan -> Pending Change To Plan Approval',
39-
'Discussing Change To Plan -> Discussing Suspension',
40-
'Discussing Change To Plan -> Back To Active',
41-
'Pending Change To Plan Approval -> Discussing Change To Plan',
42-
'Pending Change To Plan Approval -> Pending Change To Plan Confirmation',
43-
'Pending Change To Plan Approval -> Back To Active',
44-
'Discussing Suspension -> Pending Suspension Approval',
45-
'Discussing Suspension -> Back To Active',
46-
'Suspended -> Discussing Reactivation',
47-
'Suspended & Discussing Reactivation -> Discussing Termination',
48-
'Discussing Reactivation -> Pending Reactivation Approval',
49-
'Discussing Termination -> Pending Termination Approval',
50-
'Discussing Termination -> Back To Most Recent',
51-
'Finalizing Completion -> Back To Active',
52-
'Finalizing Completion -> Completed',
53-
]);
22+
export const projectTransitions = () =>
23+
ProjectWorkflow.pickNames([
24+
'Early Conversations -> Pending Regional Director Approval',
25+
'Early Conversations -> Pending Concept Approval',
26+
'Early Conversations -> Did Not Develop',
27+
'Prep for Consultant Endorsement -> Pending Consultant Endorsement',
28+
'Prep for Consultant & Financial Endorsement & Finalizing Proposal -> Pending Concept Approval',
29+
'Prep for Consultant & Financial Endorsement & Finalizing Proposal -> Did Not Develop',
30+
'Pending Consultant Endorsement -> Prep for Financial Endorsement With Consultant Endorsement',
31+
'Pending Consultant Endorsement -> Prep for Financial Endorsement Without Consultant Endorsement',
32+
'Prep for Financial Endorsement -> Pending Financial Endorsement',
33+
'Prep for Financial Endorsement & Finalizing Proposal -> Pending Consultant Endorsement',
34+
'Finalizing Proposal -> Pending Regional Director Approval',
35+
'Finalizing Proposal -> Pending Financial Endorsement',
36+
'Active -> Discussing Change To Plan',
37+
'Active -> Discussing Termination',
38+
'Active -> Finalizing Completion',
39+
'Discussing Change To Plan -> Pending Change To Plan Approval',
40+
'Discussing Change To Plan -> Discussing Suspension',
41+
'Discussing Change To Plan -> Back To Active',
42+
'Pending Change To Plan Approval -> Discussing Change To Plan',
43+
'Pending Change To Plan Approval -> Pending Change To Plan Confirmation',
44+
'Pending Change To Plan Approval -> Back To Active',
45+
'Discussing Suspension -> Pending Suspension Approval',
46+
'Discussing Suspension -> Back To Active',
47+
'Suspended -> Discussing Reactivation',
48+
'Suspended & Discussing Reactivation -> Discussing Termination',
49+
'Discussing Reactivation -> Pending Reactivation Approval',
50+
'Discussing Termination -> Pending Termination Approval',
51+
'Discussing Termination -> Back To Most Recent',
52+
'Finalizing Completion -> Back To Active',
53+
'Finalizing Completion -> Completed',
54+
]);
5455

5556
// NOTE: There could be other permissions for this role from other policies
5657
@Policy(
@@ -129,7 +130,7 @@ export const projectTransitions = ProjectWorkflow.pickNames([
129130
).execute,
130131
r.ProjectWorkflowEvent.read.whenAll(
131132
member,
132-
r.ProjectWorkflowEvent.isTransitions(...projectTransitions),
133+
r.ProjectWorkflowEvent.isTransitions(projectTransitions),
133134
).execute,
134135
r.Project.read.create
135136
.when(member)

src/components/authorization/policies/by-role/regional-director.policy.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import * as PM from './project-manager.policy';
99
r.Project.when(member).edit.specifically(
1010
(p) => p.rootDirectory.edit.when(sensMediumOrLower).read,
1111
),
12-
r.ProjectWorkflowEvent.transitions(...PM.projectTransitions).execute,
12+
r.ProjectWorkflowEvent.transitions(PM.projectTransitions).execute,
1313
r.ProjectWorkflowEvent.read.transitions(
1414
'Early Conversations -> Pending Finance Confirmation',
1515
'Pending Concept Approval -> Prep for Consultant Endorsement',

src/components/workflow/workflow.granter.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,16 @@ export function WorkflowEventGranter<
4848
return this[action]('create');
4949
}
5050

51-
isTransitions(...transitions: Array<Many<Names>>) {
52-
return TransitionCondition.fromName(workflow(), transitions.flat());
51+
isTransitions(
52+
...transitions: Array<Many<Names> | (() => Iterable<Names>)>
53+
) {
54+
return TransitionCondition.fromName(
55+
workflow(),
56+
transitions.flatMap((t) => (typeof t === 'function' ? [...t()] : t)),
57+
);
5358
}
5459

55-
transitions(...transitions: Array<Many<Names>>) {
60+
transitions(...transitions: Array<Many<Names> | (() => Iterable<Names>)>) {
5661
return this.when(this.isTransitions(...transitions));
5762
}
5863

0 commit comments

Comments
 (0)