|
| 1 | +import { EventsHandler, ILogger, Logger, ResourceLoader } from '~/core'; |
| 2 | +import { FieldRegionUpdatedEvent } from '../../../field-region/events/field-region-updated.event'; |
| 3 | +import { ProjectMemberRepository } from '../project-member.repository'; |
| 4 | + |
| 5 | +@EventsHandler(FieldRegionUpdatedEvent) |
| 6 | +export class RegionsZoneChangesAppliesDirectorChangeToProjectMembersHandler { |
| 7 | + constructor( |
| 8 | + private readonly repo: ProjectMemberRepository, |
| 9 | + private readonly resources: ResourceLoader, |
| 10 | + @Logger('project:members') private readonly logger: ILogger, |
| 11 | + ) {} |
| 12 | + |
| 13 | + async handle(event: FieldRegionUpdatedEvent) { |
| 14 | + const oldZoneId = event.previous.fieldZone.id; |
| 15 | + const newZoneId = event.input.fieldZoneId; |
| 16 | + if (!newZoneId) { |
| 17 | + return; |
| 18 | + } |
| 19 | + const [oldZone, newZone] = await Promise.all([ |
| 20 | + this.resources.load('FieldZone', oldZoneId), |
| 21 | + this.resources.load('FieldZone', newZoneId), |
| 22 | + ]); |
| 23 | + const oldDirector = oldZone.director.value; |
| 24 | + const newDirector = newZone.director.value; |
| 25 | + if (!oldDirector || !newDirector) { |
| 26 | + // Shouldn't really happen. I think everyone can see zones & directors rn. |
| 27 | + throw new Error( |
| 28 | + 'Cannot read field zone directors to apply project membership changes', |
| 29 | + ); |
| 30 | + } |
| 31 | + |
| 32 | + const stats = await this.repo.replaceMembershipsOnOpenProjects( |
| 33 | + oldDirector.id, |
| 34 | + newDirector.id, |
| 35 | + 'FieldOperationsDirector', |
| 36 | + ); |
| 37 | + |
| 38 | + this.logger.notice( |
| 39 | + "FieldRegion's zone changed - Replaced FOD director memberships on open projects", |
| 40 | + { |
| 41 | + location: event.updated.id, |
| 42 | + oldZone: oldZoneId, |
| 43 | + newZone: newZoneId, |
| 44 | + oldDirector: oldDirector.id, |
| 45 | + newDirector: newDirector.id, |
| 46 | + ...stats, |
| 47 | + }, |
| 48 | + ); |
| 49 | + } |
| 50 | +} |
0 commit comments