-
Notifications
You must be signed in to change notification settings - Fork 54
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
✨ api: removing all centers habilitations except for CLEA
- Loading branch information
Showing
6 changed files
with
211 additions
and
0 deletions.
There are no files selected for viewing
52 changes: 52 additions & 0 deletions
52
api/scripts/certification/next-gen/remove-not-clea-centers-habilitations.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
import 'dotenv/config'; | ||
|
||
import * as url from 'node:url'; | ||
|
||
import { disconnect as disconnectFromDb } from '../../../db/knex-database-connection.js'; | ||
import { DomainTransaction } from '../../../lib/infrastructure/DomainTransaction.js'; | ||
import { usecases } from '../../../src/certification/configuration/domain/usecases/index.js'; | ||
import { logger } from '../../../src/shared/infrastructure/utils/logger.js'; | ||
|
||
const modulePath = url.fileURLToPath(import.meta.url); | ||
const isLaunchedFromCommandLine = process.argv[1] === modulePath; | ||
|
||
/** | ||
* Usage: DRY_RUN=true node scripts/certification/next-gen/remove-not-clea-centers-habilitations.js | ||
* @param {Object} params | ||
* @param {boolean} params.[isDryRun] - default true | ||
**/ | ||
async function main({ isDryRun = true }) { | ||
logger.info(`Removing centers habilitations that are not CLEA...`); | ||
|
||
await DomainTransaction.execute(async () => { | ||
const numberOfHabiliationsRemoved = await usecases.removeCentersHabilitationsExceptCLEA(); | ||
|
||
if (isDryRun) { | ||
const transaction = DomainTransaction.getConnection(); | ||
logger.warn(`DRY RUN: Habilitations removal estimated to ${numberOfHabiliationsRemoved} !`); | ||
await transaction.rollback(); | ||
return; | ||
} | ||
|
||
logger.info(`Habilitations removal is successfull for ${numberOfHabiliationsRemoved} !`); | ||
}); | ||
} | ||
|
||
(async () => { | ||
if (isLaunchedFromCommandLine) { | ||
let exitCode = 0; | ||
try { | ||
const isDryRun = process.env.DRY_RUN === 'true'; | ||
await main({ isDryRun }); | ||
} catch (error) { | ||
logger.error(error); | ||
exitCode = 1; | ||
} finally { | ||
await disconnectFromDb(); | ||
// eslint-disable-next-line n/no-process-exit | ||
process.exit(exitCode); | ||
} | ||
} | ||
})(); | ||
|
||
export { main }; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
20 changes: 20 additions & 0 deletions
20
...rc/certification/configuration/domain/usecases/remove-center-habilitations-except-clea.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
/** | ||
* @typedef {import ('./index.js').HabilitationRepository} HabilitationRepository | ||
*/ | ||
import { ComplementaryCertificationKeys } from '../../../shared/domain/models/ComplementaryCertificationKeys.js'; | ||
|
||
/** | ||
* @param {Object} params | ||
* @param {HabilitationRepository} params.habilitationRepository | ||
* @returns {Promise<number>} number of centers impacted | ||
*/ | ||
export const removeCentersHabilitationsExceptCLEA = async ({ habilitationRepository } = {}) => { | ||
return habilitationRepository.deleteAllByComplementaryKey({ | ||
keys: [ | ||
ComplementaryCertificationKeys.PIX_PLUS_DROIT, | ||
ComplementaryCertificationKeys.PIX_PLUS_EDU_1ER_DEGRE, | ||
ComplementaryCertificationKeys.PIX_PLUS_EDU_2ND_DEGRE, | ||
ComplementaryCertificationKeys.PIX_PLUS_PRO_SANTE, | ||
], | ||
}); | ||
}; |
15 changes: 15 additions & 0 deletions
15
api/src/certification/configuration/infrastructure/repositories/habilitation-repository.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
import { DomainTransaction } from '../../../../shared/domain/DomainTransaction.js'; | ||
|
||
/** | ||
* @param {Object} params | ||
* @param {number} params.[keys] - complementary certification key | ||
* @returns {Promise<number>} - number of rows affected | ||
*/ | ||
export const deleteAllByComplementaryKey = async function ({ keys } = {}) { | ||
const knexConn = DomainTransaction.getConnection(); | ||
return knexConn('complementary-certification-habilitations') | ||
.whereIn('complementaryCertificationId', async (builder) => { | ||
return builder.from('complementary-certifications').select('id').whereIn('key', keys); | ||
}) | ||
.delete(); | ||
}; |
38 changes: 38 additions & 0 deletions
38
...ion/configuration/integration/infrastructure/repositories/habilitation-repository_test.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
import * as habilitationRepository from '../../../../../../src/certification/configuration/infrastructure/repositories/habilitation-repository.js'; | ||
import { ComplementaryCertificationKeys } from '../../../../../../src/certification/shared/domain/models/ComplementaryCertificationKeys.js'; | ||
import { databaseBuilder, expect } from '../../../../../test-helper.js'; | ||
|
||
describe('Certification | Configuration | Integration | Repository | habilitation-repository', function () { | ||
describe('deleteAllByComplementaryKey', function () { | ||
it('should delete habilittion', async function () { | ||
// given | ||
const clea = databaseBuilder.factory.buildComplementaryCertification({ | ||
key: ComplementaryCertificationKeys.CLEA, | ||
}); | ||
const aRandomComplementary = databaseBuilder.factory.buildComplementaryCertification({ | ||
key: ComplementaryCertificationKeys.PIX_PLUS_DROIT, | ||
}); | ||
|
||
const center = databaseBuilder.factory.buildCertificationCenter(); | ||
const anotherCenter = databaseBuilder.factory.buildCertificationCenter(); | ||
|
||
databaseBuilder.factory.buildComplementaryCertificationHabilitation({ | ||
certificationCenterId: center.id, | ||
complementaryCertificationId: clea.id, | ||
}); | ||
databaseBuilder.factory.buildComplementaryCertificationHabilitation({ | ||
certificationCenterId: anotherCenter.id, | ||
complementaryCertificationId: aRandomComplementary.id, | ||
}); | ||
await databaseBuilder.commit(); | ||
|
||
// when | ||
const numberOfDeletions = await habilitationRepository.deleteAllByComplementaryKey({ | ||
keys: [ComplementaryCertificationKeys.PIX_PLUS_DROIT], | ||
}); | ||
|
||
// then | ||
expect(numberOfDeletions).to.equal(1); | ||
}); | ||
}); | ||
}); |
83 changes: 83 additions & 0 deletions
83
.../integration/scripts/certification/next-gen/remove-not-clea-centers-habilitations_test.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
import { main } from '../../../../../scripts/certification/next-gen/remove-not-clea-centers-habilitations.js'; | ||
import { ComplementaryCertificationKeys } from '../../../../../src/certification/shared/domain/models/ComplementaryCertificationKeys.js'; | ||
import { databaseBuilder, expect, knex } from '../../../../test-helper.js'; | ||
|
||
describe('Integration | Scripts | Certification | remove-not-clea-centers-habilitations', function () { | ||
let clea, pixPlusDroit; | ||
|
||
beforeEach(async function () { | ||
clea = databaseBuilder.factory.buildComplementaryCertification({ | ||
key: ComplementaryCertificationKeys.CLEA, | ||
}); | ||
pixPlusDroit = databaseBuilder.factory.buildComplementaryCertification({ | ||
key: ComplementaryCertificationKeys.PIX_PLUS_DROIT, | ||
}); | ||
await databaseBuilder.commit(); | ||
}); | ||
|
||
it('should delete center habilitations except for CLEA', async function () { | ||
// given | ||
const center = databaseBuilder.factory.buildCertificationCenter({ id: 456 }); | ||
const anotherCenter = databaseBuilder.factory.buildCertificationCenter({ id: 789 }); | ||
|
||
databaseBuilder.factory.buildComplementaryCertificationHabilitation({ | ||
certificationCenterId: center.id, | ||
complementaryCertificationId: clea.id, | ||
}); | ||
databaseBuilder.factory.buildComplementaryCertificationHabilitation({ | ||
certificationCenterId: center.id, | ||
complementaryCertificationId: pixPlusDroit.id, | ||
}); | ||
databaseBuilder.factory.buildComplementaryCertificationHabilitation({ | ||
certificationCenterId: anotherCenter.id, | ||
complementaryCertificationId: pixPlusDroit.id, | ||
}); | ||
await databaseBuilder.commit(); | ||
|
||
// when | ||
await main({ isDryRun: false }); | ||
|
||
// then | ||
const habilitationsRemaining = await knex('complementary-certification-habilitations').select( | ||
'complementaryCertificationId', | ||
); | ||
expect(habilitationsRemaining).to.have.lengthOf(1); | ||
expect(habilitationsRemaining[0].complementaryCertificationId).to.equal(clea.id); | ||
}); | ||
|
||
context('when is DRY RUN', function () { | ||
it('should not delete center habiliations except for CLEA', async function () { | ||
// given | ||
const center = databaseBuilder.factory.buildCertificationCenter({ id: 111 }); | ||
const anotherCenter = databaseBuilder.factory.buildCertificationCenter({ id: 222 }); | ||
|
||
databaseBuilder.factory.buildComplementaryCertificationHabilitation({ | ||
certificationCenterId: center.id, | ||
complementaryCertificationId: clea.id, | ||
}); | ||
databaseBuilder.factory.buildComplementaryCertificationHabilitation({ | ||
certificationCenterId: center.id, | ||
complementaryCertificationId: pixPlusDroit.id, | ||
}); | ||
databaseBuilder.factory.buildComplementaryCertificationHabilitation({ | ||
certificationCenterId: anotherCenter.id, | ||
complementaryCertificationId: pixPlusDroit.id, | ||
}); | ||
await databaseBuilder.commit(); | ||
|
||
// when | ||
await main({}); | ||
|
||
// then | ||
const habilitationsRemaining = await knex('complementary-certification-habilitations').select( | ||
'complementaryCertificationId', | ||
); | ||
expect(habilitationsRemaining).to.have.lengthOf(3); | ||
expect(habilitationsRemaining).to.deep.equal([ | ||
{ complementaryCertificationId: clea.id }, | ||
{ complementaryCertificationId: pixPlusDroit.id }, | ||
{ complementaryCertificationId: pixPlusDroit.id }, | ||
]); | ||
}); | ||
}); | ||
}); |