Skip to content

Commit 26794e9

Browse files
authored
Add labels to conflicting partnership date range errors (#3405)
1 parent c4db4ba commit 26794e9

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

src/common/exceptions/date-override-conflict.exception.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,5 @@ export class DateOverrideConflictException extends RangeException {
7070
}
7171
}
7272

73-
const asNonEmpty = <T>(items: readonly T[]) =>
73+
export const asNonEmpty = <T>(items: readonly T[]) =>
7474
items.length === 0 ? undefined : (items as NonEmptyArray<T>);

src/components/partnership/handlers/validate-partnership-date-overrides-on-project-change.handler.ts

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1-
import { DateOverrideConflictException } from '~/common';
2-
import { EventsHandler, IEventHandler } from '~/core';
1+
import { mapEntries } from '@seedcompany/common';
2+
import { asNonEmpty, DateOverrideConflictException } from '~/common';
3+
import { EventsHandler, IEventHandler, ResourceLoader } from '~/core';
4+
import { OrganizationLoader } from '../../organization';
35
import { ProjectUpdatedEvent } from '../../project/events';
46
import { PartnershipService } from '../partnership.service';
57

68
@EventsHandler(ProjectUpdatedEvent)
79
export class ValidatePartnershipDateOverridesOnProjectChangeHandler
810
implements IEventHandler<ProjectUpdatedEvent>
911
{
10-
constructor(private readonly partnerships: PartnershipService) {}
12+
constructor(
13+
private readonly partnerships: PartnershipService,
14+
private readonly resources: ResourceLoader,
15+
) {}
1116

1217
async handle(event: ProjectUpdatedEvent) {
1318
const { updated: project, changes, session } = event;
@@ -26,12 +31,31 @@ export class ValidatePartnershipDateOverridesOnProjectChangeHandler
2631
partnerships.map((partnership) => ({
2732
__typename: 'Partnership',
2833
id: partnership.id,
29-
label: partnership.id, // TODO
34+
label: partnership.id,
3035
start: partnership.mouStartOverride,
3136
end: partnership.mouEndOverride,
3237
})),
3338
);
3439
if (!conflicts) return;
40+
const orgLoader = await this.resources.getLoader(OrganizationLoader);
41+
const partnershipToOrg = mapEntries(partnerships, (p) => [
42+
p.id,
43+
p.organization.id,
44+
]).asRecord;
45+
const orgs = await orgLoader.loadMany(
46+
conflicts.map((conflict) => partnershipToOrg[conflict.id]),
47+
);
48+
const conflictsWithLabels = conflicts.map((conflict, index) => {
49+
const org = orgs[index];
50+
if (org instanceof Error) {
51+
// Shouldn't happen
52+
return conflict;
53+
}
54+
return {
55+
...conflict,
56+
label: org.name.value ?? conflict.id,
57+
};
58+
});
3559
throw new DateOverrideConflictException(
3660
{
3761
__typename: event.resource.name,
@@ -40,7 +64,7 @@ export class ValidatePartnershipDateOverridesOnProjectChangeHandler
4064
},
4165
canonical,
4266
['A partnership', 'Some partnerships'],
43-
conflicts,
67+
asNonEmpty(conflictsWithLabels)!,
4468
);
4569
}
4670
}

0 commit comments

Comments
 (0)