Skip to content

Commit

Permalink
refactor(api): inline findValidatedGroupedByTubesWithinCampaign
Browse files Browse the repository at this point in the history
  • Loading branch information
lionelB committed Jan 29, 2025
1 parent 26c9295 commit 01894b1
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 257 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,12 @@ const getCampaignAnalysis = async function (campaignId, campaignLearningContent,
});

for (const userIdsAndSharedDates of userIdsAndSharedDatesChunks) {
const knowledgeElementsByTube = await knowledgeElementRepository.findValidatedGroupedByTubesWithinCampaign(
const knowledgeElementsByUsers = await knowledgeElementRepository.findSnapshotForUsers(
Object.fromEntries(userIdsAndSharedDates),
campaignLearningContent,
);

const knowledgeElementsByTube = campaignLearningContent.getValidatedKnowledgeElementsGroupedByTube(
Object.values(knowledgeElementsByUsers).flat(),
);
campaignAnalysis.addToTubeRecommendations({ knowledgeElementsByTube });
}
Expand All @@ -44,11 +47,13 @@ const getCampaignParticipationAnalysis = async function (
tutorials,
participantCount: 1,
});

const knowledgeElementsByTube = await knowledgeElementRepository.findValidatedGroupedByTubesWithinCampaign(
{ [campaignParticipation.userId]: campaignParticipation.sharedAt },
campaignLearningContent,
const knowledgeElementsByUser = await knowledgeElementRepository.findSnapshotForUsers({
[campaignParticipation.userId]: campaignParticipation.sharedAt,
});
const knowledgeElementsByTube = campaignLearningContent.getValidatedKnowledgeElementsGroupedByTube(
Object.values(knowledgeElementsByUser).flat(),
);

campaignAnalysis.addToTubeRecommendations({ knowledgeElementsByTube });

campaignAnalysis.finalize(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,12 +105,6 @@ const findUniqByUserIdGroupedByCompetenceId = async function ({ userId, limitDat
return _.groupBy(knowledgeElements, 'competenceId');
};

const findValidatedGroupedByTubesWithinCampaign = async function (userIdsAndDates, campaignLearningContent) {
const knowledgeElementsGroupedByUser = await findSnapshotForUsers(userIdsAndDates);

return campaignLearningContent.getValidatedKnowledgeElementsGroupedByTube(_.flatMap(knowledgeElementsGroupedByUser));
};

const findInvalidatedAndDirectByUserId = async function (userId) {
const invalidatedKnowledgeElements = await knex(tableName)
.where({
Expand Down Expand Up @@ -138,5 +132,4 @@ export {
findUniqByUserIdAndCompetenceId,
findUniqByUserIdGroupedByCompetenceId,
findUniqByUserIds,
findValidatedGroupedByTubesWithinCampaign,
};
Original file line number Diff line number Diff line change
Expand Up @@ -312,250 +312,6 @@ describe('Integration | Repository | knowledgeElementRepository', function () {
});
});

describe('#findValidatedGroupedByTubesWithinCampaign', function () {
it('should return knowledge elements within respective dates grouped by userId and tubeId within target profile of campaign', async function () {
// given
const skill1 = domainBuilder.buildSkill({ id: 'skill1', tubeId: 'tube1' });
const skill2 = domainBuilder.buildSkill({ id: 'skill2', tubeId: 'tube1' });
const skill3 = domainBuilder.buildSkill({ id: 'skill3', tubeId: 'tube2' });
const tube1 = domainBuilder.buildTube({
id: 'tube1',
skills: [skill1, skill2],
competenceId: 'competence',
});
const tube2 = domainBuilder.buildTube({ id: 'tube2', skills: [skill3], competenceId: 'competence' });
const competence = domainBuilder.buildCompetence({
id: 'competence',
tubes: [tube1, tube2],
});
const area = domainBuilder.buildArea({ id: 'areaId', competences: [competence] });
const framework = domainBuilder.buildFramework({ areas: [area] });
const targetProfile = domainBuilder.buildCampaignLearningContent.fromFrameworks([framework]);
const userId1 = databaseBuilder.factory.buildUser().id;
const userId2 = databaseBuilder.factory.buildUser().id;
const dateUserId1 = new Date('2020-01-03');
const dateUserId2 = new Date('2019-01-03');
const knowledgeElement1_1 = databaseBuilder.factory.buildKnowledgeElement({
competenceId: competence.id,
userId: userId1,
createdAt: new Date('2020-01-02'),
skillId: skill1.id,
});
const knowledgeElement1_2 = databaseBuilder.factory.buildKnowledgeElement({
competenceId: competence.id,
userId: userId1,
createdAt: new Date('2020-01-02'),
skillId: skill2.id,
});
databaseBuilder.factory.buildKnowledgeElement({
competenceId: competence.id,
userId: userId1,
createdAt: new Date('2021-01-02'),
});
const knowledgeElement2_1 = databaseBuilder.factory.buildKnowledgeElement({
competenceId: competence.id,
userId: userId2,
createdAt: new Date('2019-01-02'),
skillId: skill1.id,
});
const knowledgeElement2_2 = databaseBuilder.factory.buildKnowledgeElement({
competenceId: competence.id,
userId: userId2,
createdAt: new Date('2019-01-02'),
skillId: skill3.id,
});
databaseBuilder.factory.buildKnowledgeElement({
competenceId: competence.id,
userId: userId2,
createdAt: new Date('2020-01-02'),
});
await databaseBuilder.commit();

// when
const knowledgeElementsByTubeId = await knowledgeElementRepository.findValidatedGroupedByTubesWithinCampaign(
{ [userId1]: dateUserId1, [userId2]: dateUserId2 },
targetProfile,
);

// then
expect(knowledgeElementsByTubeId[tube1.id][0]).to.be.instanceOf(KnowledgeElement);
expect(knowledgeElementsByTubeId[tube1.id]).to.deep.include.members([
knowledgeElement1_1,
knowledgeElement1_2,
knowledgeElement2_1,
]);
expect(knowledgeElementsByTubeId[tube2.id]).to.deep.include.members([knowledgeElement2_2]);
});

it('should return the knowledge elements in the snapshot when user has a snapshot for this date', async function () {
// given
const learningContent = domainBuilder.buildCampaignLearningContent.withSimpleContent();
const campaignParticipationId = databaseBuilder.factory.buildCampaignParticipation().id;

const userId = databaseBuilder.factory.buildUser().id;
const dateUserId = new Date('2020-01-03');
const knowledgeElement = databaseBuilder.factory.buildKnowledgeElement({
userId,
skillId: learningContent.skills[0].id,
});
databaseBuilder.factory.buildKnowledgeElementSnapshot({
userId,
snappedAt: dateUserId,
snapshot: JSON.stringify([knowledgeElement]),
campaignParticipationId,
});
await databaseBuilder.commit();

// when
const knowledgeElementsByTubeId = await knowledgeElementRepository.findValidatedGroupedByTubesWithinCampaign(
{ [userId]: dateUserId },
learningContent,
);

// then
expect(knowledgeElementsByTubeId[learningContent.tubes[0].id][0]).to.deep.equal(knowledgeElement);
});

context('when user does not have a snapshot for this date', function () {
context('when no date is provided along with the user', function () {
it('should return the knowledge elements with limit date as now', async function () {
// given
const learningContent = domainBuilder.buildCampaignLearningContent.withSimpleContent();
const userId = databaseBuilder.factory.buildUser().id;
const expectedKnowledgeElement = databaseBuilder.factory.buildKnowledgeElement({
userId,
createdAt: new Date('2018-01-01'),
skillId: learningContent.skills[0].id,
});
await databaseBuilder.commit();

// when
const knowledgeElementsByTubeId = await knowledgeElementRepository.findValidatedGroupedByTubesWithinCampaign(
{ [userId]: null },
learningContent,
);

// then
expect(knowledgeElementsByTubeId).to.deep.equal({
[learningContent.tubes[0].id]: [expectedKnowledgeElement],
});
});

it('should not trigger snapshotting', async function () {
// given
const learningContent = domainBuilder.buildCampaignLearningContent.withSimpleContent();
const userId = databaseBuilder.factory.buildUser().id;
databaseBuilder.factory.buildKnowledgeElement({
userId,
createdAt: new Date('2018-01-01'),
skillId: learningContent.skills[0].id,
});
await databaseBuilder.commit();

// when
await knowledgeElementRepository.findValidatedGroupedByTubesWithinCampaign(
{ [userId]: null },
learningContent,
);

// then
const actualUserSnapshots = await knex.select('*').from('knowledge-element-snapshots').where({ userId });
expect(actualUserSnapshots).to.have.lengthOf(0);
});
});

context('when a date is provided along with the user', function () {
it('should return the knowledge elements at date', async function () {
// given
const learningContent = domainBuilder.buildCampaignLearningContent.withSimpleContent();
const userId = databaseBuilder.factory.buildUser().id;
const expectedKnowledgeElement = databaseBuilder.factory.buildKnowledgeElement({
userId,
createdAt: new Date('2018-01-01'),
skillId: learningContent.skills[0].id,
});
await databaseBuilder.commit();

// when
const knowledgeElementsByTubeId = await knowledgeElementRepository.findValidatedGroupedByTubesWithinCampaign(
{ [userId]: new Date('2018-02-01') },
learningContent,
);

// then
expect(knowledgeElementsByTubeId).to.deep.equal({
[learningContent.tubes[0].id]: [expectedKnowledgeElement],
});
});
});
});

it('should avoid returning non targeted knowledge elements when there are knowledge elements that are not in the target profile', async function () {
// given
const learningContent = domainBuilder.buildCampaignLearningContent.withSimpleContent();
const userId = databaseBuilder.factory.buildUser().id;
databaseBuilder.factory.buildKnowledgeElement({
userId,
createdAt: new Date('2018-01-01'),
skillId: 'id_de_skill_improbable_et_different_de_celui_du_builder',
});
await databaseBuilder.commit();

// when
const knowledgeElementsByTubeId = await knowledgeElementRepository.findValidatedGroupedByTubesWithinCampaign(
{ [userId]: null },
learningContent,
);

// then
expect(knowledgeElementsByTubeId).to.deep.equal({
[learningContent.tubes[0].id]: [],
});
});

it('should exclusively return validated knowledge elements', async function () {
// given
const learningContent = domainBuilder.buildCampaignLearningContent.withSimpleContent();
const userId = databaseBuilder.factory.buildUser().id;
databaseBuilder.factory.buildKnowledgeElement({
userId,
createdAt: new Date('2018-01-01'),
skillId: learningContent.skills[0].id,
status: 'invalidated',
});
await databaseBuilder.commit();

// when
const knowledgeElementsByTubeId = await knowledgeElementRepository.findValidatedGroupedByTubesWithinCampaign(
{ [userId]: null },
learningContent,
);

// then
expect(knowledgeElementsByTubeId).to.deep.equal({
[learningContent.tubes[0].id]: [],
});
});

it('should return an empty array on tube that does not have any targeted knowledge elements', async function () {
// given
const learningContent = domainBuilder.buildCampaignLearningContent.withSimpleContent();
const userId = databaseBuilder.factory.buildUser().id;
await databaseBuilder.commit();

// when
const knowledgeElementsByTubeId = await knowledgeElementRepository.findValidatedGroupedByTubesWithinCampaign(
{ [userId]: null },
learningContent,
);

// then
expect(knowledgeElementsByTubeId).to.deep.equal({
[learningContent.tubes[0].id]: [],
});
});
});

describe('#findSnapshotForUsers', function () {
let sandbox;
let userId1;
Expand Down

0 comments on commit 01894b1

Please sign in to comment.