diff --git a/api/src/certification/enrolment/infrastructure/repositories/certification-candidate-repository.js b/api/src/certification/enrolment/infrastructure/repositories/certification-candidate-repository.js index 67cf341eebd..29f3aedbd11 100644 --- a/api/src/certification/enrolment/infrastructure/repositories/certification-candidate-repository.js +++ b/api/src/certification/enrolment/infrastructure/repositories/certification-candidate-repository.js @@ -5,16 +5,27 @@ import { ComplementaryCertification } from '../../domain/models/ComplementaryCer import { Subscription } from '../../domain/models/Subscription.js'; const getBySessionIdAndUserId = async function ({ sessionId, userId }) { - const certificationCandidate = await _candidateBaseQuery().where({ sessionId, userId }).first(); - return certificationCandidate ? _toDomain(certificationCandidate) : undefined; + const candidateData = await _candidateBaseQuery().where({ sessionId, userId }).first(); + const subscriptionData = candidateData ? await _getSubscriptions(candidateData.id) : undefined; + return candidateData ? _toDomain({ candidateData, subscriptionData }) : undefined; }; const findBySessionId = async function (sessionId) { - const results = await _candidateBaseQuery() + const certificationCandidates = await _candidateBaseQuery() .where({ 'certification-candidates.sessionId': sessionId }) .orderByRaw('LOWER("certification-candidates"."lastName") asc') .orderByRaw('LOWER("certification-candidates"."firstName") asc'); - return results.map(_toDomain); + + const result = []; + + for (const candidateData of certificationCandidates) { + const subscriptions = await _getSubscriptions(candidateData.id); + const certificationCandidate = _toDomain({ candidateData, subscriptions }); + + result.push(certificationCandidate); + } + + return result; }; const update = async function (certificationCandidate) { @@ -30,28 +41,22 @@ const update = async function (certificationCandidate) { const getWithComplementaryCertification = async function ({ id }) { const candidateData = await _candidateBaseQuery().where('certification-candidates.id', id).first(); + const subscriptionData = await _getSubscriptions(id); + if (!candidateData) { throw new NotFoundError('Candidate not found'); } - return _toDomain(candidateData); + return _toDomain({ candidateData, subscriptionData }); }; export { findBySessionId, getBySessionIdAndUserId, getWithComplementaryCertification, update }; -/** - * @deprecated migration: new ComplementaryCertification(...) should not be done here - * it should come from internal API complementary-certification bounded context. - * Please beware of that when refactoring this code in the future - */ -function _toDomain(candidateData) { - //UTILISER ENROLLEDCANDIDATES +function _toDomain({ candidateData, subscriptionData }) { + const subscriptions = subscriptionData?.map((subscription) => new Subscription({ ...subscription })); return new CertificationCandidate({ ...candidateData, - - // NE SERT NULLEPART - // POURQUOI BUILD CORE PAR DEFAUT ? - subscriptions: [Subscription.buildCore({ id: candidateData.certificationCandidateId })], + subscriptions, complementaryCertification: candidateData.complementaryCertificationId ? new ComplementaryCertification({ id: candidateData.complementaryCertificationId, @@ -67,8 +72,8 @@ function _candidateBaseQuery() { .select({ certificationCandidate: 'certification-candidates.*', complementaryCertificationId: 'complementary-certifications.id', - complementaryCertificationKey: 'complementary-certifications.key', complementaryCertificationLabel: 'complementary-certifications.label', + complementaryCertificationKey: 'complementary-certifications.key', }) .from('certification-candidates') .leftJoin('certification-subscriptions', (builder) => @@ -83,3 +88,7 @@ function _candidateBaseQuery() { ) .groupBy('certification-candidates.id', 'complementary-certifications.id'); } + +async function _getSubscriptions(candidateId) { + return knex.select('*').from('certification-subscriptions').where('certificationCandidateId', candidateId); +} diff --git a/api/src/shared/domain/models/CertificationCandidate.js b/api/src/shared/domain/models/CertificationCandidate.js index 97df9d76751..9eaefac004d 100644 --- a/api/src/shared/domain/models/CertificationCandidate.js +++ b/api/src/shared/domain/models/CertificationCandidate.js @@ -65,27 +65,6 @@ class CertificationCandidate { this.hasSeenCertificationInstructions = hasSeenCertificationInstructions; this.accessibilityAdjustmentNeeded = accessibilityAdjustmentNeeded; this.reconciledAt = reconciledAt; - - Object.defineProperty(this, 'complementaryCertification', { - enumerable: true, - get: function () { - return this.#complementaryCertification; - }, - - set: function (complementaryCertification) { - this.#complementaryCertification = complementaryCertification; - this.subscriptions = this.subscriptions.filter((subscription) => subscription.type === SUBSCRIPTION_TYPES.CORE); - if (complementaryCertification?.id) { - this.subscriptions.push( - Subscription.buildComplementary({ - certificationCandidateId: this.id, - complementaryCertificationId: complementaryCertification.id, - }), - ); - } - }, - }); - this.complementaryCertification = complementaryCertification; } diff --git a/api/tests/certification/enrolment/integration/infrastructure/repositories/certification-candidate-repository_test.js b/api/tests/certification/enrolment/integration/infrastructure/repositories/certification-candidate-repository_test.js index 57a598c70fa..2fb17201d02 100644 --- a/api/tests/certification/enrolment/integration/infrastructure/repositories/certification-candidate-repository_test.js +++ b/api/tests/certification/enrolment/integration/infrastructure/repositories/certification-candidate-repository_test.js @@ -199,7 +199,7 @@ describe('Integration | Repository | CertificationCandidate', function () { sex: 'M', subscriptions: [ { - certificationCandidateId: undefined, + certificationCandidateId, complementaryCertificationId: null, type: 'CORE', }, @@ -350,13 +350,53 @@ describe('Integration | Repository | CertificationCandidate', function () { domainBuilder.buildCertificationCandidate({ ...certificationCandidate, complementaryCertification: null, - subscriptions: [domainBuilder.buildCoreSubscription()], + subscriptions: [ + domainBuilder.buildCoreSubscription({ + certificationCandidateId: certificationCandidate.id, + }), + ], }), ); }); }); - context('when the candidate has complementary certification subscriptions', function () { + context('when the candidate has only complementary certification subscription', function () { + it('should return the candidate with his complementary certification', async function () { + // given + const certificationCandidate = databaseBuilder.factory.buildCertificationCandidate(); + const complementaryCertification = databaseBuilder.factory.buildComplementaryCertification({ + label: 'Complementary certification 2', + }); + databaseBuilder.factory.buildComplementaryCertificationSubscription({ + complementaryCertificationId: complementaryCertification.id, + certificationCandidateId: certificationCandidate.id, + }); + await databaseBuilder.commit(); + + // when + const certificationCandidateWithComplementaryCertification = + await certificationCandidateRepository.getWithComplementaryCertification({ id: certificationCandidate.id }); + + // then + expect(certificationCandidateWithComplementaryCertification).to.deep.equal( + domainBuilder.buildCertificationCandidate({ + ...certificationCandidate, + subscriptions: [ + domainBuilder.buildComplementarySubscription({ + certificationCandidateId: certificationCandidate.id, + complementaryCertificationId: complementaryCertification.id, + }), + ], + complementaryCertification: + domainBuilder.certification.sessionManagement.buildCertificationSessionComplementaryCertification( + complementaryCertification, + ), + }), + ); + }); + }); + + context('when the candidate has core and complementary certification subscriptions', function () { it('should return the candidate with his complementary certification', async function () { // given const certificationCandidate = databaseBuilder.factory.buildCertificationCandidate(); @@ -368,6 +408,7 @@ describe('Integration | Repository | CertificationCandidate', function () { complementaryCertificationId: complementaryCertification.id, certificationCandidateId: certificationCandidate.id, }); + await databaseBuilder.commit(); // when @@ -378,7 +419,15 @@ describe('Integration | Repository | CertificationCandidate', function () { expect(certificationCandidateWithComplementaryCertification).to.deep.equal( domainBuilder.buildCertificationCandidate({ ...certificationCandidate, - subscriptions: [domainBuilder.buildCoreSubscription()], + subscriptions: [ + domainBuilder.buildCoreSubscription({ + certificationCandidateId: certificationCandidate.id, + }), + domainBuilder.buildComplementarySubscription({ + complementaryCertificationId: complementaryCertification.id, + certificationCandidateId: certificationCandidate.id, + }), + ], complementaryCertification: domainBuilder.certification.sessionManagement.buildCertificationSessionComplementaryCertification( complementaryCertification, diff --git a/api/tests/unit/domain/models/CertificationCandidate_test.js b/api/tests/unit/domain/models/CertificationCandidate_test.js index 762a8c7617d..4d2de0e4254 100644 --- a/api/tests/unit/domain/models/CertificationCandidate_test.js +++ b/api/tests/unit/domain/models/CertificationCandidate_test.js @@ -71,10 +71,7 @@ describe('Unit | Domain | Models | Certification Candidate', function () { expectedData = { ...expectedData, complementaryCertification: { id: 99 }, - subscriptions: [ - coreSubscription, - domainBuilder.buildComplementarySubscription({ complementaryCertificationId: 99 }), - ], + subscriptions: [coreSubscription], }; // when