Skip to content

Commit fa6108a

Browse files
committed
feat(support): faciliter la création de super superviseurs FT
1 parent 076d62e commit fa6108a

11 files changed

+139
-68
lines changed

src/application/commands/support/creer-superviseurs.command.handler.ts

+13-2
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import {
88
SuperviseursRepositoryToken
99
} from '../../../domain/superviseur'
1010
import { SupportAuthorizer } from '../../authorizers/support-authorizer'
11+
import { Core, structuresFT } from '../../../domain/core'
1112

1213
export interface CreerSuperviseursCommand extends Command {
13-
superviseurs: Superviseur[]
14+
superEmailFT?: string
15+
superviseurs?: Superviseur[]
1416
}
1517

1618
@Injectable()
@@ -27,7 +29,16 @@ export class CreerSuperviseursCommandHandler extends CommandHandler<
2729
}
2830

2931
async handle(command: CreerSuperviseursCommand): Promise<Result> {
30-
await this.superviseurRepository.saveSuperviseurs(command.superviseurs)
32+
const superviseurs: Superviseur[] = command.superEmailFT
33+
? structuresFT.concat(Core.Structure.AVENIR_PRO).map(structure => ({
34+
email: command.superEmailFT!,
35+
structure
36+
}))
37+
: command.superviseurs || []
38+
39+
if (superviseurs.length) {
40+
await this.superviseurRepository.saveSuperviseurs(superviseurs)
41+
}
3142
return emptySuccess()
3243
}
3344

src/application/commands/support/delete-superviseurs.command.handler.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
import { SupportAuthorizer } from '../../authorizers/support-authorizer'
1111

1212
export interface DeleteSuperviseursCommand extends Command {
13-
superviseurs: Superviseur[]
13+
emails: string[]
1414
}
1515

1616
@Injectable()
@@ -27,7 +27,7 @@ export class DeleteSuperviseursCommandHandler extends CommandHandler<
2727
}
2828

2929
async handle(command: DeleteSuperviseursCommand): Promise<Result<void>> {
30-
await this.superviseurRepository.deleteSuperviseurs(command.superviseurs)
30+
await this.superviseurRepository.deleteSuperviseurs(command.emails)
3131
return emptySuccess()
3232
}
3333

src/domain/superviseur.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ export interface Superviseur {
1111
export namespace Superviseur {
1212
export interface Repository {
1313
saveSuperviseurs(superviseurs: Superviseur[]): Promise<Result>
14-
deleteSuperviseurs(superviseurs: Superviseur[]): Promise<Result>
14+
deleteSuperviseurs(emails: string[]): Promise<Result>
1515
}
1616
}

src/infrastructure/repositories/superviseur-sql.repository.db.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,12 @@ export class SuperviseurSqlRepository implements Superviseur.Repository {
1717
return emptySuccess()
1818
}
1919

20-
async deleteSuperviseurs(superviseurs: Superviseur[]): Promise<Result> {
20+
async deleteSuperviseurs(emails: string[]): Promise<Result> {
2121
await Promise.all(
22-
superviseurs.map(superviseur =>
22+
emails.map(email =>
2323
SuperviseurSqlModel.destroy({
2424
where: {
25-
email: superviseur.email.toLocaleLowerCase(),
26-
structure: superviseur.structure
25+
email: email.toLocaleLowerCase()
2726
}
2827
})
2928
)

src/infrastructure/routes/support.controller.ts

+14-10
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ import {
1818
ApiSecurity,
1919
ApiTags
2020
} from '@nestjs/swagger'
21+
import {
22+
RefreshJddCommand,
23+
RefreshJddCommandHandler
24+
} from '../../application/commands/support//refresh-jdd.command.handler'
25+
import { ArchiverJeuneSupportCommandHandler } from '../../application/commands/support/archiver-jeune-support.command.handler'
2126
import { CreerSuperviseursCommandHandler } from '../../application/commands/support/creer-superviseurs.command.handler'
2227
import { DeleteSuperviseursCommandHandler } from '../../application/commands/support/delete-superviseurs.command.handler'
2328
import {
2429
MettreAJourLesJeunesCEJPoleEmploiCommand,
2530
MettreAJourLesJeunesCejPeCommandHandler
2631
} from '../../application/commands/support/mettre-a-jour-les-jeunes-cej-pe.command.handler'
27-
import {
28-
RefreshJddCommand,
29-
RefreshJddCommandHandler
30-
} from '../../application/commands/support//refresh-jdd.command.handler'
31-
import { ArchiverJeuneSupportCommandHandler } from '../../application/commands/support/archiver-jeune-support.command.handler'
3232
import {
3333
ChangementAgenceQueryModel,
3434
UpdateAgenceConseillerCommandHandler
@@ -38,9 +38,10 @@ import { Authentification } from '../../domain/authentification'
3838
import { ApiKeyAuthGuard } from '../auth/api-key.auth-guard'
3939
import { SkipOidcAuth } from '../decorators/skip-oidc-auth.decorator'
4040
import { handleResult } from './result.handler'
41-
import { SuperviseursPayload } from './validation/conseillers.inputs'
4241
import {
4342
ChangerAgenceConseillerPayload,
43+
CreateSuperviseursPayload,
44+
DeleteSuperviseursPayload,
4445
RefreshJDDPayload,
4546
TeleverserCsvPayload,
4647
TransfererJeunesPayload
@@ -191,10 +192,13 @@ export class SupportController {
191192
})
192193
@Post('superviseurs')
193194
async postSuperviseurs(
194-
@Body() superviseursPayload: SuperviseursPayload
195+
@Body() superviseursPayload: CreateSuperviseursPayload
195196
): Promise<void> {
196197
const result = await this.creerSuperviseursCommandHandler.execute(
197-
{ superviseurs: superviseursPayload.superviseurs },
198+
{
199+
superviseurs: superviseursPayload.superviseurs,
200+
superEmailFT: superviseursPayload.superEmailFT
201+
},
198202
Authentification.unUtilisateurSupport()
199203
)
200204

@@ -212,10 +216,10 @@ export class SupportController {
212216
@Delete('superviseurs')
213217
@HttpCode(HttpStatus.NO_CONTENT)
214218
async deleteSuperviseurs(
215-
@Body() superviseursPayload: SuperviseursPayload
219+
@Body() superviseursPayload: DeleteSuperviseursPayload
216220
): Promise<void> {
217221
const result = await this.deleteSuperviseursCommandHandler.execute(
218-
{ superviseurs: superviseursPayload.superviseurs },
222+
{ emails: superviseursPayload.emails },
219223
Authentification.unUtilisateurSupport()
220224
)
221225

src/infrastructure/routes/validation/conseillers.inputs.ts

+1-27
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ import { TriRendezVous } from 'src/application/queries/rendez-vous/get-rendez-vo
2424
import { Action } from 'src/domain/action/action'
2525
import { Core } from 'src/domain/core'
2626
import { AgenceInput } from 'src/infrastructure/routes/validation/agences.inputs'
27+
import { Jeune } from '../../../domain/jeune/jeune'
2728
import {
2829
transformStringToArray,
2930
transformStringToBoolean
3031
} from './utils/transformers'
31-
import { Jeune } from '../../../domain/jeune/jeune'
3232

3333
export class GetConseillersQueryParams {
3434
@ApiProperty()
@@ -117,32 +117,6 @@ export class EnvoyerNotificationsPayload {
117117
idsJeunes: string[]
118118
}
119119

120-
class Superviseur {
121-
@ApiProperty()
122-
@IsString()
123-
@IsEmail()
124-
@IsNotEmpty()
125-
email: string
126-
127-
@ApiProperty({
128-
enum: Core.Structure,
129-
example: Object.values(Core.Structure).join(' | ')
130-
})
131-
@IsString()
132-
@IsNotEmpty()
133-
@IsEnum(Core.Structure)
134-
structure: Core.Structure
135-
}
136-
137-
export class SuperviseursPayload {
138-
@ApiProperty({ type: Superviseur, isArray: true })
139-
@IsArray()
140-
@ArrayNotEmpty()
141-
@ValidateNested({ each: true })
142-
@Type(() => Superviseur)
143-
superviseurs: Superviseur[]
144-
}
145-
146120
export class GetRendezVousConseillerQueryParams {
147121
@ApiPropertyOptional()
148122
@IsOptional()

src/infrastructure/routes/validation/support.inputs.ts

+50-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1-
import { ApiProperty } from '@nestjs/swagger'
1+
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'
2+
import { Type } from 'class-transformer'
23
import {
34
ArrayNotEmpty,
45
IsArray,
56
IsBoolean,
7+
IsEmail,
8+
IsEnum,
9+
IsNotEmpty,
10+
IsOptional,
611
IsString,
7-
ValidateIf
12+
ValidateIf,
13+
ValidateNested
814
} from 'class-validator'
15+
import { Core } from '../../../domain/core'
916

1017
export class TeleverserCsvPayload {
1118
@ApiProperty({ type: 'string', format: 'binary' })
@@ -47,3 +54,44 @@ export class TransfererJeunesPayload {
4754
@ArrayNotEmpty()
4855
idsJeunes: string[]
4956
}
57+
58+
class Superviseur {
59+
@ApiProperty()
60+
@IsString()
61+
@IsEmail()
62+
@IsNotEmpty()
63+
email: string
64+
65+
@ApiProperty({
66+
enum: Core.Structure,
67+
example: Object.values(Core.Structure).join(' | ')
68+
})
69+
@IsString()
70+
@IsNotEmpty()
71+
@IsEnum(Core.Structure)
72+
structure: Core.Structure
73+
}
74+
75+
export class CreateSuperviseursPayload {
76+
@ApiPropertyOptional()
77+
@IsOptional()
78+
@IsString()
79+
@IsEmail()
80+
superEmailFT?: string
81+
82+
@ApiPropertyOptional({ type: Superviseur, isArray: true })
83+
@IsOptional()
84+
@IsArray()
85+
@ArrayNotEmpty()
86+
@ValidateNested({ each: true })
87+
@Type(() => Superviseur)
88+
superviseurs?: Superviseur[]
89+
}
90+
91+
export class DeleteSuperviseursPayload {
92+
@ApiProperty({ type: String, isArray: true })
93+
@IsArray()
94+
@ArrayNotEmpty()
95+
@IsEmail({}, { each: true })
96+
emails: string[]
97+
}

test/application/commands/support/creer-superviseurs.command.handler.test.ts

+36
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,41 @@ describe('CreerSuperviseursCommandHandler', () => {
4949
expect(result._isSuccess).to.equal(true)
5050
})
5151
})
52+
describe('quand on veut enregistrer un superEmailFT', () => {
53+
it('retourne un succes', async () => {
54+
// Given
55+
const command: CreerSuperviseursCommand = {
56+
superEmailFT: 'test@ft'
57+
}
58+
59+
superviseurRepository.saveSuperviseurs.resolves(emptySuccess())
60+
61+
// When
62+
const result = await creerSuperviseursCommandHandler.handle(command)
63+
64+
// Then
65+
expect(
66+
superviseurRepository.saveSuperviseurs
67+
).to.have.been.calledOnceWithExactly([
68+
{ email: 'test@ft', structure: Core.Structure.POLE_EMPLOI },
69+
{ email: 'test@ft', structure: Core.Structure.POLE_EMPLOI_BRSA },
70+
{ email: 'test@ft', structure: Core.Structure.POLE_EMPLOI_AIJ },
71+
{
72+
email: 'test@ft',
73+
structure: Core.Structure.FT_ACCOMPAGNEMENT_INTENSIF
74+
},
75+
{
76+
email: 'test@ft',
77+
structure: Core.Structure.FT_ACCOMPAGNEMENT_GLOBAL
78+
},
79+
{
80+
email: 'test@ft',
81+
structure: Core.Structure.FT_EQUIP_EMPLOI_RECRUT
82+
},
83+
{ email: 'test@ft', structure: Core.Structure.AVENIR_PRO }
84+
])
85+
expect(result._isSuccess).to.equal(true)
86+
})
87+
})
5288
})
5389
})

test/application/commands/support/delete-superviseurs.command.handler.test.ts

+5-9
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
} from 'src/application/commands/support/delete-superviseurs.command.handler'
88
import { Superviseur } from 'src/domain/superviseur'
99
import { emptySuccess } from '../../../../src/building-blocks/types/result'
10-
import { Core } from '../../../../src/domain/core'
1110
import { createSandbox, expect, StubbedClass, stubClass } from '../../../utils'
1211

1312
describe('DeleteSuperviseursCommandHandler', () => {
@@ -31,21 +30,18 @@ describe('DeleteSuperviseursCommandHandler', () => {
3130
it('retourne un succes', async () => {
3231
// Given
3332
const command: DeleteSuperviseursCommand = {
34-
superviseurs: [
35-
{ email: 'test', structure: Core.Structure.MILO },
36-
{ email: 'test2', structure: Core.Structure.MILO }
37-
]
33+
emails: ['test', 'test2']
3834
}
3935

40-
superviseurRepository.deleteSuperviseurs
41-
.withArgs(command.superviseurs)
42-
.resolves(emptySuccess())
36+
superviseurRepository.deleteSuperviseurs.resolves(emptySuccess())
4337

4438
// When
4539
const result = await deleteSuperviseursCommandHandler.handle(command)
4640

4741
// Then
48-
expect(superviseurRepository.deleteSuperviseurs).to.have.callCount(1)
42+
expect(
43+
superviseurRepository.deleteSuperviseurs
44+
).to.have.been.calledOnceWithExactly(command.emails)
4945
expect(result._isSuccess).to.equal(true)
5046
})
5147
})

test/infrastructure/repositories/superviseur-sql.repository.db.test.ts

+7-6
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,16 @@ describe('SuperviseurSqlRepository', () => {
9494
it('on ne fait rien', async () => {
9595
// When
9696
const result = await superviseurSqlRepository.deleteSuperviseurs([
97-
unSuperviseur1,
98-
unSuperviseur2
97+
unSuperviseur1.email,
98+
unSuperviseur2.email
9999
])
100100

101101
// Then
102-
await SuperviseurSqlModel.findAll({
102+
const superviseurs = await SuperviseurSqlModel.findAll({
103103
raw: true
104104
})
105105

106+
expect(superviseurs.length).to.equal(0)
106107
expect(result._isSuccess).to.equal(true)
107108
})
108109
})
@@ -117,8 +118,8 @@ describe('SuperviseurSqlRepository', () => {
117118

118119
// When
119120
const result = await superviseurSqlRepository.deleteSuperviseurs([
120-
unSuperviseur1,
121-
unSuperviseur2
121+
unSuperviseur1.email,
122+
unSuperviseur2.email
122123
])
123124

124125
// Then
@@ -149,7 +150,7 @@ describe('SuperviseurSqlRepository', () => {
149150

150151
// When
151152
const result = await superviseurSqlRepository.deleteSuperviseurs([
152-
unSuperviseurUppercase
153+
unSuperviseurUppercase.email
153154
])
154155

155156
// Then

test/infrastructure/routes/support.controller.test.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ import {
55
CreerSuperviseursCommand,
66
CreerSuperviseursCommandHandler
77
} from '../../../src/application/commands/support/creer-superviseurs.command.handler'
8-
import { DeleteSuperviseursCommandHandler } from '../../../src/application/commands/support/delete-superviseurs.command.handler'
8+
import {
9+
DeleteSuperviseursCommand,
10+
DeleteSuperviseursCommandHandler
11+
} from '../../../src/application/commands/support/delete-superviseurs.command.handler'
912
import { UpdateAgenceConseillerCommandHandler } from '../../../src/application/commands/support/update-agence-conseiller.command.handler'
1013
import {
1114
TransfererJeunesConseillerCommand,
@@ -219,6 +222,7 @@ describe('SupportController', () => {
219222
it('renvoie 201', async () => {
220223
// Given
221224
const command: CreerSuperviseursCommand = {
225+
superEmailFT: undefined,
222226
superviseurs: [
223227
{ email: '[email protected]', structure: Core.Structure.MILO }
224228
]
@@ -270,10 +274,8 @@ describe('SupportController', () => {
270274
describe('quand le payload est valide', () => {
271275
it('renvoie 201', async () => {
272276
// Given
273-
const command: CreerSuperviseursCommand = {
274-
superviseurs: [
275-
{ email: '[email protected]', structure: Core.Structure.MILO }
276-
]
277+
const command: DeleteSuperviseursCommand = {
278+
emails: ['[email protected]']
277279
}
278280

279281
deleteSuperviseursCommandHandler.execute

0 commit comments

Comments
 (0)