1
1
import { Injectable } from '@nestjs/common' ;
2
2
import {
3
3
type ID ,
4
+ InputException ,
5
+ NotFoundException ,
4
6
type ObjectView ,
5
7
ServerException ,
6
8
type UnsecuredDto ,
7
9
} from '~/common' ;
8
10
import { HandleIdLookup } from '~/core' ;
9
11
import { IEventBus } from '~/core/events' ;
10
12
import { Privileges } from '../authorization' ;
13
+ import { UserService } from '../user' ;
11
14
import {
12
15
type CreateFieldRegion ,
13
16
FieldRegion ,
@@ -23,11 +26,13 @@ export class FieldRegionService {
23
26
constructor (
24
27
private readonly privileges : Privileges ,
25
28
private readonly events : IEventBus ,
29
+ private readonly users : UserService ,
26
30
private readonly repo : FieldRegionRepository ,
27
31
) { }
28
32
29
33
async create ( input : CreateFieldRegion ) : Promise < FieldRegion > {
30
34
this . privileges . for ( FieldRegion ) . verifyCan ( 'create' ) ;
35
+ await this . validateDirectorRole ( input . directorId ) ;
31
36
const dto = await this . repo . create ( input ) ;
32
37
return this . secure ( dto ) ;
33
38
}
@@ -53,6 +58,10 @@ export class FieldRegionService {
53
58
const changes = this . repo . getActualChanges ( fieldRegion , input ) ;
54
59
this . privileges . for ( FieldRegion , fieldRegion ) . verifyChanges ( changes ) ;
55
60
61
+ if ( changes . directorId ) {
62
+ await this . validateDirectorRole ( changes . directorId ) ;
63
+ }
64
+
56
65
if ( Object . keys ( changes ) . length === 0 ) {
57
66
return this . secure ( fieldRegion ) ;
58
67
}
@@ -68,6 +77,25 @@ export class FieldRegionService {
68
77
return this . secure ( updated ) ;
69
78
}
70
79
80
+ private async validateDirectorRole ( directorId : ID < 'User' > ) {
81
+ let director ;
82
+ try {
83
+ director = await this . users . readOneUnsecured ( directorId ) ;
84
+ } catch ( e ) {
85
+ if ( e instanceof NotFoundException ) {
86
+ throw e . withField ( 'fieldRegion.directorId' ) ;
87
+ }
88
+ throw e ;
89
+ }
90
+ if ( ! director . roles . includes ( 'RegionalDirector' ) ) {
91
+ throw new InputException (
92
+ 'User does not have the Regional Director role' ,
93
+ 'fieldRegion.directorId' ,
94
+ ) ;
95
+ }
96
+ return director ;
97
+ }
98
+
71
99
async delete ( id : ID ) : Promise < void > {
72
100
const object = await this . readOne ( id ) ;
73
101
0 commit comments