Skip to content

Commit b7e5c26

Browse files
committed
Replace workflow defaultNotifiers with enhancer transition middleware
1 parent 5064322 commit b7e5c26

File tree

3 files changed

+37
-26
lines changed

3 files changed

+37
-26
lines changed

src/components/project/workflow/project-workflow.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,8 @@ import {
1212
BackToActive,
1313
ResolveParams,
1414
} from './transitions/dynamic-step';
15-
import {
16-
EmailDistro,
17-
FinancialApprovers,
18-
TeamMembers,
19-
} from './transitions/notifiers';
15+
import { ImplicitlyNotifyTeamMembers } from './transitions/enhancers';
16+
import { EmailDistro, FinancialApprovers } from './transitions/notifiers';
2017

2118
// This also controls the order shown in the UI.
2219
// Therefore, these should generally flow down.
@@ -38,7 +35,9 @@ export const ProjectWorkflow = defineWorkflow({
3835
states: Step,
3936
event: ProjectWorkflowEvent,
4037
context: defineContext<ResolveParams>,
41-
defaultNotifiers: [TeamMembers],
38+
transitionEnhancers: [
39+
ImplicitlyNotifyTeamMembers, //
40+
],
4241
})({
4342
// In Development
4443
// region
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { TransitionEnhancer } from '../../../workflow/define-workflow';
2+
import { ProjectStep as Step } from '../../dto';
3+
import { ResolveParams } from './dynamic-step';
4+
import { TeamMembers } from './notifiers';
5+
6+
type Enhancer = TransitionEnhancer<Step, ResolveParams>;
7+
8+
export const ImplicitlyNotifyTeamMembers: Enhancer = (transition) => ({
9+
...transition,
10+
notifiers: transition.notifiers.concat(TeamMembers),
11+
});

src/components/workflow/define-workflow.ts

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { many, mapValues, setOf } from '@seedcompany/common';
1+
import { entries, many, setOf } from '@seedcompany/common';
22
import * as uuid from 'uuid';
33
import {
44
EnumType,
@@ -10,7 +10,6 @@ import {
1010
ResourceShape,
1111
} from '~/common';
1212
import { WorkflowEvent } from './dto';
13-
import { TransitionNotifier } from './transitions/notifiers';
1413
import { InternalTransition, TransitionInput } from './transitions/types';
1514

1615
export const defineWorkflow =
@@ -34,33 +33,31 @@ export const defineWorkflow =
3433
*/
3534
context: () => Context;
3635
/**
37-
* Notifiers that apply to all transitions by default.
36+
* Middleware functions to adapt built transitions.
3837
*/
39-
defaultNotifiers?: ReadonlyArray<TransitionNotifier<Context>>;
38+
transitionEnhancers?: Many<TransitionEnhancer<State, Context>>;
4039
}) =>
4140
<TransitionNames extends string>(
4241
obj: Record<TransitionNames, TransitionInput<State, Context>>,
4342
) => {
44-
const transitions = mapValues(
45-
obj,
46-
(
47-
name,
48-
transition,
49-
): InternalTransition<State, TransitionNames, Context> => ({
43+
const enhancers = many(input.transitionEnhancers ?? []);
44+
45+
const transitions = entries(obj).map(([name, transition]) => {
46+
const normalized: InternalTransition<State, TransitionNames, Context> = {
5047
name,
5148
...transition,
5249
from: transition.from ? setOf(many(transition.from)) : undefined,
5350
key: (transition.key ?? uuid.v5(name, input.id)) as ID,
5451
conditions: maybeMany(transition.conditions) ?? [],
55-
notifiers: [
56-
...(input.defaultNotifiers ?? []),
57-
...(maybeMany(transition.notifiers) ?? []),
58-
],
59-
}),
60-
).asRecord as Record<
61-
TransitionNames,
62-
InternalTransition<State, TransitionNames, Context>
63-
>;
52+
notifiers: maybeMany(transition.notifiers) ?? [],
53+
};
54+
const enhanced = enhancers.reduce(
55+
(t, enhancer) => enhancer(t),
56+
normalized,
57+
);
58+
return enhanced;
59+
});
60+
6461
const workflow: Workflow<
6562
Name,
6663
Context,
@@ -71,7 +68,7 @@ export const defineWorkflow =
7168
> = {
7269
...input,
7370
id: input.id as ID,
74-
transitions: Object.values(transitions),
71+
transitions,
7572
eventResource: input.event,
7673
transitionByKey: (key: ID) => {
7774
const transition = workflow.transitions.find((t) => t.key === key);
@@ -137,3 +134,7 @@ export interface Workflow<
137134
...keys: Array<Many<Names>>
138135
) => ReadonlySet<Names>;
139136
}
137+
138+
export type TransitionEnhancer<State extends string, Context> = (
139+
transition: InternalTransition<State, any, Context>,
140+
) => InternalTransition<State, any, Context>;

0 commit comments

Comments
 (0)