Skip to content

Commit

Permalink
fix: figer l'agence meme si la structure Milo change (#1332)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mzem authored Dec 18, 2023
1 parent 5d32a54 commit 0faab1b
Show file tree
Hide file tree
Showing 3 changed files with 146 additions and 34 deletions.
53 changes: 26 additions & 27 deletions src/domain/milo/conseiller.milo.db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,19 @@ export interface ConseillerMilo {
structure: ConseillerMilo.Structure
}

export interface ConseillerMiloModifie {
id: string
idAgence?: string | null
idStructure?: string | null
dateVerificationStructureMilo?: DateTime
}

export namespace ConseillerMilo {
export type Structure = { id: string; timezone: string }

export interface Repository {
get(idConseiller: string): Promise<Result<ConseillerMilo>>
save(conseiller: {
id: string
idAgence?: string | null
idStructure?: string | null
dateVerificationStructureMilo?: DateTime
}): Promise<void>
save(conseiller: ConseillerMiloModifie): Promise<void>
structureExiste(idStructure: string): Promise<boolean>
}

Expand All @@ -62,6 +64,11 @@ export namespace ConseillerMilo {
accessToken: string
): Promise<void> {
const maintenant = this.dateService.now()
const conseillerModifie: ConseillerMiloModifie = {
id: idConseiller,
dateVerificationStructureMilo: maintenant
}

try {
const conseillerSql = await ConseillerSqlModel.findByPk(idConseiller)

Expand Down Expand Up @@ -93,14 +100,17 @@ export namespace ConseillerMilo {
await this.miloClient.getStructureConseiller(idpToken)

if (isFailure(resultStructureMiloConseiller)) {
await this.conseillerMiloRepository.save({
id: idConseiller,
dateVerificationStructureMilo: maintenant
})
await this.conseillerMiloRepository.save(conseillerModifie)
return
}

const codeStructure = resultStructureMiloConseiller.data.code
const conseillerSansAgence = !Boolean(conseillerSql.idAgence)

if (conseillerSansAgence) {
conseillerModifie.idAgence = codeStructure
}
conseillerModifie.idStructure = codeStructure

const structureModifiee =
conseillerSql.idStructureMilo !== codeStructure
Expand All @@ -114,22 +124,14 @@ export namespace ConseillerMilo {
resultStructureMiloConseiller.data
)

await this.conseillerMiloRepository.save({
id: idConseiller,
idAgence: codeStructureAjouteeOuNull,
idStructure: codeStructureAjouteeOuNull,
dateVerificationStructureMilo: maintenant
})
return
if (conseillerSansAgence) {
conseillerModifie.idAgence = codeStructureAjouteeOuNull
}
conseillerModifie.idStructure = codeStructureAjouteeOuNull
}
}

await this.conseillerMiloRepository.save({
id: idConseiller,
idAgence: codeStructure,
idStructure: codeStructure,
dateVerificationStructureMilo: maintenant
})
await this.conseillerMiloRepository.save(conseillerModifie)
}
} catch (e) {
this.logger.error(
Expand All @@ -140,10 +142,7 @@ export namespace ConseillerMilo {
)
this.apmService.captureError(e)

await this.conseillerMiloRepository.save({
id: idConseiller,
dateVerificationStructureMilo: maintenant
})
await this.conseillerMiloRepository.save(conseillerModifie)

if (e instanceof UnauthorizedException) {
throw e
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { Injectable } from '@nestjs/common'
import { DateTime } from 'luxon'
import {
ConseillerMiloSansStructure,
NonTrouveError
} from '../../../building-blocks/types/domain-error'
import { Result, failure, success } from '../../../building-blocks/types/result'
import { Conseiller } from '../../../domain/milo/conseiller'
import { ConseillerMiloModifie } from '../../../domain/milo/conseiller.milo.db'
import { ConseillerSqlModel } from '../../sequelize/models/conseiller.sql-model'
import { StructureMiloSqlModel } from '../../sequelize/models/structure-milo.sql-model'

Expand Down Expand Up @@ -34,12 +34,7 @@ export class ConseillerMiloSqlRepository implements Conseiller.Milo.Repository {
})
}

async save(conseiller: {
id: string
idAgence?: string | null
idStructure?: string | null
dateVerificationStructureMilo: DateTime
}): Promise<void> {
async save(conseiller: ConseillerMiloModifie): Promise<void> {
await ConseillerSqlModel.update(
{
idAgence: conseiller.idAgence,
Expand Down
118 changes: 118 additions & 0 deletions test/domain/milo/conseiller.milo.db.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { uneStructureConseillerMiloDto } from '../../fixtures/milo-dto.fixture'
import { unConseillerDto } from '../../fixtures/sql-models/conseiller.sql-model'
import { StubbedClass, stubClass } from '../../utils'
import { getDatabase } from '../../utils/database-for-testing'
import { AgenceSqlModel } from '../../../src/infrastructure/sequelize/models/agence.sql-model'

const maintenant = uneDatetime()

Expand Down Expand Up @@ -258,6 +259,65 @@ describe('Conseiller.Milo', () => {
conseillerMiloRepository.save
).to.have.been.calledOnceWithExactly(conseillerMiloAvecStructure)
})
it('met à jour la structure Milo quand elle existe dans le referentiel sans mettre à jour agence', async () => {
// Given
const idStructureMilo = '10'
await StructureMiloSqlModel.create({
id: idStructureMilo,
nomOfficiel: 'test',
timezone: 'Europe/Paris'
})
await AgenceSqlModel.create({
id: idStructureMilo,
codeDepartement: '92',
nomAgence: 'test',
nomRegion: 'idf',
timezone: 'Europe/Paris',
structure: 'MILO'
})
await ConseillerSqlModel.create(
unConseillerDto({
id: idConseiller,
structure: Core.Structure.MILO,
idStructureMilo,
idAgence: idStructureMilo
})
)
const token = 'tok'
const idpToken = 'idpTok'
keycloakClient.exchangeTokenConseillerMilo
.withArgs(token)
.resolves(idpToken)

const idNouvelleStructure = '11'
miloClient.getStructureConseiller
.withArgs(idpToken)
.resolves(
success(
uneStructureConseillerMiloDto({ code: idNouvelleStructure })
)
)
conseillerMiloRepository.structureExiste
.withArgs(idNouvelleStructure)
.resolves(true)

const conseillerMiloAvecStructure = {
id: idConseiller,
idStructure: idNouvelleStructure,
dateVerificationStructureMilo: maintenant
}

// When
await conseillerMiloService.recupererEtMettreAJourStructure(
idConseiller,
token
)

// Then
expect(
conseillerMiloRepository.save
).to.have.been.calledOnceWithExactly(conseillerMiloAvecStructure)
})
it('met à jour date quand date connexion valide et verification valide', async () => {
// Given
const idStructureMilo = '10'
Expand Down Expand Up @@ -445,6 +505,64 @@ describe('Conseiller.Milo', () => {
conseillerMiloRepository.save
).to.have.been.calledOnceWithExactly(conseillerMiloAvecStructure)
})
it('crée et met à jour la structure Milo du Conseiller sans mettre à jour agence', async () => {
// Given
const idStructureMilo = '10'
await StructureMiloSqlModel.create({
id: idStructureMilo,
codeDepartement: '92',
nomOfficiel: 'test',
timezone: 'Europe/Paris'
})
await AgenceSqlModel.create({
id: idStructureMilo,
codeDepartement: '92',
nomAgence: 'test',
nomRegion: 'idf',
timezone: 'Europe/Paris',
structure: 'MILO'
})
await ConseillerSqlModel.create(
unConseillerDto({
id: idConseiller,
structure: Core.Structure.MILO,
idStructureMilo,
idAgence: idStructureMilo
})
)
keycloakClient.exchangeTokenConseillerMilo
.withArgs(token)
.resolves(idpToken)

const idNouvelleStructure = '92063S00'
miloClient.getStructureConseiller
.withArgs(idpToken)
.resolves(
success(
uneStructureConseillerMiloDto({ code: idNouvelleStructure })
)
)
conseillerMiloRepository.structureExiste
.withArgs(idNouvelleStructure)
.resolves(false)

const conseillerMiloAvecStructure = {
id: idConseiller,
idStructure: idNouvelleStructure,
dateVerificationStructureMilo: maintenant
}

// When
await conseillerMiloService.recupererEtMettreAJourStructure(
idConseiller,
token
)

// Then
expect(
conseillerMiloRepository.save
).to.have.been.calledOnceWithExactly(conseillerMiloAvecStructure)
})
it('crée et met à jour la structure Milo du Conseiller pour un DOM', async () => {
// Given
const idStructureMilo = '10'
Expand Down

0 comments on commit 0faab1b

Please sign in to comment.