Skip to content

Commit

Permalink
✨ api: get all candidate subscriptions
Browse files Browse the repository at this point in the history
Co-authored-by: Alexandre Coin <[email protected]>
  • Loading branch information
P-Jeremy and alexandrecoin committed Oct 9, 2024
1 parent c1f8c9b commit 7b7b6f5
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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,
Expand All @@ -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) =>
Expand All @@ -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);
}
21 changes: 0 additions & 21 deletions api/src/shared/domain/models/CertificationCandidate.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ describe('Integration | Repository | CertificationCandidate', function () {
sex: 'M',
subscriptions: [
{
certificationCandidateId: undefined,
certificationCandidateId,
complementaryCertificationId: null,
type: 'CORE',
},
Expand Down Expand Up @@ -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();
Expand All @@ -368,6 +408,7 @@ describe('Integration | Repository | CertificationCandidate', function () {
complementaryCertificationId: complementaryCertification.id,
certificationCandidateId: certificationCandidate.id,
});

await databaseBuilder.commit();

// when
Expand All @@ -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,
Expand Down
5 changes: 1 addition & 4 deletions api/tests/unit/domain/models/CertificationCandidate_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 7b7b6f5

Please sign in to comment.