Skip to content

Commit

Permalink
tech(api): add campaign code in assessment model returned with GET as…
Browse files Browse the repository at this point in the history
…sessments/id for exam'
  • Loading branch information
laura-bergoens authored Mar 5, 2025
1 parent fbb2044 commit 427ab53
Show file tree
Hide file tree
Showing 19 changed files with 293 additions and 437 deletions.
120 changes: 63 additions & 57 deletions api/lib/domain/usecases/get-assessment.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { NotFoundError } from '../../../src/shared/domain/errors.js';
import { Assessment } from '../../../src/shared/domain/models/index.js';

const getAssessment = async function ({
export async function getAssessment({
assessmentId,
locale,
assessmentRepository,
Expand All @@ -12,42 +12,73 @@ const getAssessment = async function ({
certificationCompanionAlertRepository,
}) {
const assessment = await assessmentRepository.getWithAnswers(assessmentId);
switch (assessment.type) {
case Assessment.types.CERTIFICATION: {
await _addCertificationRelatedAttributes({
assessment,
certificationChallengeLiveAlertRepository,
certificationCompanionAlertRepository,
});
assessment.showProgressBar = false;
assessment.hasCheckpoints = false;
assessment.showLevelup = false;
assessment.title = assessment.certificationCourseId;
break;
}

assessment.title = await _fetchAssessmentTitle({
assessment,
locale,
competenceRepository,
courseRepository,
campaignRepository,
});

await _addCampaignRelatedAttributes(assessment, campaignRepository);
await _addDemoRelatedAttributes(assessment, courseRepository);
await _addCertificationRelatedAttributes({
assessment,
certificationChallengeLiveAlertRepository,
certificationCompanionAlertRepository,
});
return assessment;
};

export { getAssessment };
case Assessment.types.COMPETENCE_EVALUATION: {
assessment.showProgressBar = true;
assessment.hasCheckpoints = true;
assessment.showLevelup = true;
assessment.title = await competenceRepository.getCompetenceName({ id: assessment.competenceId, locale });
break;
}

async function _addCampaignRelatedAttributes(assessment, campaignRepository) {
if (assessment.type === Assessment.types.CAMPAIGN) {
assessment.campaignCode = await campaignRepository.getCampaignCodeByCampaignParticipationId(
assessment.campaignParticipationId,
);
}
}
case Assessment.types.DEMO: {
const course = await courseRepository.get(assessment.courseId);
if (!course.canBePlayed) {
throw new NotFoundError("Le test demandé n'existe pas");
}
assessment.showProgressBar = true;
assessment.hasCheckpoints = false;
assessment.showLevelup = false;
assessment.title = await courseRepository.getCourseName(assessment.courseId);
break;
}
case Assessment.types.PREVIEW: {
assessment.showProgressBar = false;
assessment.hasCheckpoints = false;
assessment.showLevelup = false;
assessment.title = 'Preview';
break;
}
case Assessment.types.CAMPAIGN: {
const campaignId = await campaignRepository.getCampaignIdByCampaignParticipationId(
assessment.campaignParticipationId,
);
const campaign = await campaignRepository.get(campaignId);
assessment.campaignCode = campaign.code;
assessment.showProgressBar = false;
assessment.hasCheckpoints = false;
assessment.showLevelup = false;
if (!assessment.isFlash() && (campaign.isAssessment() || campaign.isExam())) {
assessment.showProgressBar = true;
assessment.hasCheckpoints = true;
assessment.showLevelup = true;
}
assessment.title = campaign.title;
break;
}

async function _addDemoRelatedAttributes(assessment, courseRepository) {
if (assessment.type === Assessment.types.DEMO) {
const course = await courseRepository.get(assessment.courseId);
if (!course.canBePlayed) {
throw new NotFoundError("Le test demandé n'existe pas");
default: {
assessment.showProgressBar = false;
assessment.hasCheckpoints = false;
assessment.showLevelup = false;
assessment.title = '';
}
}

return assessment;
}

async function _addCertificationRelatedAttributes({
Expand All @@ -68,28 +99,3 @@ async function _addCertificationRelatedAttributes({

assessment.attachLiveAlerts({ challengeLiveAlerts, companionLiveAlerts });
}

function _fetchAssessmentTitle({ assessment, locale, competenceRepository, courseRepository, campaignRepository }) {
switch (assessment.type) {
case Assessment.types.CERTIFICATION: {
return assessment.certificationCourseId;
}

case Assessment.types.COMPETENCE_EVALUATION: {
return competenceRepository.getCompetenceName({ id: assessment.competenceId, locale });
}

case Assessment.types.DEMO: {
return courseRepository.getCourseName(assessment.courseId);
}
case Assessment.types.PREVIEW: {
return 'Preview';
}
case Assessment.types.CAMPAIGN: {
return campaignRepository.getCampaignTitleByCampaignParticipationId(assessment.campaignParticipationId);
}

default:
return '';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,28 +57,6 @@ const checkIfUserOrganizationHasAccessToCampaign = async function (campaignId, u
return Boolean(campaign);
};

const getCampaignTitleByCampaignParticipationId = async function (campaignParticipationId) {
const campaign = await knex('campaigns')
.select('title')
.join('campaign-participations', 'campaign-participations.campaignId', 'campaigns.id')
.where({ 'campaign-participations.id': campaignParticipationId })
.first();

if (!campaign) return null;
return campaign.title;
};

const getCampaignCodeByCampaignParticipationId = async function (campaignParticipationId) {
const campaign = await knex('campaigns')
.select('code')
.join('campaign-participations', 'campaign-participations.campaignId', 'campaigns.id')
.where({ 'campaign-participations.id': campaignParticipationId })
.first();

if (!campaign) return null;
return campaign.code;
};

const getCampaignIdByCampaignParticipationId = async function (campaignParticipationId) {
const knexConn = DomainTransaction.getConnection();
const campaign = await knexConn('campaigns')
Expand Down Expand Up @@ -143,9 +121,7 @@ export {
findTubes,
get,
getByCode,
getCampaignCodeByCampaignParticipationId,
getCampaignIdByCampaignParticipationId,
getCampaignTitleByCampaignParticipationId,
};

async function _findSkills({ campaignId, filterByStatus = 'operative' }) {
Expand Down
3 changes: 3 additions & 0 deletions api/src/shared/domain/models/Assessment.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ class Assessment {
this.campaignCode = campaignCode;
this.challengeLiveAlerts = challengeLiveAlerts;
this.companionLiveAlerts = companionLiveAlerts;
this.showProgressBar = null;
this.hasCheckpoints = null;
this.showLevelup = null;
}

isCompleted() {
Expand Down
4 changes: 4 additions & 0 deletions api/src/shared/domain/models/Campaign.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ class Campaign {
return this.type === CampaignTypes.ASSESSMENT;
}

isExam() {
return this.type === CampaignTypes.EXAM;
}

isProfilesCollection() {
return this.type === CampaignTypes.PROFILES_COLLECTION;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,5 +184,8 @@ function _adaptModelToDb(assessment) {
'campaignCode',
'challengeLiveAlerts',
'companionLiveAlerts',
'showProgressBar',
'hasCheckpoints',
'showLevelup',
]);
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,13 @@ const serialize = function (assessments) {
}

// Same here for isForCampaign() and isCompetenceEvaluation()
if ([Assessment.types.CAMPAIGN, Assessment.types.COMPETENCE_EVALUATION].includes(currentAssessment.type)) {
if (currentAssessment.hasCheckpoints) {
assessment.progression = {
id: Progression.generateIdFromAssessmentId(currentAssessment.id),
};
}

if (currentAssessment.type === Assessment.types.CAMPAIGN) {
assessment.codeCampaign = currentAssessment.campaignCode;
}
assessment.codeCampaign = currentAssessment.campaignCode;

if (!currentAssessment.course) {
assessment.course = { id: currentAssessment.courseId };
Expand All @@ -52,6 +50,9 @@ const serialize = function (assessments) {
'competenceId',
'lastQuestionState',
'method',
'showProgressBar',
'hasCheckpoints',
'showLevelup',
],
answers: {
ref: 'id',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -306,101 +306,6 @@ describe('Integration | Repository | Campaign', function () {
});
});

describe('#getCampaignTitleByCampaignParticipationId', function () {
it('should return campaign title when campaign has one', async function () {
// given
const campaignId = databaseBuilder.factory.buildCampaign({ title: 'Parcours trop bien' }).id;
const campaignParticipationId = databaseBuilder.factory.buildCampaignParticipation({ campaignId }).id;
await databaseBuilder.commit();

// when
const title = await campaignRepository.getCampaignTitleByCampaignParticipationId(campaignParticipationId);

// then
expect(title).to.equal('Parcours trop bien');
});

it('should return null when campaign has no title', async function () {
// given
const campaignId = databaseBuilder.factory.buildCampaign({ title: null }).id;
const campaignParticipationId = databaseBuilder.factory.buildCampaignParticipation({ campaignId }).id;
await databaseBuilder.commit();

// when
const title = await campaignRepository.getCampaignTitleByCampaignParticipationId(campaignParticipationId);

// then
expect(title).to.be.null;
});

it('should return null when campaignParticipationId does not exist', async function () {
// when
const title = await campaignRepository.getCampaignTitleByCampaignParticipationId(123);

// then
expect(title).to.be.null;
});

it('should return the title from the given campaignParticipationId', async function () {
// given
const campaignId = databaseBuilder.factory.buildCampaign({ title: 'Parcours trop bien' }).id;
databaseBuilder.factory.buildCampaignParticipation({ campaignId });

const otherCampaignId = databaseBuilder.factory.buildCampaign({ title: 'Autre' }).id;
const otherCampaignParticipationId = databaseBuilder.factory.buildCampaignParticipation({
campaignId: otherCampaignId,
}).id;
await databaseBuilder.commit();

// when
const title = await campaignRepository.getCampaignTitleByCampaignParticipationId(otherCampaignParticipationId);

// then
expect(title).to.equal('Autre');
});
});

describe('#getCampaignCodeByCampaignParticipationId', function () {
it('should return campaign code when campaign has one', async function () {
// given
const campaignId = databaseBuilder.factory.buildCampaign({ code: 'CAMPAIGN1' }).id;
const campaignParticipationId = databaseBuilder.factory.buildCampaignParticipation({ campaignId }).id;
await databaseBuilder.commit();

// when
const code = await campaignRepository.getCampaignCodeByCampaignParticipationId(campaignParticipationId);

// then
expect(code).to.equal('CAMPAIGN1');
});

it('should return null when campaignParticipationId does not exist', async function () {
// when
const code = await campaignRepository.getCampaignCodeByCampaignParticipationId(123);

// then
expect(code).to.be.null;
});

it('should return the code from the given campaignParticipationId', async function () {
// given
const campaignId = databaseBuilder.factory.buildCampaign({ code: 'CAMPAIGN1' }).id;
databaseBuilder.factory.buildCampaignParticipation({ campaignId });

const otherCampaignId = databaseBuilder.factory.buildCampaign({ code: 'CAMPAIGN2' }).id;
const otherCampaignParticipationId = databaseBuilder.factory.buildCampaignParticipation({
campaignId: otherCampaignId,
}).id;
await databaseBuilder.commit();

// when
const code = await campaignRepository.getCampaignCodeByCampaignParticipationId(otherCampaignParticipationId);

// then
expect(code).to.equal('CAMPAIGN2');
});
});

describe('#getCampaignIdByCampaignParticipationId', function () {
it('should return campaign id', async function () {
// given
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,16 @@ describe('Acceptance | API | assessment-controller-get', function () {
// given
server = await createServer();
const userId = databaseBuilder.factory.buildUser({}).id;
const campaignId = databaseBuilder.factory.buildCampaign().id;
const campaignParticipationId = databaseBuilder.factory.buildCampaignParticipation({
campaignId,
}).id;
const assessmentId = databaseBuilder.factory.buildAssessment({
userId,
courseId,
state: Assessment.states.STARTED,
type,
campaignParticipationId,
}).id;
await databaseBuilder.commit();

Expand Down Expand Up @@ -163,6 +168,10 @@ describe('Acceptance | API | assessment-controller-get', function () {
'last-question-state': Assessment.statesOfLastQuestion.ASKED,
'competence-id': 'recCompetenceId',
method: Assessment.methods.CHOSEN,
'code-campaign': undefined,
'has-checkpoints': false,
'show-levelup': false,
'show-progress-bar': false,
},
relationships: {
course: {
Expand Down Expand Up @@ -285,6 +294,10 @@ describe('Acceptance | API | assessment-controller-get', function () {
'competence-id': 'recCompetenceId',
'last-question-state': Assessment.statesOfLastQuestion.ASKED,
method: Assessment.methods.CHOSEN,
'code-campaign': undefined,
'has-checkpoints': false,
'show-levelup': false,
'show-progress-bar': false,
},
relationships: {
course: { data: { type: 'courses', id: courseId } },
Expand Down
Loading

0 comments on commit 427ab53

Please sign in to comment.