diff --git a/api/db/database-builder/factory/build-knowledge-element-snapshot.js b/api/db/database-builder/factory/build-knowledge-element-snapshot.js index 24c1529f4f2..00883a7acce 100644 --- a/api/db/database-builder/factory/build-knowledge-element-snapshot.js +++ b/api/db/database-builder/factory/build-knowledge-element-snapshot.js @@ -7,24 +7,20 @@ import { buildUser } from './build-user.js'; const buildKnowledgeElementSnapshot = function ({ id = databaseBuffer.getNextId(), - userId, - snappedAt = new Date('2020-01-01'), snapshot, campaignParticipationId, + userId, } = {}) { - const dateMinusOneDay = new Date(snappedAt.getTime() - 1000 * 60 * 60 * 24 * 7); - userId = _.isUndefined(userId) ? buildUser().id : userId; if (!snapshot) { const knowledgeElements = []; - knowledgeElements.push(buildKnowledgeElement({ userId, createdAt: dateMinusOneDay })); - knowledgeElements.push(buildKnowledgeElement({ userId, createdAt: dateMinusOneDay })); + userId = _.isUndefined(userId) ? buildUser().id : userId; + knowledgeElements.push(buildKnowledgeElement({ userId, createdAt: new Date('2020-01-01') })); + knowledgeElements.push(buildKnowledgeElement({ userId, createdAt: new Date('2020-01-01') })); snapshot = new KnowledgeElementCollection(knowledgeElements).toSnapshot(); } const values = { id, - userId, - snappedAt, snapshot, campaignParticipationId, }; diff --git a/api/db/database-builder/factory/knowledge-elements-snapshot-factory.js b/api/db/database-builder/factory/knowledge-elements-snapshot-factory.js index d6b6c896cf7..c2cfc0da193 100644 --- a/api/db/database-builder/factory/knowledge-elements-snapshot-factory.js +++ b/api/db/database-builder/factory/knowledge-elements-snapshot-factory.js @@ -1,13 +1,11 @@ import { databaseBuffer } from '../database-buffer.js'; import { buildKnowledgeElement } from './build-knowledge-element.js'; -function buildSnapshot({ id, userId, snappedAt, knowledgeElementsAttributes, campaignParticipationId }) { +function buildSnapshot({ id, knowledgeElementsAttributes, campaignParticipationId }) { const knowledgeElements = knowledgeElementsAttributes.map((attributes) => buildKnowledgeElement(attributes)); const values = { id, - userId, - snappedAt, snapshot: JSON.stringify(knowledgeElements), campaignParticipationId, }; diff --git a/api/db/seeds/data/common/tooling/campaign-tooling.js b/api/db/seeds/data/common/tooling/campaign-tooling.js index e3cb43e9638..5d351ddc194 100644 --- a/api/db/seeds/data/common/tooling/campaign-tooling.js +++ b/api/db/seeds/data/common/tooling/campaign-tooling.js @@ -238,8 +238,6 @@ async function createAssessmentCampaign({ if (isShared) { databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: sharedAt, snapshot: new KnowledgeElementCollection(keDataForSnapshot).toSnapshot(), campaignParticipationId, }); @@ -402,8 +400,6 @@ async function createProfilesCollectionCampaign({ ); } databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: sharedAt, snapshot: new KnowledgeElementCollection(keDataForSnapshot).toSnapshot(), campaignParticipationId, }); diff --git a/api/scripts/prod/generate-knowledge-element-snapshots-for-campaigns.js b/api/scripts/prod/generate-knowledge-element-snapshots-for-campaigns.js index b0da1f44871..def2e2219fe 100644 --- a/api/scripts/prod/generate-knowledge-element-snapshots-for-campaigns.js +++ b/api/scripts/prod/generate-knowledge-element-snapshots-for-campaigns.js @@ -46,21 +46,17 @@ function _validateAndNormalizeArgs({ concurrency, maxSnapshotCount }) { async function getEligibleCampaignParticipations(maxSnapshotCount) { return knex('campaign-participations') - .select('campaign-participations.userId', 'campaign-participations.sharedAt', 'campaign-participations.id') - .leftJoin('knowledge-element-snapshots', function () { - this.on('knowledge-element-snapshots.userId', 'campaign-participations.userId').andOn( - 'knowledge-element-snapshots.snappedAt', - 'campaign-participations.sharedAt', - ); - }) + .select('campaign-participations.id', 'campaign-participations.userId', 'campaign-participations.sharedAt') + .leftJoin( + 'knowledge-element-snapshots', + 'knowledge-element-snapshots.campaignParticipationId', + 'campaign-participations.id', + ) .whereNotNull('campaign-participations.sharedAt') .where((qb) => { - qb.whereNull('knowledge-element-snapshots.snappedAt').orWhereRaw('?? != ??', [ - 'campaign-participations.sharedAt', - 'knowledge-element-snapshots.snappedAt', - ]); + qb.whereNull('knowledge-element-snapshots.campaignParticipationId'); }) - .orderBy('campaign-participations.userId') + .orderBy('campaign-participations.id') .limit(maxSnapshotCount); } @@ -79,8 +75,6 @@ async function generateKnowledgeElementSnapshots( }); try { await dependencies.knowledgeElementSnapshotRepository.save({ - userId, - snappedAt: sharedAt, snapshot: new KnowledgeElementCollection(knowledgeElements).toSnapshot(), campaignParticipationId: id, }); diff --git a/api/scripts/prod/populate-campaign-participation-id-in-knowledge-element-snapshot.js b/api/scripts/prod/populate-campaign-participation-id-in-knowledge-element-snapshot.js deleted file mode 100644 index e0a79a3328b..00000000000 --- a/api/scripts/prod/populate-campaign-participation-id-in-knowledge-element-snapshot.js +++ /dev/null @@ -1,159 +0,0 @@ -import { knex } from '../../db/knex-database-connection.js'; -import { Script } from '../../src/shared/application/scripts/script.js'; -import { ScriptRunner } from '../../src/shared/application/scripts/script-runner.js'; - -const DEFAULT_CHUNK_SIZE = 10000; -const DEFAULT_PAUSE_DURATION = 2000; - -const pause = async (duration) => { - return new Promise((resolve) => { - setTimeout(resolve, duration); - }); -}; - -function getEmptyParticipationKnowlegdeElementSnapshotIds(firstId, size = DEFAULT_CHUNK_SIZE) { - return knex('knowledge-element-snapshots') - .whereNull('campaignParticipationId') - .where('id', '>=', firstId) - .orderBy('id', 'asc') - .pluck('id') - .limit(size); -} - -// Définition du script -export class PopulateCampaignParticipationIdScript extends Script { - constructor() { - super({ - description: - 'This script will populate the column knowledge-element-snapshots.campaignParticipationId with campaign-participations.id', - permanent: false, - options: { - chunkSize: { - type: 'number', - default: DEFAULT_CHUNK_SIZE, - description: 'number of records to update in one update', - }, - pauseDuration: { - type: 'number', - default: DEFAULT_PAUSE_DURATION, - description: 'Time in ms between each chunk processing', - }, - }, - }); - } - - async handle({ options, logger, dependencies = { pause } }) { - const result = await knex('knowledge-element-snapshots').count().whereNull('campaignParticipationId').first(); - - if (result.count === 0) { - logger.info( - { event: 'PopulateCampaignParticipationIdScript' }, - `There is no knowledge-element-snapshot with missing campaignParticipationId. Job done !`, - ); - return; - } else { - logger.info( - { event: 'PopulateCampaignParticipationIdScript' }, - `Try to populate ${result.count} missing campaignParticipationId`, - ); - } - - let ids = await getEmptyParticipationKnowlegdeElementSnapshotIds(0, options.chunkSize); - let totalUddatedRows = 0; - while (ids.length > 0) { - const updatedRows = await knex('knowledge-element-snapshots') - .whereNull('campaignParticipationId') - .updateFrom('campaign-participations') - .update({ - campaignParticipationId: knex.ref('campaign-participations.id'), - }) - .where('knowledge-element-snapshots.snappedAt', knex.ref('campaign-participations.sharedAt')) - .where('knowledge-element-snapshots.userId', knex.ref('campaign-participations.userId')) - .whereIn('knowledge-element-snapshots.id', ids); - - totalUddatedRows += updatedRows; - logger.info( - { event: 'PopulateCampaignParticipationIdScript' }, - `loop: ${updatedRows} rows updated from "knwoledge-element-snapshots"`, - ); - - ids = await getEmptyParticipationKnowlegdeElementSnapshotIds(ids[ids.length - 1] + 1, options.chunkSize); - if (ids.length > 0 && options.pauseDuration > 0) { - await dependencies.pause(options.pauseDuration); - } - } - logger.info( - { event: 'PopulateCampaignParticipationIdScript' }, - `${totalUddatedRows} rows updated from "knowledge-element-snapshots"`, - ); - let emptyRowResult = await knex('knowledge-element-snapshots').count().whereNull('campaignParticipationId').first(); - if (emptyRowResult.count === 0) { - logger.info( - { event: 'PopulateCampaignParticipationIdScript' }, - `No row with empty campaignParticipationId to update. Job done !`, - ); - return; - } else { - logger.info(`${emptyRowResult.count} rows with empty campaignParticipationId to update`); - } - const anonymisedParticipations = await knex('campaign-participations') - .select(['campaign-participations.id', 'sharedAt']) - .join('campaigns', function () { - this.on('campaigns.id', 'campaign-participations.campaignId'); - }) - .whereNull('userId') - .whereNotNull('sharedAt'); - - const emptyKeSnapshotParticipations = await knex('knowledge-element-snapshots') - .whereNull('campaignParticipationId') - .select(['id', 'snappedAt']); - - logger.info( - { event: 'PopulateCampaignParticipationIdScript' }, - `Try to populate ${emptyKeSnapshotParticipations.length} keSnapshot from ${anonymisedParticipations.length} anonymised participations`, - ); - - const matchingSnapshotAndParticipations = emptyKeSnapshotParticipations.flatMap(({ id, snappedAt }) => { - const participations = anonymisedParticipations.filter( - ({ sharedAt }) => snappedAt.toISOString() === sharedAt.toISOString(), - ); - if (participations.length !== 1) { - return []; - } - return [{ keSnapshotId: id, campaignParticipationId: participations[0].id }]; - }); - - await knex.transaction(async (trx) => { - for (const row of matchingSnapshotAndParticipations) { - await trx('knowledge-element-snapshots') - .update({ campaignParticipationId: row.campaignParticipationId }) - .where({ id: row.keSnapshotId }); - } - }); - - logger.info( - { event: 'PopulateCampaignParticipationIdScript' }, - `Populate ${matchingSnapshotAndParticipations.length} anonymised participations`, - ); - - emptyRowResult = await knex('knowledge-element-snapshots') - .select('id') - .whereNull('campaignParticipationId') - .pluck('id'); - - if (emptyRowResult.length === 0) { - logger.info( - { event: 'PopulateCampaignParticipationIdScript' }, - `No row with empty campaignParticipationId to update. Job done !`, - ); - } else { - logger.info( - { event: 'PopulateCampaignParticipationIdScript', ids: emptyRowResult }, - `${emptyRowResult.length} rows with empty campaignParticipationId to update`, - ); - } - } -} - -// Exécution du script -await ScriptRunner.execute(import.meta.url, PopulateCampaignParticipationIdScript); diff --git a/api/src/prescription/campaign-participation/infrastructure/repositories/campaign-participation-repository.js b/api/src/prescription/campaign-participation/infrastructure/repositories/campaign-participation-repository.js index f527caf84dc..b32ab852fab 100644 --- a/api/src/prescription/campaign-participation/infrastructure/repositories/campaign-participation-repository.js +++ b/api/src/prescription/campaign-participation/infrastructure/repositories/campaign-participation-repository.js @@ -38,8 +38,6 @@ const updateWithSnapshot = async function (campaignParticipation) { limitDate: campaignParticipation.sharedAt, }); await knowledgeElementSnapshotRepository.save({ - userId: campaignParticipation.userId, - snappedAt: campaignParticipation.sharedAt, snapshot: new KnowledgeElementCollection(knowledgeElements).toSnapshot(), campaignParticipationId: campaignParticipation.id, }); diff --git a/api/src/prescription/campaign/application/api/knowledge-element-snapshots-api.js b/api/src/prescription/campaign/application/api/knowledge-element-snapshots-api.js index d4a15411906..5b5c13e004b 100644 --- a/api/src/prescription/campaign/application/api/knowledge-element-snapshots-api.js +++ b/api/src/prescription/campaign/application/api/knowledge-element-snapshots-api.js @@ -22,8 +22,6 @@ import { KnowledgeElementSnapshot } from './models/KnowledgeElementSnapshot.js'; */ export async function save(knowledgeElementSnapshotPayload) { await usecases.saveKnowledgeElementSnapshotForParticipation({ - userId: knowledgeElementSnapshotPayload.userId, - snappedAt: new Date(), knowledgeElementCollection: new KnowledgeElementCollection(knowledgeElementSnapshotPayload.knowledgeElements), campaignParticipationId: knowledgeElementSnapshotPayload.campaignParticipationId, }); diff --git a/api/src/prescription/campaign/domain/usecases/save-knowledge-element-snapshot-for-participation.js b/api/src/prescription/campaign/domain/usecases/save-knowledge-element-snapshot-for-participation.js index 861b68a5910..47b5831a369 100644 --- a/api/src/prescription/campaign/domain/usecases/save-knowledge-element-snapshot-for-participation.js +++ b/api/src/prescription/campaign/domain/usecases/save-knowledge-element-snapshot-for-participation.js @@ -1,15 +1,11 @@ import { withTransaction } from '../../../../shared/domain/DomainTransaction.js'; export const saveKnowledgeElementSnapshotForParticipation = withTransaction(async function ({ - userId, - snappedAt, knowledgeElementCollection, campaignParticipationId, knowledgeElementSnapshotRepository, }) { await knowledgeElementSnapshotRepository.save({ - userId, - snappedAt, snapshot: knowledgeElementCollection.toSnapshot(), campaignParticipationId, }); diff --git a/api/src/prescription/campaign/infrastructure/repositories/knowledge-element-snapshot-repository.js b/api/src/prescription/campaign/infrastructure/repositories/knowledge-element-snapshot-repository.js index 49b5a71078d..802cf1727d5 100644 --- a/api/src/prescription/campaign/infrastructure/repositories/knowledge-element-snapshot-repository.js +++ b/api/src/prescription/campaign/infrastructure/repositories/knowledge-element-snapshot-repository.js @@ -2,7 +2,7 @@ import { DomainTransaction } from '../../../../shared/domain/DomainTransaction.j import { KnowledgeElement } from '../../../../shared/domain/models/KnowledgeElement.js'; import { CampaignParticipationKnowledgeElementSnapshots } from '../../../shared/domain/read-models/CampaignParticipationKnowledgeElementSnapshots.js'; -export async function save({ userId, snappedAt, snapshot, campaignParticipationId }) { +export async function save({ snapshot, campaignParticipationId }) { const knexConn = DomainTransaction.getConnection(); const existingSnapshot = await knexConn .select('id') @@ -12,15 +12,11 @@ export async function save({ userId, snappedAt, snapshot, campaignParticipationI if (existingSnapshot) { return await knexConn('knowledge-element-snapshots') .update({ - userId, - snappedAt, snapshot, }) .where('campaignParticipationId', campaignParticipationId); } else { return await knexConn('knowledge-element-snapshots').insert({ - userId, - snappedAt, snapshot, campaignParticipationId, }); diff --git a/api/src/prescription/scripts/add-missing-knowledge-element-snapshots.js b/api/src/prescription/scripts/add-missing-knowledge-element-snapshots.js index 6563fdac7b7..24847b17506 100644 --- a/api/src/prescription/scripts/add-missing-knowledge-element-snapshots.js +++ b/api/src/prescription/scripts/add-missing-knowledge-element-snapshots.js @@ -69,8 +69,6 @@ class AddMissingKnowledgeElementSnapshots extends Script { limitDate: participation.sharedAt, }); await knowledgeElementSnapshotRepository.save({ - userId: participation.userId, - snappedAt: participation.sharedAt, snapshot: new KnowledgeElementCollection(knowledgeElements).toSnapshot(), campaignParticipationId, }); diff --git a/api/tests/evaluation/integration/domain/usecases/get-next-challenge-for-campaign-assessment_test.js b/api/tests/evaluation/integration/domain/usecases/get-next-challenge-for-campaign-assessment_test.js index efd91e049e5..489ead07a1e 100644 --- a/api/tests/evaluation/integration/domain/usecases/get-next-challenge-for-campaign-assessment_test.js +++ b/api/tests/evaluation/integration/domain/usecases/get-next-challenge-for-campaign-assessment_test.js @@ -133,8 +133,6 @@ describe('Evaluation | Integration | Domain | Use Cases | get-next-challenge-for }); const knowledgeElementsBefore = new KnowledgeElementCollection([knowledgeElement]); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: new Date('2019-01-01'), campaignParticipationId, snapshot: knowledgeElementsBefore.toSnapshot(), }); diff --git a/api/tests/evaluation/integration/domain/usecases/handle-badge-acquisition_test.js b/api/tests/evaluation/integration/domain/usecases/handle-badge-acquisition_test.js index 378048f66e0..b17e18cab2e 100644 --- a/api/tests/evaluation/integration/domain/usecases/handle-badge-acquisition_test.js +++ b/api/tests/evaluation/integration/domain/usecases/handle-badge-acquisition_test.js @@ -168,8 +168,6 @@ describe('Integration | Usecase | Handle Badge Acquisition', function () { }); const knowledgeElementsBefore = new KnowledgeElementCollection([ke1, ke2]); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: new Date(), campaignParticipationId, snapshot: knowledgeElementsBefore.toSnapshot(), }); diff --git a/api/tests/evaluation/integration/domain/usecases/handle-stage-acquisition_test.js b/api/tests/evaluation/integration/domain/usecases/handle-stage-acquisition_test.js index d8f3c5b523c..968d87ce4c4 100644 --- a/api/tests/evaluation/integration/domain/usecases/handle-stage-acquisition_test.js +++ b/api/tests/evaluation/integration/domain/usecases/handle-stage-acquisition_test.js @@ -305,8 +305,6 @@ describe('Evaluation | Integration | Usecase | Handle Stage Acquisition', functi domainBuilder.buildKnowledgeElement({ userId, skillId: 'web4', status: 'invalidated' }), ]; databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: new Date(), snapshot: new KnowledgeElementCollection(knowledgeElements).toSnapshot(), campaignParticipationId, }); @@ -449,8 +447,6 @@ describe('Evaluation | Integration | Usecase | Handle Stage Acquisition', functi domainBuilder.buildKnowledgeElement({ userId, skillId: 'web4', status: 'invalidated' }), ]; databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: new Date(), snapshot: new KnowledgeElementCollection(knowledgeElements).toSnapshot(), campaignParticipationId, }); diff --git a/api/tests/evaluation/integration/domain/usecases/save-and-correct-answer-for-campaign_test.js b/api/tests/evaluation/integration/domain/usecases/save-and-correct-answer-for-campaign_test.js index e321ad02bec..772fa85a857 100644 --- a/api/tests/evaluation/integration/domain/usecases/save-and-correct-answer-for-campaign_test.js +++ b/api/tests/evaluation/integration/domain/usecases/save-and-correct-answer-for-campaign_test.js @@ -207,8 +207,6 @@ describe('Evaluation | Integration | Usecase | Save and correct answer for campa }); const knowledgeElementsBefore = new KnowledgeElementCollection([knowledgeElement]); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: new Date('2019-01-01'), campaignParticipationId, snapshot: knowledgeElementsBefore.toSnapshot(), }); diff --git a/api/tests/integration/scripts/prod/clean-ke-snapshots_test.js b/api/tests/integration/scripts/prod/clean-ke-snapshots_test.js index 02e0ef2df4b..2df43f59d80 100644 --- a/api/tests/integration/scripts/prod/clean-ke-snapshots_test.js +++ b/api/tests/integration/scripts/prod/clean-ke-snapshots_test.js @@ -65,23 +65,20 @@ describe('Script | Prod | Clean knowledge-element-snapshot snapshot (jsonb)', fu databaseBuilder.factory.knowledgeElementSnapshotFactory.buildSnapshot({ id: 1, - userId: user.id, - snappedAt: participation.sharedAt, knowledgeElementsAttributes: [{ skillId: 'skill_1', status: 'validated', earnedPix: 40, userId: user.id }], + campaignParticipationId: participation.id, }); databaseBuilder.factory.knowledgeElementSnapshotFactory.buildSnapshot({ id: 2, - userId: user.id, - snappedAt: participation2.sharedAt, knowledgeElementsAttributes: [{ skillId: 'skill_2', status: 'validated', earnedPix: 40, userId: user.id }], + campaignParticipationId: participation2.id, }); databaseBuilder.factory.knowledgeElementSnapshotFactory.buildSnapshot({ id: 3, - userId: user.id, - snappedAt: participation3.sharedAt, knowledgeElementsAttributes: [ { skillId: 'skill_2', status: 'validated', earnedPix: 40, userId: null, assessmentId: null, answerId: null }, ], + campaignParticipationId: participation3.id, }); await databaseBuilder.commit(); diff --git a/api/tests/integration/scripts/prod/compute-participation-results_test.js b/api/tests/integration/scripts/prod/compute-participation-results_test.js index 0fc9f3d7ba7..3967049257e 100644 --- a/api/tests/integration/scripts/prod/compute-participation-results_test.js +++ b/api/tests/integration/scripts/prod/compute-participation-results_test.js @@ -250,8 +250,6 @@ function _buildParticipationWithSnapshot(participationAttributes, knowledgeEleme const participation = databaseBuilder.factory.buildCampaignParticipation(participationAttributes); databaseBuilder.factory.knowledgeElementSnapshotFactory.buildSnapshot({ - userId: participation.userId, - snappedAt: participation.sharedAt, knowledgeElementsAttributes, campaignParticipationId: participation.id, }); diff --git a/api/tests/integration/scripts/prod/generate-knowledge-element-snapshots-for-campaigns_test.js b/api/tests/integration/scripts/prod/generate-knowledge-element-snapshots-for-campaigns_test.js index c413e26d9f8..094307a22f9 100644 --- a/api/tests/integration/scripts/prod/generate-knowledge-element-snapshots-for-campaigns_test.js +++ b/api/tests/integration/scripts/prod/generate-knowledge-element-snapshots-for-campaigns_test.js @@ -31,7 +31,9 @@ describe('Integration | Scripts | generate-knowledge-element-snapshots-for-campa sharedAt: new Date('2020-01-01'), userId, }); - databaseBuilder.factory.buildKnowledgeElementSnapshot({ snappedAt: campaignParticipation.sharedAt, userId }); + databaseBuilder.factory.buildKnowledgeElementSnapshot({ + campaignParticipationId: campaignParticipation.id, + }); await databaseBuilder.commit(); // when @@ -71,10 +73,23 @@ describe('Integration | Scripts | generate-knowledge-element-snapshots-for-campa sharedAt: new Date('2020-01-01'), userId, }); - databaseBuilder.factory.buildCampaignParticipation({ sharedAt: new Date('2020-02-01'), userId }); - databaseBuilder.factory.buildCampaignParticipation({ sharedAt: new Date('2020-03-01'), userId }); - databaseBuilder.factory.buildKnowledgeElementSnapshot({ snappedAt: new Date('2020-02-01'), userId }); - databaseBuilder.factory.buildKnowledgeElementSnapshot({ snappedAt: new Date('2020-03-01'), userId }); + + const firstCampaignParticiationId = databaseBuilder.factory.buildCampaignParticipation({ + sharedAt: new Date('2020-02-01'), + userId, + }).id; + const secondCampaignParticiationId = databaseBuilder.factory.buildCampaignParticipation({ + sharedAt: new Date('2020-03-01'), + userId, + }).id; + databaseBuilder.factory.buildKnowledgeElementSnapshot({ + snappedAt: new Date('2020-02-01'), + campaignParticipationId: firstCampaignParticiationId, + }); + databaseBuilder.factory.buildKnowledgeElementSnapshot({ + snappedAt: new Date('2020-03-01'), + campaignParticipationId: secondCampaignParticiationId, + }); await databaseBuilder.commit(); // when @@ -152,8 +167,6 @@ describe('Integration | Scripts | generate-knowledge-element-snapshots-for-campa // then expect(knowledgeElementSnapshotRepositoryStub.save).to.have.been.calledWithExactly({ - userId: campaignParticipationData[0].userId, - snappedAt: campaignParticipationData[0].sharedAt, snapshot: new KnowledgeElementCollection(expectedKnowledgeElements).toSnapshot(), campaignParticipationId: campaignParticipationData[0].id, }); diff --git a/api/tests/integration/scripts/prod/populate-campaign-participation-id-in-knowledge-element-snapshot_test.js b/api/tests/integration/scripts/prod/populate-campaign-participation-id-in-knowledge-element-snapshot_test.js deleted file mode 100644 index eb6d0b5fd9e..00000000000 --- a/api/tests/integration/scripts/prod/populate-campaign-participation-id-in-knowledge-element-snapshot_test.js +++ /dev/null @@ -1,232 +0,0 @@ -import { PopulateCampaignParticipationIdScript } from '../../../../scripts/prod/populate-campaign-participation-id-in-knowledge-element-snapshot.js'; -import { CampaignTypes } from '../../../../src/prescription/shared/domain/constants.js'; -import { databaseBuilder, expect, knex, sinon } from '../../../test-helper.js'; - -describe('Script | Prod | Delete Organization Learners From Organization', function () { - describe('Options', function () { - it('has the correct options', function () { - // when - const script = new PopulateCampaignParticipationIdScript(); - const { options } = script.metaInfo; - - // then - expect(options.chunkSize).to.deep.include({ - type: 'number', - default: 10000, - description: 'number of records to update in one update', - }); - expect(options.pauseDuration).to.deep.include({ - type: 'number', - default: 2000, - description: 'Time in ms between each chunk processing', - }); - }); - }); - - describe('Handle', function () { - let script; - let logger; - let dependencies; - let user, learner, campaign, otherCampaign; - - beforeEach(async function () { - script = new PopulateCampaignParticipationIdScript(); - logger = { info: sinon.spy(), error: sinon.spy(), debug: sinon.spy() }; - dependencies = { pause: sinon.stub() }; - - user = databaseBuilder.factory.buildUser({ id: 123, firstName: 'Sam', lastName: 'Sagace' }); - learner = databaseBuilder.factory.buildOrganizationLearner({ - userId: user.id, - }); - - campaign = databaseBuilder.factory.buildCampaign({ type: CampaignTypes.PROFILES_COLLECTION }); - otherCampaign = databaseBuilder.factory.buildCampaign(); - await databaseBuilder.commit(); - }); - - describe('no participation', function () { - it('should end early if there no participation to update', async function () { - // when - await script.handle({ options: { chunkSize: 1, pauseDuration: 0 }, logger, dependencies }); - - // then - expect(logger.info).to.have.been.calledWithExactly( - { event: 'PopulateCampaignParticipationIdScript' }, - 'There is no knowledge-element-snapshot with missing campaignParticipationId. Job done !', - ); - }); - }); - - describe('linked participation', function () { - beforeEach(async function () { - // given - const participation = databaseBuilder.factory.buildCampaignParticipation({ - organizationLearnerId: learner.id, - userId: user.id, - campaign: campaign.id, - participantExternalId: null, - createdAt: new Date('2024-12-15'), - sharedAt: new Date('2024-12-16'), - }); - databaseBuilder.factory.knowledgeElementSnapshotFactory.buildSnapshot({ - id: 1, - userId: user.id, - snappedAt: participation.sharedAt, - knowledgeElementsAttributes: [{ skillId: 'skill_1', status: 'validated', earnedPix: 40 }], - }); - const otherParticipation = databaseBuilder.factory.buildCampaignParticipation({ - organizationLearnerId: learner.id, - userId: user.id, - campaign: otherCampaign.id, - participantExternalId: null, - createdAt: new Date('2024-05-09'), - sharedAt: new Date('2024-05-12'), - }); - databaseBuilder.factory.knowledgeElementSnapshotFactory.buildSnapshot({ - id: 2, - userId: user.id, - snappedAt: otherParticipation.sharedAt, - knowledgeElementsAttributes: [{ skillId: 'skill_1', status: 'validated', earnedPix: 40 }], - }); - await databaseBuilder.commit(); - }); - - it('log how many entries will be updated', async function () { - // when - await script.handle({ options: { chunkSize: 1, pauseDuration: 0 }, logger, dependencies }); - - // then - expect( - logger.info.calledWithExactly( - { event: 'PopulateCampaignParticipationIdScript' }, - 'Try to populate 2 missing campaignParticipationId', - ), - ).to.be.true; - }); - - it('populate empty participations one by one', async function () { - // when - await script.handle({ options: { chunkSize: 1, pauseDuration: 0 }, logger, dependencies }); - - // then - const emptyKeSnapshots = await knex('knowledge-element-snapshots') - .whereNull('campaignParticipationId') - .count() - .first(); - expect(emptyKeSnapshots.count).to.equals(0); - expect(logger.info).to.have.been.calledWith( - { event: 'PopulateCampaignParticipationIdScript' }, - `2 rows updated from "knowledge-element-snapshots"`, - ); - expect(logger.info).to.have.been.calledWith( - { event: 'PopulateCampaignParticipationIdScript' }, - 'No row with empty campaignParticipationId to update. Job done !', - ); - }); - - it('populate empty participations using a chunk of 1000', async function () { - // when - await script.handle({ options: { chunkSize: 1000, pauseDuration: 0 }, logger, dependencies }); - - // then - const emptyKeSnapshots = await knex('knowledge-element-snapshots') - .whereNull('campaignParticipationId') - .count() - .first(); - expect(emptyKeSnapshots.count).to.equals(0); - expect(logger.info).to.have.been.calledWith( - { event: 'PopulateCampaignParticipationIdScript' }, - `2 rows updated from "knowledge-element-snapshots"`, - ); - expect(dependencies.pause.called).to.be.false; - expect(logger.info).to.have.been.calledWith( - { event: 'PopulateCampaignParticipationIdScript' }, - 'No row with empty campaignParticipationId to update. Job done !', - ); - }); - - it('should pause between chunk of 1', async function () { - // given - dependencies.pause.resolves(); - - // when - await script.handle({ options: { chunkSize: 1, pauseDuration: 10 }, logger, dependencies }); - const emptyKeSnapshots = await knex('knowledge-element-snapshots') - .whereNull('campaignParticipationId') - .count() - .first(); - - // then - expect(emptyKeSnapshots.count).to.equals(0); - expect(dependencies.pause).to.have.been.calledOnce; - expect(dependencies.pause).to.have.been.calledWith(10); - }); - }); - - describe('anonymised participations', function () { - it('should populate matching unique participation and snapshot', async function () { - // given - const participation = databaseBuilder.factory.buildCampaignParticipation({ - organizationLearnerId: learner.id, - userId: null, - campaign: campaign.id, - participantExternalId: null, - createdAt: new Date('2024-12-15'), - sharedAt: new Date('2014-12-16'), - }); - - databaseBuilder.factory.knowledgeElementSnapshotFactory.buildSnapshot({ - userId: user.id, - snappedAt: participation.sharedAt, - knowledgeElementsAttributes: [{ skillId: 'skill_1', status: 'validated', earnedPix: 40 }], - }); - await databaseBuilder.commit(); - - // when - await script.handle({ options: { chunkSize: 1000, pauseDuration: 0 }, logger, dependencies }); - - // then - const matchingSnapshot = await knex('knowledge-element-snapshots') - .where('snappedAt', participation.sharedAt) - .first(); - expect(matchingSnapshot.campaignParticipationId).to.equals(participation.id); - }); - - it('should not populate when matching multiple participations and snapshot', async function () { - // given - const participation = databaseBuilder.factory.buildCampaignParticipation({ - organizationLearnerId: learner.id, - userId: null, - campaign: campaign.id, - participantExternalId: null, - createdAt: new Date('2024-12-15'), - sharedAt: new Date('2014-12-16'), - }); - databaseBuilder.factory.buildCampaignParticipation({ - userId: null, - participantExternalId: null, - createdAt: new Date('2024-12-15'), - sharedAt: participation.sharedAt, - }); - - databaseBuilder.factory.knowledgeElementSnapshotFactory.buildSnapshot({ - userId: user.id, - snappedAt: participation.sharedAt, - knowledgeElementsAttributes: [{ skillId: 'skill_1', status: 'validated', earnedPix: 40 }], - }); - await databaseBuilder.commit(); - - // when - await script.handle({ options: { chunkSize: 1000, pauseDuration: 0 }, logger, dependencies }); - - //then - const emptyKeSnapshots = await knex('knowledge-element-snapshots') - .whereNull('campaignParticipationId') - .count() - .first(); - - expect(emptyKeSnapshots.count).to.equals(1); - }); - }); - }); -}); diff --git a/api/tests/prescription/campaign-participation/acceptance/application/campaign-participation-route_test.js b/api/tests/prescription/campaign-participation/acceptance/application/campaign-participation-route_test.js index eb3d519c6f9..ad9e8cc895f 100644 --- a/api/tests/prescription/campaign-participation/acceptance/application/campaign-participation-route_test.js +++ b/api/tests/prescription/campaign-participation/acceptance/application/campaign-participation-route_test.js @@ -114,10 +114,8 @@ describe('Acceptance | API | Campaign Participations', function () { }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, snapshot: JSON.stringify([]), campaignParticipationId: campaignParticipation.id, - snappedAt: sharedAt, }); await databaseBuilder.commit(); diff --git a/api/tests/prescription/campaign-participation/integration/domain/usecases/get-user-campaign-assessment-result_test.js b/api/tests/prescription/campaign-participation/integration/domain/usecases/get-user-campaign-assessment-result_test.js index 9e4115d54e0..6f866ff240f 100644 --- a/api/tests/prescription/campaign-participation/integration/domain/usecases/get-user-campaign-assessment-result_test.js +++ b/api/tests/prescription/campaign-participation/integration/domain/usecases/get-user-campaign-assessment-result_test.js @@ -134,8 +134,6 @@ describe('Prescription Integration | UseCase | get-user-campaign-assessment-resu }); const knowledgeElementsBefore = new KnowledgeElementCollection(domainKEs); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: new Date('2019-01-01'), campaignParticipationId, snapshot: knowledgeElementsBefore.toSnapshot(), }); diff --git a/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-analysis-repository_test.js b/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-analysis-repository_test.js index 6728cef3167..c7dec1c4ee0 100644 --- a/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-analysis-repository_test.js +++ b/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-analysis-repository_test.js @@ -312,9 +312,7 @@ describe('Integration | Repository | Campaign analysis repository', function () [userWithCampaignParticipationFred, userWithCampaignParticipationJoe].forEach((participation) => { databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: participation.userId, campaignParticipationId: participation.campaignParticipation.id, - snappedAt: participation.campaignParticipation.sharedAt, snapshot: JSON.stringify( knowledgeElements.filter( ({ userId, createdAt }) => userId === participation.userId && createdAt <= shareDate, @@ -396,9 +394,7 @@ describe('Integration | Repository | Campaign analysis repository', function () ]; const knowledgeElements = keData.map(databaseBuilder.factory.buildKnowledgeElement); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userWithCampaignParticipationFred.userId, campaignParticipationId: userWithCampaignParticipationFred.campaignParticipation.id, - snappedAt: userWithCampaignParticipationFred.campaignParticipation.sharedAt, snapshot: JSON.stringify(knowledgeElements.filter(({ createdAt }) => createdAt <= shareDate)), }); return databaseBuilder.commit(); diff --git a/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-participation-repository_test.js b/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-participation-repository_test.js index 27eff471ebd..7be90c997a4 100644 --- a/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-participation-repository_test.js +++ b/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-participation-repository_test.js @@ -155,8 +155,6 @@ describe('Integration | Repository | Campaign Participation', function () { }); const knowledgeElementsBefore = new KnowledgeElementCollection([knowledgeElement1, knowledgeElement2]); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: new Date('2019-01-01'), campaignParticipationId: campaignParticipation.id, snapshot: knowledgeElementsBefore.toSnapshot(), }); diff --git a/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-participation-result-repository_test.js b/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-participation-result-repository_test.js index 83c25c05ad8..e01a79fda20 100644 --- a/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-participation-result-repository_test.js +++ b/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-participation-result-repository_test.js @@ -131,8 +131,6 @@ describe('Integration | Repository | Campaign Participation Result', function () }, ]; databaseBuilder.factory.knowledgeElementSnapshotFactory.buildSnapshot({ - userId, - snappedAt: new Date('2020-01-02'), knowledgeElementsAttributes, campaignParticipationId, }); @@ -193,8 +191,6 @@ describe('Integration | Repository | Campaign Participation Result', function () ]; databaseBuilder.factory.knowledgeElementSnapshotFactory.buildSnapshot({ - userId, - snappedAt: new Date('2020-01-02'), knowledgeElementsAttributes, campaignParticipationId, }); diff --git a/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-profile-repository_test.js b/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-profile-repository_test.js index 625fada2f91..3f72c41e6ba 100644 --- a/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-profile-repository_test.js +++ b/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/campaign-profile-repository_test.js @@ -211,7 +211,6 @@ describe('Integration | Repository | CampaignProfileRepository', function () { }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - snappedAt: new Date('2020-01-02'), snapshot: JSON.stringify([ke]), campaignParticipationId: campaignParticipation.id, }); diff --git a/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/participant-result-repository_test.js b/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/participant-result-repository_test.js index 655356006fc..7d80fd073d9 100644 --- a/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/participant-result-repository_test.js +++ b/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/participant-result-repository_test.js @@ -1130,8 +1130,6 @@ describe('Integration | Repository | ParticipantResultRepository', function () { ]; const knowledgeElementsInSnapshot = new KnowledgeElementCollection(knowledgeElements); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: new Date(), campaignParticipationId, snapshot: knowledgeElementsInSnapshot.toSnapshot(), }); @@ -1179,8 +1177,6 @@ describe('Integration | Repository | ParticipantResultRepository', function () { ]; const knowledgeElementsInSnapshot = new KnowledgeElementCollection(knowledgeElements); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: new Date(), campaignParticipationId, snapshot: knowledgeElementsInSnapshot.toSnapshot(), }); @@ -1246,8 +1242,6 @@ describe('Integration | Repository | ParticipantResultRepository', function () { ]; const knowledgeElementsInSnapshot = new KnowledgeElementCollection(knowledgeElements); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: new Date(), campaignParticipationId, snapshot: knowledgeElementsInSnapshot.toSnapshot(), }); @@ -1469,8 +1463,6 @@ describe('Integration | Repository | ParticipantResultRepository', function () { }), ]); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: new Date(), campaignParticipationId, snapshot: knowledgeElementsInSnapshot.toSnapshot(), }); diff --git a/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/participant-results-shared-repository_test.js b/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/participant-results-shared-repository_test.js index 1b3b16709f6..2f614b5cc79 100644 --- a/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/participant-results-shared-repository_test.js +++ b/api/tests/prescription/campaign-participation/integration/infrastructure/repositories/participant-results-shared-repository_test.js @@ -362,8 +362,6 @@ function _buildParticipationWithSnapshot(participationAttributes, knowledgeEleme const participation = databaseBuilder.factory.buildCampaignParticipation(participationAttributes); databaseBuilder.factory.knowledgeElementSnapshotFactory.buildSnapshot({ - userId: participation.userId, - snappedAt: participation.sharedAt, knowledgeElementsAttributes, campaignParticipationId: participation.id, }); diff --git a/api/tests/prescription/campaign/acceptance/application/campaign-results-route_test.js b/api/tests/prescription/campaign/acceptance/application/campaign-results-route_test.js index 76e3e51aa92..1b43afed523 100644 --- a/api/tests/prescription/campaign/acceptance/application/campaign-results-route_test.js +++ b/api/tests/prescription/campaign/acceptance/application/campaign-results-route_test.js @@ -576,10 +576,8 @@ describe('Acceptance | API | campaign-results-route', function () { }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, campaignParticipationId: campaignParticipation.id, snapshot: new KnowledgeElementCollection([ke]).toSnapshot(), - snappedAt: campaignParticipation.sharedAt, }); await databaseBuilder.commit(); diff --git a/api/tests/prescription/campaign/integration/domain/usecases/save-knowledge-element-snapshot-for-participation_test.js b/api/tests/prescription/campaign/integration/domain/usecases/save-knowledge-element-snapshot-for-participation_test.js index 3883a3fc97d..4b60ba5d654 100644 --- a/api/tests/prescription/campaign/integration/domain/usecases/save-knowledge-element-snapshot-for-participation_test.js +++ b/api/tests/prescription/campaign/integration/domain/usecases/save-knowledge-element-snapshot-for-participation_test.js @@ -7,13 +7,10 @@ describe('Integration | UseCase | save-knowledge-element-snapshot-for-participat it('should persist knowledgeElement', async function () { const knowledgeElement = domainBuilder.buildKnowledgeElement(); const campaignParticipationId = databaseBuilder.factory.buildCampaignParticipation().id; - const userId = databaseBuilder.factory.buildUser().id; await databaseBuilder.commit(); const knowledgeElementCollection = new KnowledgeElementCollection([knowledgeElement]); const result = await usecases.saveKnowledgeElementSnapshotForParticipation({ - userId, - snappedAt: new Date('2025-03-06'), campaignParticipationId, knowledgeElementCollection, }); diff --git a/api/tests/prescription/campaign/integration/domain/usecases/start-writing-campaign-assessment-results-to-stream_test.js b/api/tests/prescription/campaign/integration/domain/usecases/start-writing-campaign-assessment-results-to-stream_test.js index d0e3ec41088..b75ca0f715a 100644 --- a/api/tests/prescription/campaign/integration/domain/usecases/start-writing-campaign-assessment-results-to-stream_test.js +++ b/api/tests/prescription/campaign/integration/domain/usecases/start-writing-campaign-assessment-results-to-stream_test.js @@ -114,20 +114,6 @@ describe('Integration | Domain | Use Cases | start-writing-campaign-assessment-r userId: participant.id, }); - const ke1 = databaseBuilder.factory.buildKnowledgeElement({ - status: 'validated', - skillId: 'recSkillWeb1', - competenceId: 'recCompetence1', - userId: participant.id, - createdAt, - }); - - databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: participant.id, - snappedAt: sharedAt, - snapshot: new KnowledgeElementCollection([ke1]).toSnapshot(), - }); - ['recSkillWeb1'].forEach((skillId) => { databaseBuilder.factory.buildCampaignSkill({ campaignId: campaign.id, @@ -216,8 +202,6 @@ describe('Integration | Domain | Use Cases | start-writing-campaign-assessment-r createdAt, }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: participant.id, - snappedAt: sharedAt, campaignParticipationId: campaignParticipation.id, snapshot: new KnowledgeElementCollection([ke1, ke2, ke3]).toSnapshot(), }); @@ -357,8 +341,6 @@ describe('Integration | Domain | Use Cases | start-writing-campaign-assessment-r createdAt, }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: participant.id, - snappedAt: sharedAt, campaignParticipationId: campaignParticipation.id, snapshot: new KnowledgeElementCollection([ke1, ke2, ke3]).toSnapshot(), }); @@ -468,8 +450,6 @@ describe('Integration | Domain | Use Cases | start-writing-campaign-assessment-r createdAt, }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: participant.id, - snappedAt: sharedAt, campaignParticipationId: campaignParticipation.id, snapshot: new KnowledgeElementCollection([ke1, ke2, ke3]).toSnapshot(), }); @@ -716,8 +696,6 @@ describe('Integration | Domain | Use Cases | start-writing-campaign-assessment-r }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: participant.id, - snappedAt: sharedAt, campaignParticipationId: campaignParticipation.id, snapshot: new KnowledgeElementCollection([ke1, ke2, ke3]).toSnapshot(), }); diff --git a/api/tests/prescription/campaign/integration/domain/usecases/start-writing-campaign-profiles-collection-results-to-stream_test.js b/api/tests/prescription/campaign/integration/domain/usecases/start-writing-campaign-profiles-collection-results-to-stream_test.js index de7e6157c02..07be40a8986 100644 --- a/api/tests/prescription/campaign/integration/domain/usecases/start-writing-campaign-profiles-collection-results-to-stream_test.js +++ b/api/tests/prescription/campaign/integration/domain/usecases/start-writing-campaign-profiles-collection-results-to-stream_test.js @@ -176,8 +176,6 @@ describe('Integration | Domain | Use Cases | start-writing-profiles-collection-c }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: participationShared.userId, - snappedAt: participationShared.sharedAt, snapshot: new KnowledgeElementCollection([ke1, ke2, ke3, ke4, ke5]).toSnapshot(), campaignParticipationId: participationShared.id, }); @@ -249,8 +247,6 @@ describe('Integration | Domain | Use Cases | start-writing-profiles-collection-c ); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: participationShared.userId, - snappedAt: participationShared.sharedAt, snapshot: new KnowledgeElementCollection([ke1, ke2, ke3, ke4, ke5]).toSnapshot(), campaignParticipationId: participationShared.id, }); @@ -398,8 +394,6 @@ describe('Integration | Domain | Use Cases | start-writing-profiles-collection-c ); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: participationShared.userId, - snappedAt: participationShared.sharedAt, snapshot: new KnowledgeElementCollection([ke1, ke2, ke3, ke4, ke5]).toSnapshot(), campaignParticipationId: participationShared.id, }); @@ -481,8 +475,6 @@ describe('Integration | Domain | Use Cases | start-writing-profiles-collection-c }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: participationShared.userId, - snappedAt: participationShared.sharedAt, snapshot: new KnowledgeElementCollection([ke1, ke2, ke3, ke4, ke5]).toSnapshot(), campaignParticipationId: participationShared.id, }); @@ -567,8 +559,6 @@ describe('Integration | Domain | Use Cases | start-writing-profiles-collection-c }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: participationShared.userId, - snappedAt: participationShared.sharedAt, snapshot: new KnowledgeElementCollection([ke1, ke2, ke3, ke4, ke5]).toSnapshot(), campaignParticipationId: participationShared.id, }); diff --git a/api/tests/prescription/campaign/integration/infrastructure/repositories/campaign-collective-result-repository_test.js b/api/tests/prescription/campaign/integration/infrastructure/repositories/campaign-collective-result-repository_test.js index 4d866bcddcf..0fcb37fafff 100644 --- a/api/tests/prescription/campaign/integration/infrastructure/repositories/campaign-collective-result-repository_test.js +++ b/api/tests/prescription/campaign/integration/infrastructure/repositories/campaign-collective-result-repository_test.js @@ -466,9 +466,7 @@ describe('Integration | Repository | Campaign collective result repository', fun ]; databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: fredId, campaignParticipationId: userWithCampaignParticipationFred.campaignParticipation.id, - snappedAt: userWithCampaignParticipationFred.sharedAt, snapshot: new KnowledgeElementCollection( knowledgeElements.map(domainBuilder.buildKnowledgeElement), ).toSnapshot(), @@ -889,8 +887,6 @@ describe('Integration | Repository | Campaign collective result repository', fun const knowledgeElementsAlice = knowledgeElementsDataAlice.map(databaseBuilder.factory.buildKnowledgeElement); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userWithCampaignParticipationAlice.userId, - snappedAt: userWithCampaignParticipationAlice.campaignParticipation.sharedAt, snapshot: new KnowledgeElementCollection( knowledgeElementsAlice.filter(({ createdAt }) => createdAt <= campaignParticipationShareDate), ).toSnapshot(), @@ -902,8 +898,6 @@ describe('Integration | Repository | Campaign collective result repository', fun ); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userWithCampaignParticipationCharlie.userId, - snappedAt: userWithCampaignParticipationCharlie.campaignParticipation.sharedAt, snapshot: new KnowledgeElementCollection( knowledgeElementsCharlie.filter(({ createdAt }) => createdAt <= campaignParticipationShareDate), ).toSnapshot(), @@ -913,8 +907,6 @@ describe('Integration | Repository | Campaign collective result repository', fun const knowledgeElementsBob = knowledgeElementsDataBob.map(databaseBuilder.factory.buildKnowledgeElement); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userWithCampaignParticipationBob.userId, - snappedAt: userWithCampaignParticipationBob.campaignParticipation.sharedAt, snapshot: new KnowledgeElementCollection( knowledgeElementsBob.filter(({ createdAt }) => createdAt <= campaignParticipationShareDate), ).toSnapshot(), @@ -926,8 +918,6 @@ describe('Integration | Repository | Campaign collective result repository', fun const knowledgeElementsElo = knowledgeElementsDataElo.map(databaseBuilder.factory.buildKnowledgeElement); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userWithCampaignParticipationElo.userId, - snappedAt: userWithCampaignParticipationElo.campaignParticipation.sharedAt, snapshot: new KnowledgeElementCollection( knowledgeElementsElo.filter(({ createdAt }) => createdAt <= campaignParticipationShareDate), ).toSnapshot(), @@ -982,8 +972,6 @@ describe('Integration | Repository | Campaign collective result repository', fun }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userId, - snappedAt: campaignParticipation.sharedAt, snapshot: new KnowledgeElementCollection([knowledgeElement]).toSnapshot(), campaignParticipationId: campaignParticipation.id, }); @@ -1071,15 +1059,11 @@ describe('Integration | Repository | Campaign collective result repository', fun const knowledgeElementsBob = knowledgeElementsDataBob.map(databaseBuilder.factory.buildKnowledgeElement); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userWithCampaignParticipationAlice.userId, - snappedAt: userWithCampaignParticipationAlice.campaignParticipation.sharedAt, snapshot: new KnowledgeElementCollection(knowledgeElementsAlice).toSnapshot(), campaignParticipationId: userWithCampaignParticipationAlice.campaignParticipation.id, }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userWithCampaignParticipationBob.userId, - snappedAt: userWithCampaignParticipationBob.campaignParticipation.sharedAt, snapshot: new KnowledgeElementCollection(knowledgeElementsBob).toSnapshot(), campaignParticipationId: userWithCampaignParticipationBob.campaignParticipation.id, }); diff --git a/api/tests/prescription/campaign/integration/infrastructure/repositories/campaign-profiles-collection-participation-summary-repository_test.js b/api/tests/prescription/campaign/integration/infrastructure/repositories/campaign-profiles-collection-participation-summary-repository_test.js index 8ec05190e25..7606db5a183 100644 --- a/api/tests/prescription/campaign/integration/infrastructure/repositories/campaign-profiles-collection-participation-summary-repository_test.js +++ b/api/tests/prescription/campaign/integration/infrastructure/repositories/campaign-profiles-collection-participation-summary-repository_test.js @@ -170,8 +170,6 @@ describe('Integration | Repository | Campaign Profiles Collection Participation }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: campaignParticipation.userId, - snappedAt: campaignParticipation.sharedAt, campaignParticipationId: campaignParticipation.id, snapshot: new KnowledgeElementCollection([ke1, ke2]).toSnapshot(), }); diff --git a/api/tests/prescription/campaign/integration/infrastructure/repositories/knowledge-element-snapshot-repository_test.js b/api/tests/prescription/campaign/integration/infrastructure/repositories/knowledge-element-snapshot-repository_test.js index 11addf17efc..f6c6bb8d0d9 100644 --- a/api/tests/prescription/campaign/integration/infrastructure/repositories/knowledge-element-snapshot-repository_test.js +++ b/api/tests/prescription/campaign/integration/infrastructure/repositories/knowledge-element-snapshot-repository_test.js @@ -7,7 +7,6 @@ describe('Integration | Repository | KnowledgeElementSnapshotRepository', functi describe('#save', function () { it('should create a new knowledge elements snapshot when no snapshot exist for given campaignParticipationId', async function () { // given - const snappedAt = new Date('2019-04-01'); const userId = databaseBuilder.factory.buildUser().id; const campaignParticipationId = databaseBuilder.factory.buildCampaignParticipation().id; const knowledgeElement1 = databaseBuilder.factory.buildKnowledgeElement({ @@ -23,22 +22,18 @@ describe('Integration | Repository | KnowledgeElementSnapshotRepository', functi // when await knowledgeElementSnapshotRepository.save({ - userId, - snappedAt, snapshot: knowledgeElements.toSnapshot(), campaignParticipationId, }); // then const actualUserSnapshot = await knex.select('*').from('knowledge-element-snapshots').first(); - expect(actualUserSnapshot.userId).to.deep.equal(userId); - expect(actualUserSnapshot.snappedAt).to.deep.equal(snappedAt); + expect(actualUserSnapshot.campaignParticipationId).to.deep.equal(campaignParticipationId); expect(actualUserSnapshot.snapshot).to.deep.equal(JSON.parse(knowledgeElements.toSnapshot())); }); it('should update the existing knowledge elements snapshot when snapshot exists for given campaignParticipationId', async function () { // given - const snappedAt = new Date('2019-04-01'); const userId = databaseBuilder.factory.buildUser().id; const campaignParticipationId = databaseBuilder.factory.buildCampaignParticipation().id; const knowledgeElement1 = databaseBuilder.factory.buildKnowledgeElement({ @@ -58,8 +53,6 @@ describe('Integration | Repository | KnowledgeElementSnapshotRepository', functi }); const knowledgeElementsBefore = new KnowledgeElementCollection([knowledgeElement1, knowledgeElement2]); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: new Date('2019-01-01'), campaignParticipationId, snapshot: knowledgeElementsBefore.toSnapshot(), }); @@ -72,22 +65,18 @@ describe('Integration | Repository | KnowledgeElementSnapshotRepository', functi // when await knowledgeElementSnapshotRepository.save({ - userId, - snappedAt, snapshot: knowledgeElementsAfter.toSnapshot(), campaignParticipationId, }); // then const actualUserSnapshot = await knex.select('*').from('knowledge-element-snapshots').first(); - expect(actualUserSnapshot.userId).to.deep.equal(userId); - expect(actualUserSnapshot.snappedAt).to.deep.equal(snappedAt); + expect(actualUserSnapshot.campaignParticipationId).to.deep.equal(campaignParticipationId); expect(actualUserSnapshot.snapshot).to.deep.equal(JSON.parse(knowledgeElementsAfter.toSnapshot())); }); context('when a transaction is given transaction', function () { it('saves knowledge elements snapshot using a transaction', async function () { - const snappedAt = new Date('2019-04-01'); const userId = databaseBuilder.factory.buildUser().id; const campaignParticipationId = databaseBuilder.factory.buildCampaignParticipation().id; @@ -101,20 +90,16 @@ describe('Integration | Repository | KnowledgeElementSnapshotRepository', functi await DomainTransaction.execute(async () => { await knowledgeElementSnapshotRepository.save({ - userId, - snappedAt, snapshot: knowledgeElements.toSnapshot(), campaignParticipationId, }); }); const actualUserSnapshot = await knex.select('*').from('knowledge-element-snapshots').first(); - expect(actualUserSnapshot.userId).to.deep.equal(userId); - expect(actualUserSnapshot.snappedAt).to.deep.equal(snappedAt); + expect(actualUserSnapshot.campaignParticipationId).to.deep.equal(campaignParticipationId); expect(actualUserSnapshot.snapshot).to.deep.equal(JSON.parse(knowledgeElements.toSnapshot())); }); it('does not save knowledge elements snapshot using a transaction', async function () { - const snappedAt = new Date('2019-04-01'); const userId = databaseBuilder.factory.buildUser().id; const campaignParticipationId = databaseBuilder.factory.buildCampaignParticipation().id; const knowledgeElement1 = databaseBuilder.factory.buildKnowledgeElement({ @@ -127,8 +112,6 @@ describe('Integration | Repository | KnowledgeElementSnapshotRepository', functi try { await DomainTransaction.execute(async () => { await knowledgeElementSnapshotRepository.save({ - userId, - snappedAt, knowledgeElements, campaignParticipationId, }); @@ -169,11 +152,8 @@ describe('Integration | Repository | KnowledgeElementSnapshotRepository', functi it('should return only keys corresponding to existing snapshots', async function () { // given - const snappedAt1 = new Date('2020-01-02'); const knowledgeElement1 = databaseBuilder.factory.buildKnowledgeElement({ userId: userId1 }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userId1, - snappedAt: snappedAt1, snapshot: new KnowledgeElementCollection([knowledgeElement1]).toSnapshot(), campaignParticipationId, }); @@ -200,28 +180,20 @@ describe('Integration | Repository | KnowledgeElementSnapshotRepository', functi it('should find knowledge elements snapshoted grouped by campaignParticipationIds', async function () { // given - const snappedAt1 = new Date('2020-01-02'); const knowledgeElement1 = databaseBuilder.factory.buildKnowledgeElement({ userId: userId1 }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userId1, - snappedAt: snappedAt1, snapshot: new KnowledgeElementCollection([knowledgeElement1]).toSnapshot(), campaignParticipationId, }); - const snappedAt2 = new Date('2020-02-02'); + const knowledgeElement2 = databaseBuilder.factory.buildKnowledgeElement({ userId: userId2 }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userId2, - snappedAt: snappedAt2, snapshot: new KnowledgeElementCollection([knowledgeElement2]).toSnapshot(), campaignParticipationId: secondCampaignParticipationId, }); - const snappedAt3 = new Date('2020-02-03'); const knowledgeElement3 = databaseBuilder.factory.buildKnowledgeElement({ userId: userId2 }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userId2, - snappedAt: snappedAt3, snapshot: new KnowledgeElementCollection([knowledgeElement3]).toSnapshot(), campaignParticipationId: otherCampaignParticipationId, }); @@ -300,8 +272,6 @@ describe('Integration | Repository | KnowledgeElementSnapshotRepository', functi skillId: campaignLearningContent.skills[0].id, }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userId1, - snappedAt: snappedAt1, snapshot: new KnowledgeElementCollection([knowledgeElement1]).toSnapshot(), campaignParticipationId: campaignParticipationId1, }); @@ -318,8 +288,6 @@ describe('Integration | Repository | KnowledgeElementSnapshotRepository', functi skillId: campaignLearningContent.skills[1].id, }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userId2, - snappedAt: snappedAt2, snapshot: new KnowledgeElementCollection([knowledgeElement2]).toSnapshot(), campaignParticipationId: campaignParticipationId2, }); @@ -336,8 +304,6 @@ describe('Integration | Repository | KnowledgeElementSnapshotRepository', functi skillId: campaignLearningContent.skills[2].id, }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userId2, - snappedAt: snappedAt3, snapshot: new KnowledgeElementCollection([knowledgeElement3]).toSnapshot(), campaignParticipationId: campaignParticipationId3, }); diff --git a/api/tests/prescription/campaign/unit/application/api/knowledge-element-snapshots-api_test.js b/api/tests/prescription/campaign/unit/application/api/knowledge-element-snapshots-api_test.js index 595c8a3e271..1e1b4fb0b88 100644 --- a/api/tests/prescription/campaign/unit/application/api/knowledge-element-snapshots-api_test.js +++ b/api/tests/prescription/campaign/unit/application/api/knowledge-element-snapshots-api_test.js @@ -27,8 +27,6 @@ describe('Unit | API | KnowledgeElementSnapshots', function () { saveSnapshotStub.rejects('I was not called with the expected args.'); saveSnapshotStub .withArgs({ - userId: snapshotPayload.userId, - snappedAt: new Date(), knowledgeElementCollection: new KnowledgeElementCollection(snapshotPayload.knowledgeElements), campaignParticipationId: snapshotPayload.campaignParticipationId, }) diff --git a/api/tests/prescription/scripts/add-missing-knowledge-element-snapshots_test.js b/api/tests/prescription/scripts/add-missing-knowledge-element-snapshots_test.js index 160f2844af2..87590c10ffd 100644 --- a/api/tests/prescription/scripts/add-missing-knowledge-element-snapshots_test.js +++ b/api/tests/prescription/scripts/add-missing-knowledge-element-snapshots_test.js @@ -48,8 +48,6 @@ describe('Integration | Prescription | Scripts | add-missing-knowledge-element-s sharedAt: sharedAt2, }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: user.id, - snappedAt: sharedAt2, campaignParticipationId: participationWithsnapshot.id, }); await databaseBuilder.commit(); diff --git a/api/tests/shared/integration/domain/services/placement-profile-service_test.js b/api/tests/shared/integration/domain/services/placement-profile-service_test.js index 9cd0d92fc12..b1108b39b25 100644 --- a/api/tests/shared/integration/domain/services/placement-profile-service_test.js +++ b/api/tests/shared/integration/domain/services/placement-profile-service_test.js @@ -513,7 +513,6 @@ describe('Shared | Integration | Domain | Services | Placement Profile Service', describe('PixScore by competences', function () { it('should assign pixScore and level to user competence based on knowledge elements', async function () { // given - const sharedAt = new Date('2022-01-05'); const ke = databaseBuilder.factory.buildKnowledgeElement({ competenceId: 'competenceRecordIdTwo', skillId: 'recRemplir2', @@ -524,8 +523,6 @@ describe('Shared | Integration | Domain | Services | Placement Profile Service', }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userId, - snappedAt: sharedAt, campaignParticipationId: campaignParticipation.id, snapshot: new KnowledgeElementCollection([ke]).toSnapshot(), }); @@ -553,7 +550,6 @@ describe('Shared | Integration | Domain | Services | Placement Profile Service', it('should include both inferred and direct KnowlegdeElements to compute PixScore', async function () { // given - const sharedAt = new Date('2022-01-05'); const ke1 = databaseBuilder.factory.buildKnowledgeElement({ competenceId: 'competenceRecordIdTwo', skillId: 'recRemplir2', @@ -575,8 +571,6 @@ describe('Shared | Integration | Domain | Services | Placement Profile Service', }); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId: userId, - snappedAt: sharedAt, campaignParticipationId: campaignParticipation.id, snapshot: new KnowledgeElementCollection([ke1, ke2]).toSnapshot(), }); @@ -604,8 +598,6 @@ describe('Shared | Integration | Domain | Services | Placement Profile Service', databaseBuilder.factory.buildKnowledgeElementSnapshot({ campaignParticipationId: campaignParticipation.id, - userId: userId, - snappedAt: campaignParticipation.sharedAt, snapshot: new KnowledgeElementCollection([ke]).toSnapshot(), }); @@ -639,8 +631,6 @@ describe('Shared | Integration | Domain | Services | Placement Profile Service', databaseBuilder.factory.buildKnowledgeElementSnapshot({ campaignParticipationId: campaignParticipation.id, - userId: userId, - snappedAt: campaignParticipation.sharedAt, snapshot: new KnowledgeElementCollection([ke]).toSnapshot(), }); diff --git a/api/tests/shared/integration/infrastructure/repositories/knowledge-element-repository_test.js b/api/tests/shared/integration/infrastructure/repositories/knowledge-element-repository_test.js index f590bf98606..d3ed20725b9 100644 --- a/api/tests/shared/integration/infrastructure/repositories/knowledge-element-repository_test.js +++ b/api/tests/shared/integration/infrastructure/repositories/knowledge-element-repository_test.js @@ -196,8 +196,6 @@ describe('Integration | Repository | knowledgeElementRepository', function () { }); const knowledgeElementsBefore = new KnowledgeElementCollection([knowledgeElement1, knowledgeElement2]); databaseBuilder.factory.buildKnowledgeElementSnapshot({ - userId, - snappedAt: new Date('2019-01-01'), campaignParticipationId, snapshot: knowledgeElementsBefore.toSnapshot(), }); diff --git a/high-level-tests/e2e/cypress/fixtures/knowledge-element-snapshots.json b/high-level-tests/e2e/cypress/fixtures/knowledge-element-snapshots.json index afb19ca6fca..bc91af7027e 100644 --- a/high-level-tests/e2e/cypress/fixtures/knowledge-element-snapshots.json +++ b/high-level-tests/e2e/cypress/fixtures/knowledge-element-snapshots.json @@ -1,8 +1,6 @@ [ { "id": 1, - "userId": 4, - "snappedAt": "2019-04-22T06:00:00Z", "campaignParticipationId": 1, "snapshot": "[{\"id\":1,\"userId\":4,\"assessmentId\":1,\"source\":\"direct\",\"answerId\":1,\"status\":\"validated\",\"skillId\":\"recdFsWU9ij5bXZhD\",\"competenceId\":\"recoVElv3xmVppK5a\",\"createdAt\":\"2019-04-21T06:00:00Z\",\"earnedPix\":0.65},{\"id\":2,\"userId\":4,\"assessmentId\":1,\"source\":\"direct\",\"answerId\":2,\"status\":\"invalidated\",\"skillId\":\"recJieHaORILprKhL\",\"competenceId\":\"recxlJqKdbWHHFZMQ\",\"createdAt\":\"2019-04-21T06:00:00Z\",\"earnedPix\":0}]" }