Skip to content

Commit 78513ce

Browse files
committed
Add hooks for user & field region/zone updates
1 parent a01637e commit 78513ce

File tree

6 files changed

+73
-10
lines changed

6 files changed

+73
-10
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { type UnsecuredDto } from '~/common';
2+
import { type FieldRegion, type UpdateFieldRegion } from '../dto';
3+
4+
export class FieldRegionUpdatedEvent {
5+
constructor(
6+
readonly updated: UnsecuredDto<FieldRegion>,
7+
readonly previous: UnsecuredDto<FieldRegion>,
8+
readonly input: UpdateFieldRegion,
9+
) {}
10+
}

src/components/field-region/field-region.service.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
type UnsecuredDto,
77
} from '~/common';
88
import { HandleIdLookup } from '~/core';
9+
import { IEventBus } from '~/core/events';
910
import { Privileges } from '../authorization';
1011
import {
1112
type CreateFieldRegion,
@@ -14,12 +15,14 @@ import {
1415
type FieldRegionListOutput,
1516
type UpdateFieldRegion,
1617
} from './dto';
18+
import { FieldRegionUpdatedEvent } from './events/field-region-updated.event';
1719
import { FieldRegionRepository } from './field-region.repository';
1820

1921
@Injectable()
2022
export class FieldRegionService {
2123
constructor(
2224
private readonly privileges: Privileges,
25+
private readonly events: IEventBus,
2326
private readonly repo: FieldRegionRepository,
2427
) {}
2528

@@ -50,7 +53,18 @@ export class FieldRegionService {
5053
const changes = this.repo.getActualChanges(fieldRegion, input);
5154
this.privileges.for(FieldRegion, fieldRegion).verifyChanges(changes);
5255

56+
if (Object.keys(changes).length === 0) {
57+
return this.secure(fieldRegion);
58+
}
59+
5360
const updated = await this.repo.update({ id: input.id, ...changes });
61+
62+
const event = new FieldRegionUpdatedEvent(fieldRegion, updated, {
63+
id: input.id,
64+
...changes,
65+
});
66+
await this.events.publish(event);
67+
5468
return this.secure(updated);
5569
}
5670

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { type UnsecuredDto } from '~/common';
2+
import { type FieldZone, type UpdateFieldZone } from '../dto';
3+
4+
export class FieldZoneUpdatedEvent {
5+
constructor(
6+
readonly updated: UnsecuredDto<FieldZone>,
7+
readonly previous: UnsecuredDto<FieldZone>,
8+
readonly input: UpdateFieldZone,
9+
) {}
10+
}

src/components/field-zone/field-zone.service.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
type UnsecuredDto,
77
} from '~/common';
88
import { HandleIdLookup } from '~/core';
9+
import { IEventBus } from '~/core/events';
910
import { Privileges } from '../authorization';
1011
import {
1112
type CreateFieldZone,
@@ -14,12 +15,14 @@ import {
1415
type FieldZoneListOutput,
1516
type UpdateFieldZone,
1617
} from './dto';
18+
import { FieldZoneUpdatedEvent } from './events/field-zone-updated.event';
1719
import { FieldZoneRepository } from './field-zone.repository';
1820

1921
@Injectable()
2022
export class FieldZoneService {
2123
constructor(
2224
private readonly privileges: Privileges,
25+
private readonly events: IEventBus,
2326
private readonly repo: FieldZoneRepository,
2427
) {}
2528

@@ -50,7 +53,18 @@ export class FieldZoneService {
5053
const changes = this.repo.getActualChanges(fieldZone, input);
5154
this.privileges.for(FieldZone, fieldZone).verifyChanges(changes);
5255

56+
if (Object.keys(changes).length === 0) {
57+
return this.secure(fieldZone);
58+
}
59+
5360
const updated = await this.repo.update({ id: input.id, ...changes });
61+
62+
const event = new FieldZoneUpdatedEvent(fieldZone, updated, {
63+
id: input.id,
64+
...changes,
65+
});
66+
await this.events.publish(event);
67+
5468
return this.secure(updated);
5569
}
5670

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { type UnsecuredDto } from '~/common';
2+
import { type UpdateUser, type User } from '../dto';
3+
4+
export class UserUpdatedEvent {
5+
constructor(
6+
readonly updated: UnsecuredDto<User>,
7+
readonly previous: UnsecuredDto<User>,
8+
readonly input: UpdateUser,
9+
) {}
10+
}

src/components/user/user.service.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
import { HandleIdLookup, ILogger, Logger } from '~/core';
1212
import { Identity } from '~/core/authentication';
1313
import { Transactional } from '~/core/database';
14-
import { property } from '~/core/database/query';
14+
import { IEventBus } from '~/core/events';
1515
import { Privileges } from '../authorization';
1616
import { AssignableRoles } from '../authorization/dto/assignable-roles.dto';
1717
import { LocationService } from '../location';
@@ -42,6 +42,7 @@ import {
4242
type EducationListInput,
4343
type SecuredEducationList,
4444
} from './education/dto';
45+
import { UserUpdatedEvent } from './events/user-updated.event';
4546
import { KnownLanguageRepository } from './known-language.repository';
4647
import { UnavailabilityService } from './unavailability';
4748
import {
@@ -62,16 +63,11 @@ export class UserService {
6263
private readonly locationService: LocationService,
6364
private readonly knownLanguages: KnownLanguageRepository,
6465
private readonly identity: Identity,
66+
private readonly events: IEventBus,
6567
private readonly userRepo: UserRepository,
6668
@Logger('user:service') private readonly logger: ILogger,
6769
) {}
6870

69-
roleProperties = (roles?: Role[]) => {
70-
return (roles || []).flatMap((role) =>
71-
property('roles', role, 'user', `role${role}`),
72-
);
73-
};
74-
7571
async create(input: CreatePerson): Promise<ID> {
7672
if (
7773
input.roles &&
@@ -117,20 +113,29 @@ export class UserService {
117113
@Transactional()
118114
async update(input: UpdateUser): Promise<User> {
119115
this.logger.debug('mutation update User', { input });
120-
const user = await this.readOne(input.id);
116+
const user = await this.userRepo.readOne(input.id);
121117

122118
const changes = this.userRepo.getActualChanges(user, input);
123119

124120
this.privileges.for(User, user).verifyChanges(changes);
125121

122+
if (Object.keys(changes).length === 0) {
123+
return this.secure(user);
124+
}
125+
126126
if (changes.roles) {
127127
this.verifyRolesAreAssignable(changes.roles);
128128
}
129129

130-
const updated = await this.userRepo.update({
130+
input = {
131131
id: user.id,
132132
...changes,
133-
});
133+
};
134+
const updated = await this.userRepo.update(input);
135+
136+
const event = new UserUpdatedEvent(user, updated, input);
137+
await this.events.publish(event);
138+
134139
return this.secure(updated);
135140
}
136141

0 commit comments

Comments
 (0)