Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TECH] Déplacer et factoriser le code dédié au calcul du levelup après avoir répondu positivement à une épreuve (PIX-16847) #11572

Merged
merged 4 commits into from
Mar 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 43 additions & 5 deletions api/src/evaluation/domain/services/scorecard-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { KnowledgeElement } from '../../../shared/domain/models/KnowledgeElement
import { CompetenceEvaluation } from '../models/CompetenceEvaluation.js';
import { Scorecard } from '../models/Scorecard.js';

async function computeScorecard({
export async function computeScorecard({
userId,
competenceId,
competenceRepository,
Expand Down Expand Up @@ -34,7 +34,47 @@ async function computeScorecard({
});
}

async function resetScorecard({
export function computeLevelUpInformation({
answer,
userId,
area,
competence,
competenceEvaluationForCompetence,
knowledgeElementsForCompetenceBefore,
knowledgeElementsForCompetenceAfter,
allowExcessPix = false,
allowExcessLevel = false,
}) {
const scorecardBefore = Scorecard.buildFrom({
userId,
knowledgeElements: knowledgeElementsForCompetenceBefore,
competenceEvaluation: competenceEvaluationForCompetence,
competence,
area,
allowExcessPix,
allowExcessLevel,
});
const scorecardAfter = Scorecard.buildFrom({
userId,
knowledgeElements: knowledgeElementsForCompetenceAfter,
competenceEvaluation: competenceEvaluationForCompetence,
competence,
area,
allowExcessPix,
allowExcessLevel,
});

if (scorecardBefore.level < scorecardAfter.level) {
return {
id: answer.id,
competenceName: scorecardAfter.name,
level: scorecardAfter.level,
};
}
return {};
}

export async function resetScorecard({
userId,
competenceId,
shouldResetCompetenceEvaluation,
Expand Down Expand Up @@ -152,8 +192,6 @@ async function _resetCampaignAssessment({
return await assessmentRepository.save({ assessment: newAssessment });
}

function _computeResetSkillsNotIncludedInCampaign({ skillIds, resetSkillIds }) {
export function _computeResetSkillsNotIncludedInCampaign({ skillIds, resetSkillIds }) {
return _(skillIds).intersection(resetSkillIds).isEmpty();
}

export { _computeResetSkillsNotIncludedInCampaign, computeScorecard, resetScorecard };
Original file line number Diff line number Diff line change
Expand Up @@ -46,48 +46,36 @@ export async function saveAndCorrectAnswerForCampaign({
const lastQuestionDate = assessment.lastQuestionDate || now;
correctedAnswer.setTimeSpentFrom({ now, lastQuestionDate });

let knowledgeElements = [];
let answerSaved;
if (assessment.isSmartRandom()) {
let scorecardBeforeAnswer = null;
if (correctedAnswer.result.isOK()) {
scorecardBeforeAnswer = await scorecardService.computeScorecard({
userId,
competenceId: challenge.competenceId,
areaRepository,
competenceRepository,
competenceEvaluationRepository,
knowledgeElementRepository,
locale,
});
}
const knowledgeElementsBefore = await knowledgeElementRepository.findUniqByUserId({ userId });

const targetSkills = await campaignRepository.findSkillsByCampaignParticipationId({
campaignParticipationId: assessment.campaignParticipationId,
});
knowledgeElements = await computeKnowledgeElements({
const knowledgeElementsToAdd = computeKnowledgeElements({
assessment,
answer: correctedAnswer,
challenge,
targetSkills,
knowledgeElementRepository,
knowledgeElementsBefore,
});

answerSaved = await answerRepository.saveWithKnowledgeElements(correctedAnswer, knowledgeElements);
answerSaved = await answerRepository.saveWithKnowledgeElements(correctedAnswer, knowledgeElementsToAdd);
answerSaved.levelup = await computeLevelUpInformation({
answerSaved,
scorecardService,
userId,
competenceId: challenge.competenceId,
locale,
knowledgeElementsBefore,
knowledgeElementsAdded: knowledgeElementsToAdd,
scorecardService,
areaRepository,
competenceRepository,
competenceEvaluationRepository,
knowledgeElementRepository,
scorecardBeforeAnswer,
locale,
});
} else if (assessment.isFlash()) {
answerSaved = await answerRepository.saveWithKnowledgeElements(correctedAnswer, knowledgeElements);
answerSaved = await answerRepository.saveWithKnowledgeElements(correctedAnswer, []);
answerSaved.levelup = {};
const flashData = await algorithmDataFetcherService.fetchForFlashLevelEstimation({
assessment,
Expand All @@ -113,11 +101,10 @@ export async function saveAndCorrectAnswerForCampaign({
return answerSaved;
}

async function computeKnowledgeElements({ assessment, answer, challenge, targetSkills, knowledgeElementRepository }) {
const knowledgeElements = await knowledgeElementRepository.findUniqByUserIdAndAssessmentId({
userId: assessment.userId,
assessmentId: assessment.id,
});
function computeKnowledgeElements({ assessment, answer, challenge, targetSkills, knowledgeElementsBefore }) {
const knowledgeElements = knowledgeElementsBefore.filter(
(knowledgeElement) => knowledgeElement.assessmentId === assessment.id,
);
return KnowledgeElement.createKnowledgeElementsForAnswer({
answer,
challenge,
Expand Down Expand Up @@ -145,36 +132,39 @@ function getSkillsFilteredByStatus(knowledgeElements, targetSkills, status) {

async function computeLevelUpInformation({
answerSaved,
scorecardService,
userId,
competenceId,
competenceRepository,
locale,
knowledgeElementsBefore,
knowledgeElementsAdded,
scorecardService,
areaRepository,
competenceRepository,
competenceEvaluationRepository,
knowledgeElementRepository,
scorecardBeforeAnswer,
locale,
}) {
if (!scorecardBeforeAnswer) {
if (!answerSaved.result.isOK()) {
return {};
}

const scorecardAfterAnswer = await scorecardService.computeScorecard({
const competence = await competenceRepository.get({ id: competenceId, locale });
const area = await areaRepository.get({ id: competence.areaId, locale });
const competenceEvaluations = await competenceEvaluationRepository.findByUserId(userId);
const competenceEvaluationForCompetence = competenceEvaluations.find(
(competenceEval) => competenceEval.competenceId === competenceId,
);
const knowledgeElementsForCompetenceBefore = knowledgeElementsBefore.filter(
(knowledgeElement) => knowledgeElement.competenceId === competenceId,
);
const knowledgeElementsForCompetenceAfter = [
...knowledgeElementsAdded.filter((knowledgeElement) => knowledgeElement.competenceId === competenceId),
...knowledgeElementsForCompetenceBefore,
];
return scorecardService.computeLevelUpInformation({
answer: answerSaved,
userId,
competenceId,
competenceRepository,
areaRepository,
competenceEvaluationRepository,
knowledgeElementRepository,
locale,
area,
competence,
competenceEvaluationForCompetence,
knowledgeElementsForCompetenceBefore,
knowledgeElementsForCompetenceAfter,
});

if (scorecardBeforeAnswer.level < scorecardAfterAnswer.level) {
return {
id: answerSaved.id,
competenceName: scorecardAfterAnswer.name,
level: scorecardAfterAnswer.level,
};
}
return {};
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,40 +43,28 @@ export async function saveAndCorrectAnswerForCompetenceEvaluation({
const lastQuestionDate = assessment.lastQuestionDate || now;
correctedAnswer.setTimeSpentFrom({ now, lastQuestionDate });

let scorecardBeforeAnswer = null;
if (correctedAnswer.result.isOK()) {
scorecardBeforeAnswer = await scorecardService.computeScorecard({
userId,
competenceId: challenge.competenceId,
areaRepository,
competenceRepository,
competenceEvaluationRepository,
knowledgeElementRepository,
locale,
});
}

const targetSkills = await skillRepository.findActiveByCompetenceId(assessment.competenceId);
const knowledgeElementsFromAnswer = await computeKnowledgeElements({
const knowledgeElementsBefore = await knowledgeElementRepository.findUniqByUserId({ userId });
const knowledgeElementsToAdd = computeKnowledgeElements({
assessment,
answer: correctedAnswer,
challenge,
targetSkills,
knowledgeElementRepository,
knowledgeElementsBefore,
});

const answerSaved = await answerRepository.saveWithKnowledgeElements(correctedAnswer, knowledgeElementsFromAnswer);
const answerSaved = await answerRepository.saveWithKnowledgeElements(correctedAnswer, knowledgeElementsToAdd);
answerSaved.levelup = await computeLevelUpInformation({
answerSaved,
scorecardService,
userId,
competenceId: challenge.competenceId,
locale,
knowledgeElementsBefore,
knowledgeElementsAdded: knowledgeElementsToAdd,
scorecardService,
areaRepository,
competenceRepository,
competenceEvaluationRepository,
knowledgeElementRepository,
scorecardBeforeAnswer,
locale,
});

if (userId) {
Expand All @@ -86,11 +74,10 @@ export async function saveAndCorrectAnswerForCompetenceEvaluation({
return answerSaved;
}

async function computeKnowledgeElements({ assessment, answer, challenge, targetSkills, knowledgeElementRepository }) {
const knowledgeElements = await knowledgeElementRepository.findUniqByUserIdAndAssessmentId({
userId: assessment.userId,
assessmentId: assessment.id,
});
function computeKnowledgeElements({ assessment, answer, challenge, targetSkills, knowledgeElementsBefore }) {
const knowledgeElements = knowledgeElementsBefore.filter(
(knowledgeElement) => knowledgeElement.assessmentId === assessment.id,
);
return KnowledgeElement.createKnowledgeElementsForAnswer({
answer,
challenge,
Expand Down Expand Up @@ -118,36 +105,39 @@ function getSkillsFilteredByStatus(knowledgeElements, targetSkills, status) {

async function computeLevelUpInformation({
answerSaved,
scorecardService,
userId,
competenceId,
competenceRepository,
locale,
knowledgeElementsBefore,
knowledgeElementsAdded,
scorecardService,
areaRepository,
competenceRepository,
competenceEvaluationRepository,
knowledgeElementRepository,
scorecardBeforeAnswer,
locale,
}) {
if (!scorecardBeforeAnswer) {
if (!answerSaved.result.isOK()) {
return {};
}

const scorecardAfterAnswer = await scorecardService.computeScorecard({
const competence = await competenceRepository.get({ id: competenceId, locale });
const area = await areaRepository.get({ id: competence.areaId, locale });
const competenceEvaluations = await competenceEvaluationRepository.findByUserId(userId);
const competenceEvaluationForCompetence = competenceEvaluations.find(
(competenceEval) => competenceEval.competenceId === competenceId,
);
const knowledgeElementsForCompetenceBefore = knowledgeElementsBefore.filter(
(knowledgeElement) => knowledgeElement.competenceId === competenceId,
);
const knowledgeElementsForCompetenceAfter = [
...knowledgeElementsAdded.filter((knowledgeElement) => knowledgeElement.competenceId === competenceId),
...knowledgeElementsForCompetenceBefore,
];
return scorecardService.computeLevelUpInformation({
answer: answerSaved,
userId,
competenceId,
competenceRepository,
areaRepository,
competenceEvaluationRepository,
knowledgeElementRepository,
locale,
area,
competence,
competenceEvaluationForCompetence,
knowledgeElementsForCompetenceBefore,
knowledgeElementsForCompetenceAfter,
});

if (scorecardBeforeAnswer.level < scorecardAfterAnswer.level) {
return {
id: answerSaved.id,
competenceName: scorecardAfterAnswer.name,
level: scorecardAfterAnswer.level,
};
}
return {};
}
Loading