Skip to content

Commit a89b623

Browse files
author
Andre Turner
committed
Engagement resolvers and workflow event loader
1 parent cf58417 commit a89b623

File tree

4 files changed

+93
-7
lines changed

4 files changed

+93
-7
lines changed

src/components/engagement/engagement-status.resolver.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
import { Parent, ResolveField, Resolver } from '@nestjs/graphql';
22
import { stripIndent } from 'common-tags';
33
import { AnonSession, ParentIdMiddlewareAdditions, Session } from '~/common';
4-
import { ResourceLoader } from '~/core';
4+
import { Loader, LoaderOf, ResourceLoader } from '~/core';
55
import { EngagementStatusTransition, SecuredEngagementStatus } from './dto';
6-
//import { EngagementRules } from './engagement.rules';
6+
import { EngagementLoader } from './engagement.loader';
77
import { EngagementWorkflowService } from './workflow/engagement-workflow.service';
88

99
@Resolver(SecuredEngagementStatus)
1010
export class EngagementStatusResolver {
1111
constructor(
1212
private readonly resources: ResourceLoader,
13-
//private readonly engagementRules: EngagementRules,
1413
private readonly engagementWorkflowService: EngagementWorkflowService,
1514
) {}
1615

@@ -20,20 +19,19 @@ export class EngagementStatusResolver {
2019
async transitions(
2120
@Parent()
2221
status: SecuredEngagementStatus & ParentIdMiddlewareAdditions,
22+
@Loader(EngagementLoader) engagements: LoaderOf<EngagementLoader>,
2323
@AnonSession() session: Session,
2424
): Promise<EngagementStatusTransition[]> {
2525
if (!status.canRead || !status.canEdit || !status.value) {
2626
return [];
2727
}
28-
const { EngagementLoader } = await import('./engagement.loader');
29-
const engagements = await this.resources.getLoader(EngagementLoader);
3028
const loaderKey = {
3129
id: status.parentId,
3230
view: { active: true },
3331
} as const;
34-
const previous = await engagements.load(loaderKey);
32+
const engagement = await engagements.load(loaderKey);
3533
return await this.engagementWorkflowService.getAvailableTransitions(
36-
previous,
34+
engagement,
3735
session,
3836
);
3937
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { ID } from '~/common';
2+
import { LoaderFactory, SessionAwareLoaderStrategy } from '~/core';
3+
import { EngagementWorkflowEvent as WorkflowEvent } from './dto';
4+
import { EngagementWorkflowService } from './engagement-workflow.service';
5+
6+
@LoaderFactory(() => WorkflowEvent)
7+
export class EngagementWorkflowEventLoader extends SessionAwareLoaderStrategy<WorkflowEvent> {
8+
constructor(private readonly service: EngagementWorkflowService) {
9+
super();
10+
}
11+
12+
async loadMany(ids: readonly ID[]) {
13+
return await this.service.readMany(ids, this.session);
14+
}
15+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { Parent, Query, ResolveField, Resolver } from '@nestjs/graphql';
2+
import { Loader, LoaderOf } from '@seedcompany/data-loader';
3+
import { stripIndent } from 'common-tags';
4+
import {
5+
AnonSession,
6+
ParentIdMiddlewareAdditions,
7+
Session,
8+
viewOfChangeset,
9+
} from '~/common';
10+
import { SerializedWorkflow } from '../../../workflow/dto';
11+
import { SecuredEngagementStatus } from '../../dto';
12+
import { EngagementLoader } from '../../engagement.loader';
13+
import { EngagementWorkflowTransition } from '../dto';
14+
import { EngagementWorkflowService } from '../engagement-workflow.service';
15+
16+
@Resolver(SecuredEngagementStatus)
17+
export class EngagementTransitionsResolver {
18+
constructor(private readonly workflow: EngagementWorkflowService) {}
19+
20+
@Query(() => SerializedWorkflow)
21+
async engagementWorkflow() {
22+
return this.workflow.serialize();
23+
}
24+
25+
@ResolveField(() => [EngagementWorkflowTransition], {
26+
description:
27+
'The transitions currently available to execute for this engagement',
28+
})
29+
async transitions(
30+
@Parent() status: SecuredEngagementStatus & ParentIdMiddlewareAdditions,
31+
@Loader(EngagementLoader) engagements: LoaderOf<EngagementLoader>,
32+
@AnonSession() session: Session,
33+
): Promise<readonly EngagementWorkflowTransition[]> {
34+
if (!status.canRead || !status.value) {
35+
return [];
36+
}
37+
const engagement = await engagements.load({
38+
id: status.parentId,
39+
view: viewOfChangeset(status.changeset),
40+
});
41+
return await this.workflow.getAvailableTransitions(engagement, session);
42+
}
43+
44+
@ResolveField(() => Boolean, {
45+
description: stripIndent`
46+
Is the current user allowed to bypass transitions entirely
47+
and change to any other state?
48+
`,
49+
})
50+
async canBypassTransitions(
51+
@AnonSession() session: Session,
52+
): Promise<boolean> {
53+
return this.workflow.canBypass(session);
54+
}
55+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Parent, ResolveField, Resolver } from '@nestjs/graphql';
2+
import { AnonSession, Session } from '~/common';
3+
import { Engagement, IEngagement } from '../../dto';
4+
import { EngagementWorkflowEvent as WorkflowEvent } from '../dto';
5+
import { EngagementWorkflowService } from '../engagement-workflow.service';
6+
7+
@Resolver(IEngagement)
8+
export class EngagementWorkflowEventsResolver {
9+
constructor(private readonly service: EngagementWorkflowService) {}
10+
11+
@ResolveField(() => [WorkflowEvent])
12+
async workflowEvents(
13+
@Parent() engagement: Engagement,
14+
@AnonSession() session: Session,
15+
): Promise<readonly WorkflowEvent[]> {
16+
return await this.service.list(engagement, session);
17+
}
18+
}

0 commit comments

Comments
 (0)