Skip to content

Commit

Permalink
feat(api): use KnowledgeElementCollection to build snapshot
Browse files Browse the repository at this point in the history
  • Loading branch information
lionelB committed Feb 5, 2025
1 parent 5a1005a commit b17e8a7
Show file tree
Hide file tree
Showing 13 changed files with 56 additions and 74 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import _ from 'lodash';

import { KnowledgeElementCollection } from '../../../src/prescription/shared/domain/models/KnowledgeElementCollection.js';
import { databaseBuffer } from '../database-buffer.js';
import { buildKnowledgeElement } from './build-knowledge-element.js';
import { buildUser } from './build-user.js';
Expand All @@ -17,7 +18,7 @@ const buildKnowledgeElementSnapshot = function ({
const knowledgeElements = [];
knowledgeElements.push(buildKnowledgeElement({ userId, createdAt: dateMinusOneDay }));
knowledgeElements.push(buildKnowledgeElement({ userId, createdAt: dateMinusOneDay }));
snapshot = JSON.stringify(knowledgeElements);
snapshot = new KnowledgeElementCollection(knowledgeElements).toSnapshot();
}

const values = {
Expand Down
5 changes: 3 additions & 2 deletions api/db/seeds/data/common/tooling/campaign-tooling.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
CampaignExternalIdTypes,
CampaignParticipationStatuses,
} from '../../../../../src/prescription/shared/domain/constants.js';
import { KnowledgeElementCollection } from '../../../../../src/prescription/shared/domain/models/KnowledgeElementCollection.js';
import { Assessment, KnowledgeElement } from '../../../../../src/shared/domain/models/index.js';
import { getPlacementProfile } from '../../../../../src/shared/domain/services/placement-profile-service.js';
import { FEATURE_CAMPAIGN_EXTERNAL_ID } from '../constants.js';
Expand Down Expand Up @@ -240,7 +241,7 @@ async function createAssessmentCampaign({
databaseBuilder.factory.buildKnowledgeElementSnapshot({
userId,
snappedAt: sharedAt,
snapshot: JSON.stringify(keDataForSnapshot),
snapshot: new KnowledgeElementCollection(keDataForSnapshot).toSnapshot(),
campaignParticipationId,
});

Expand Down Expand Up @@ -404,7 +405,7 @@ async function createProfilesCollectionCampaign({
databaseBuilder.factory.buildKnowledgeElementSnapshot({
userId,
snappedAt: sharedAt,
snapshot: JSON.stringify(keDataForSnapshot),
snapshot: new KnowledgeElementCollection(keDataForSnapshot).toSnapshot(),
campaignParticipationId,
});

Expand Down
24 changes: 12 additions & 12 deletions api/db/seeds/data/common/tooling/profile-tooling.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ export {
* @returns {Promise<void>}
*/
async function createCertifiableProfile({ databaseBuilder, userId }) {
const answersAndKnowledgeElementsCollection = await getAnswersAndKnowledgeElementsForBeginnerProfile();
const answersAndKnowledgeElementCollection = await getAnswersAndKnowledgeElementsForBeginnerProfile();
_makeUserReachPixScoreForCompetences({
databaseBuilder,
userId,
answersAndKnowledgeElementsCollection,
answersAndKnowledgeElementCollection,
});

await databaseBuilder.commit();
Expand All @@ -40,12 +40,12 @@ async function createCertifiableProfile({ databaseBuilder, userId }) {
* @returns {Promise<void>}
*/
async function createPerfectProfile({ databaseBuilder, userId }) {
const answersAndKnowledgeElementsCollection = await getAnswersAndKnowledgeElementsForPerfectProfile();
const answersAndKnowledgeElementCollection = await getAnswersAndKnowledgeElementsForPerfectProfile();

_makeUserReachPixScoreForCompetences({
databaseBuilder,
userId,
answersAndKnowledgeElementsCollection,
answersAndKnowledgeElementCollection,
});

await databaseBuilder.commit();
Expand All @@ -59,7 +59,7 @@ async function getAnswersAndKnowledgeElementsForBeginnerProfile() {

await _getAnswersAndKnowledgeElementsForProfile({
competences: fiveRandomCompetences,
answersAndKnowledgeElementsCollection: ANSWERS_AND_KNOWLEDGE_ELEMENTS_FOR_BEGINNER_PROFILE,
answersAndKnowledgeElementCollection: ANSWERS_AND_KNOWLEDGE_ELEMENTS_FOR_BEGINNER_PROFILE,
pixScoreByCompetence: PIX_COUNT_BY_LEVEL,
});
}
Expand All @@ -75,7 +75,7 @@ async function getAnswersAndKnowledgeElementsForIntermediateProfile() {

await _getAnswersAndKnowledgeElementsForProfile({
competences: eightRandomCompetences,
answersAndKnowledgeElementsCollection: ANSWERS_AND_KNOWLEDGE_ELEMENTS_FOR_INTERMEDIATE_PROFILE,
answersAndKnowledgeElementCollection: ANSWERS_AND_KNOWLEDGE_ELEMENTS_FOR_INTERMEDIATE_PROFILE,
pixScoreByCompetence: PIX_COUNT_BY_LEVEL * 3,
});
}
Expand All @@ -91,7 +91,7 @@ async function getAnswersAndKnowledgeElementsForAdvancedProfile() {

await _getAnswersAndKnowledgeElementsForProfile({
competences: twelveRandomCompetences,
answersAndKnowledgeElementsCollection: ANSWERS_AND_KNOWLEDGE_ELEMENTS_FOR_ADVANCED_PROFILE,
answersAndKnowledgeElementCollection: ANSWERS_AND_KNOWLEDGE_ELEMENTS_FOR_ADVANCED_PROFILE,
pixScoreByCompetence: PIX_COUNT_BY_LEVEL * 4,
});
}
Expand All @@ -106,7 +106,7 @@ async function getAnswersAndKnowledgeElementsForPerfectProfile() {

await _getAnswersAndKnowledgeElementsForProfile({
competences: pixCompetences,
answersAndKnowledgeElementsCollection: ANSWERS_AND_KNOWLEDGE_ELEMENTS_FOR_PERFECT_PROFILE,
answersAndKnowledgeElementCollection: ANSWERS_AND_KNOWLEDGE_ELEMENTS_FOR_PERFECT_PROFILE,
pixScoreByCompetence: UNREACHABLE_PIX_SCORE,
});
}
Expand All @@ -117,7 +117,7 @@ async function getAnswersAndKnowledgeElementsForPerfectProfile() {
async function _getAnswersAndKnowledgeElementsForProfile({
competences,
pixScoreByCompetence,
answersAndKnowledgeElementsCollection,
answersAndKnowledgeElementCollection,
}) {
for (const competence of competences) {
const skills = await learningContent.findActiveSkillsByCompetenceId(competence.id);
Expand Down Expand Up @@ -147,7 +147,7 @@ async function _getAnswersAndKnowledgeElementsForProfile({
earnedPix: skill.pixValue,
competenceId: skill.competenceId,
};
answersAndKnowledgeElementsCollection.push({ answerData, keData });
answersAndKnowledgeElementCollection.push({ answerData, keData });

currentPixScore += skill.pixValue;
if (currentPixScore >= pixScoreByCompetence) {
Expand All @@ -173,9 +173,9 @@ function _makeCompetenceEvaluation({ databaseBuilder, userId, competenceId }) {
return assessmentId;
}

function _makeUserReachPixScoreForCompetences({ databaseBuilder, userId, answersAndKnowledgeElementsCollection }) {
function _makeUserReachPixScoreForCompetences({ databaseBuilder, userId, answersAndKnowledgeElementCollection }) {
const answersAndKnowledgeElementsByCompetenceId = _.groupBy(
answersAndKnowledgeElementsCollection,
answersAndKnowledgeElementCollection,
({ keData }) => keData.competenceId,
);
for (const [competenceId, answersAndKnowledgeElements] of Object.entries(answersAndKnowledgeElementsByCompetenceId)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { DomainTransaction } from '../../../../shared/domain/DomainTransaction.j
import { AlreadyExistingEntityError } from '../../../../shared/domain/errors.js';
import { KnowledgeElement } from '../../../../shared/domain/models/KnowledgeElement.js';
import * as knexUtils from '../../../../shared/infrastructure/utils/knex-utils.js';
import { KnowledgeElementCollection } from '../../../shared/domain/models/KnowledgeElementCollection.js';
import { CampaignParticipationKnowledgeElementSnapshots } from '../../../shared/domain/read-models/CampaignParticipationKnowledgeElementSnapshots.js';

function _toKnowledgeElementCollection({ snapshot } = {}) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,12 @@
import _ from 'lodash';

import { knex } from '../../../../db/knex-database-connection.js';
import { KnowledgeElementCollection } from '../../../prescription/shared/domain/models/KnowledgeElementCollection.js';
import { DomainTransaction } from '../../domain/DomainTransaction.js';
import { KnowledgeElement } from '../../domain/models/KnowledgeElement.js';

const tableName = 'knowledge-elements';

function _getUniqMostRecents(knowledgeElements) {
return _(knowledgeElements).orderBy('createdAt', 'desc').uniqBy('skillId').value();
}

function _dropResetKnowledgeElements(knowledgeElements) {
return _.reject(knowledgeElements, { status: KnowledgeElement.StatusType.RESET });
}

function _applyFilters(knowledgeElements) {
const uniqsMostRecentPerSkill = _getUniqMostRecents(knowledgeElements);
return _dropResetKnowledgeElements(uniqsMostRecentPerSkill);
}

function _findByUserIdAndLimitDateQuery({ userId, limitDate, skillIds = [] }) {
const knexConn = DomainTransaction.getConnection();
return knexConn(tableName).where((qb) => {
Expand All @@ -35,11 +23,10 @@ function _findByUserIdAndLimitDateQuery({ userId, limitDate, skillIds = [] }) {
async function findAssessedByUserIdAndLimitDateQuery({ userId, limitDate, skillIds }) {
const knowledgeElementRows = await _findByUserIdAndLimitDateQuery({ userId, limitDate, skillIds });

const knowledgeElements = _.map(
knowledgeElementRows,
(knowledgeElementRow) => new KnowledgeElement(knowledgeElementRow),
const keCollection = new KnowledgeElementCollection(
knowledgeElementRows.map((knowledgeElementRow) => new KnowledgeElement(knowledgeElementRow)),
);
return _applyFilters(knowledgeElements);
return keCollection.latestUniqNonResetKnowledgeElements;
}

const findUniqByUserIds = function (userIds) {
Expand Down Expand Up @@ -69,11 +56,10 @@ const findUniqByUserIdAndAssessmentId = async function ({ userId, assessmentId }
const query = _findByUserIdAndLimitDateQuery({ userId });
const knowledgeElementRows = await query.where({ assessmentId });

const knowledgeElements = _.map(
knowledgeElementRows,
(knowledgeElementRow) => new KnowledgeElement(knowledgeElementRow),
const keCollection = new KnowledgeElementCollection(
knowledgeElementRows.map((knowledgeElementRow) => new KnowledgeElement(knowledgeElementRow)),
);
return _applyFilters(knowledgeElements);
return keCollection.latestUniqNonResetKnowledgeElements;
};

const findUniqByUserIdAndCompetenceId = async function ({ userId, competenceId }) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { KnowledgeElementCollection } from '../../../../../src/prescription/shared/domain/models/KnowledgeElementCollection.js';
import { Membership } from '../../../../../src/shared/domain/models/Membership.js';
import {
createServer,
Expand Down Expand Up @@ -577,7 +578,7 @@ describe('Acceptance | API | campaign-results-route', function () {
databaseBuilder.factory.buildKnowledgeElementSnapshot({
userId,
campaignParticipationId: campaignParticipation.id,
snapshot: JSON.stringify([ke]),
snapshot: new KnowledgeElementCollection([ke]).toSnapsho(),
snappedAt: campaignParticipation.sharedAt,
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import dayjs from 'dayjs';

import { usecases } from '../../../../../../src/prescription/campaign/domain/usecases/index.js';
import { CampaignExternalIdTypes } from '../../../../../../src/prescription/shared/domain/constants.js';
import { KnowledgeElementCollection } from '../../../../../../src/prescription/shared/domain/models/KnowledgeElementCollection.js';
import { CAMPAIGN_FEATURES, ORGANIZATION_FEATURE } from '../../../../../../src/shared/domain/constants.js';
import { Assessment } from '../../../../../../src/shared/domain/models/Assessment.js';
import { CampaignParticipationStatuses, KnowledgeElement } from '../../../../../../src/shared/domain/models/index.js';
Expand Down Expand Up @@ -108,7 +109,7 @@ describe('Integration | Domain | Use Cases | start-writing-campaign-assessment-r
databaseBuilder.factory.buildKnowledgeElementSnapshot({
userId: participant.id,
snappedAt: sharedAt,
snapshot: JSON.stringify([ke1]),
snapshot: new KnowledgeElementCollection([ke1]).toSnapshot(),
});

['recSkillWeb1'].forEach((skillId) => {
Expand Down Expand Up @@ -201,7 +202,7 @@ describe('Integration | Domain | Use Cases | start-writing-campaign-assessment-r
databaseBuilder.factory.buildKnowledgeElementSnapshot({
userId: participant.id,
snappedAt: sharedAt,
snapshot: JSON.stringify([ke1, ke2, ke3]),
snapshot: new KnowledgeElementCollection([ke1, ke2, ke3]).toSnapshot(),
});

['recSkillWeb1', 'recSkillWeb2', 'recSkillWeb3'].forEach((skillId) => {
Expand Down Expand Up @@ -340,7 +341,7 @@ describe('Integration | Domain | Use Cases | start-writing-campaign-assessment-r
databaseBuilder.factory.buildKnowledgeElementSnapshot({
userId: participant.id,
snappedAt: sharedAt,
snapshot: JSON.stringify([ke1, ke2, ke3]),
snapshot: new KnowledgeElementCollection([ke1, ke2, ke3]).toSnapshot(),
});

['recSkillWeb1', 'recSkillWeb2', 'recSkillWeb3'].forEach((skillId) => {
Expand Down Expand Up @@ -449,7 +450,7 @@ describe('Integration | Domain | Use Cases | start-writing-campaign-assessment-r
databaseBuilder.factory.buildKnowledgeElementSnapshot({
userId: participant.id,
snappedAt: sharedAt,
snapshot: JSON.stringify([ke1, ke2, ke3]),
snapshot: new KnowledgeElementCollection([ke1, ke2, ke3]).toSnapshot(),
});

['recSkillWeb1', 'recSkillWeb2', 'recSkillWeb3'].forEach((skillId) => {
Expand Down Expand Up @@ -694,7 +695,7 @@ describe('Integration | Domain | Use Cases | start-writing-campaign-assessment-r
databaseBuilder.factory.buildKnowledgeElementSnapshot({
userId: participant.id,
snappedAt: sharedAt,
snapshot: JSON.stringify([ke1, ke2, ke3]),
snapshot: new KnowledgeElementCollection([ke1, ke2, ke3]).toSnapshot(),
});

['recSkillWeb1', 'recSkillWeb2', 'recSkillWeb3'].forEach((skillId) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
CampaignExternalIdTypes,
CampaignParticipationStatuses,
} from '../../../../../../src/prescription/shared/domain/constants.js';
import { KnowledgeElementCollection } from '../../../../../../src/prescription/shared/domain/models/KnowledgeElementCollection.js';
import {
CAMPAIGN_FEATURES,
MAX_REACHABLE_LEVEL,
Expand Down Expand Up @@ -96,7 +97,7 @@ describe('Integration | Domain | Use Cases | start-writing-profiles-collection-c
databaseBuilder.factory.buildKnowledgeElementSnapshot({
userId: participant.id,
snappedAt: sharedAt,
snapshot: JSON.stringify([ke1, ke2, ke3, ke4, ke5]),
snapshot: new KnowledgeElementCollection([ke1, ke2, ke3, ke4, ke5]).toSnapshot(),
});

databaseBuilder.factory.learningContent.buildFramework({
Expand Down
Loading

0 comments on commit b17e8a7

Please sign in to comment.