-
Notifications
You must be signed in to change notification settings - Fork 58
/
Copy pathadd-missing-knowledge-element-snapshots.js
100 lines (90 loc) · 3.81 KB
/
add-missing-knowledge-element-snapshots.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import { knex } from '../../../db/knex-database-connection.js';
import { commaSeparatedNumberParser } from '../../shared/application/scripts/parsers.js';
import { Script } from '../../shared/application/scripts/script.js';
import { ScriptRunner } from '../../shared/application/scripts/script-runner.js';
import * as knowledgeElementRepository from '../../shared/infrastructure/repositories/knowledge-element-repository.js';
import * as campaignRepository from '../campaign/infrastructure/repositories/campaign-repository.js';
import * as knowledgeElementSnapshotRepository from '../campaign/infrastructure/repositories/knowledge-element-snapshot-repository.js';
import { KnowledgeElementCollection } from '../shared/domain/models/KnowledgeElementCollection.js';
const LOG_CONTEXT = 'add-missing-knowledge-element-snapshots';
class AddMissingKnowledgeElementSnapshots extends Script {
constructor() {
super({
description: 'Script to add delete knowledge-element-snapshots from same participation',
permanent: false,
options: {
dryRun: {
type: 'boolean',
describe: 'execute script without commit',
demandOption: false,
default: true,
},
campaignParticipationIds: {
type: 'string',
describe: 'a list of comma separated campaign participation ids',
demandOption: true,
coerce: commaSeparatedNumberParser(),
},
},
});
}
async handle({ options, logger }) {
logger.info(`${LOG_CONTEXT} | START`);
logger.info(`${LOG_CONTEXT} | dryRun ${options.dryRun}`);
const trx = await knex.transaction();
let nbSnapshotsCreated = 0;
for (const campaignParticipationId of options.campaignParticipationIds) {
const campaign = await campaignRepository.getByCampaignParticipationId(campaignParticipationId);
if (campaign === null) {
logger.error(`${LOG_CONTEXT} | Skip campaign participation ${campaignParticipationId}, campaign not found`);
continue;
}
if (campaign.isExam) {
logger.error(`${LOG_CONTEXT} | Skip campaign participation ${campaignParticipationId}, campaign to exam`);
continue;
}
const participation = await trx('campaign-participations')
.select(['userId', 'sharedAt'])
.where({ id: campaignParticipationId })
.first();
const existingSnapshots = await trx('knowledge-element-snapshots')
.count({ count: 1 })
.where({ campaignParticipationId })
.first();
if (existingSnapshots.count !== 0) {
logger.error(
`${LOG_CONTEXT} | We are skipping this campaignParticipation ${campaignParticipationId} because a snapshot already exists for it.`,
);
continue;
}
const knowledgeElements = await knowledgeElementRepository.findUniqByUserId({
userId: participation.userId,
limitDate: participation.sharedAt,
});
await knowledgeElementSnapshotRepository.save({
snapshot: new KnowledgeElementCollection(knowledgeElements).toSnapshot(),
campaignParticipationId,
});
nbSnapshotsCreated++;
}
logger.info(
`${LOG_CONTEXT} | Created ${nbSnapshotsCreated} snapshots. Skipped ${options.campaignParticipationIds.length - nbSnapshotsCreated} participations`,
);
try {
if (options.dryRun) {
logger.info(`${LOG_CONTEXT} | rollback | Mode dry run`);
await trx.rollback();
} else {
logger.info(`${LOG_CONTEXT} | commit`);
await trx.commit();
}
} catch (err) {
logger.error(`${LOG_CONTEXT} | FAIL | Reason : ${err}`);
await trx.rollback();
} finally {
logger.info(`${LOG_CONTEXT} | END`);
}
}
}
await ScriptRunner.execute(import.meta.url, AddMissingKnowledgeElementSnapshots);
export { AddMissingKnowledgeElementSnapshots };