-
Notifications
You must be signed in to change notification settings - Fork 58
/
Copy pathknowledge-element-snapshot-repository.js
64 lines (60 loc) · 2.34 KB
/
knowledge-element-snapshot-repository.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
import { DomainTransaction } from '../../../../shared/domain/DomainTransaction.js';
import { KnowledgeElement } from '../../../../shared/domain/models/KnowledgeElement.js';
import { CampaignParticipationKnowledgeElementSnapshots } from '../../../shared/domain/read-models/CampaignParticipationKnowledgeElementSnapshots.js';
export async function save({ snapshot, campaignParticipationId }) {
const knexConn = DomainTransaction.getConnection();
const existingSnapshot = await knexConn
.select('id')
.from('knowledge-element-snapshots')
.where('campaignParticipationId', campaignParticipationId)
.first();
if (existingSnapshot) {
return await knexConn('knowledge-element-snapshots')
.update({
snapshot,
})
.where('campaignParticipationId', campaignParticipationId);
} else {
return await knexConn('knowledge-element-snapshots').insert({
snapshot,
campaignParticipationId,
});
}
}
/**
* @function
* @name findCampaignParticipationKnowledgeElementSnapshots
*
* @param {number[]} campaignParticipationIds
* @returns {Promise<Array<CampaignParticipationKnowledgeElementSnapshots>>}
*/
export async function findCampaignParticipationKnowledgeElementSnapshots(campaignParticipationIds) {
const knowledgeElementsByCampaignParticipation = await findByCampaignParticipationIds(campaignParticipationIds);
return campaignParticipationIds.map(
(campaignParticipationId) =>
new CampaignParticipationKnowledgeElementSnapshots({
knowledgeElements: knowledgeElementsByCampaignParticipation[campaignParticipationId],
campaignParticipationId: campaignParticipationId,
}),
);
}
/**
*
* @param {number[]} campaignParticipationIds
* @returns {Object.<number, KnowledgeElement[]>}
*/
export async function findByCampaignParticipationIds(campaignParticipationIds) {
const knexConn = DomainTransaction.getConnection();
const results = await knexConn
.select('campaignParticipationId', 'snapshot')
.from('knowledge-element-snapshots')
.whereIn('campaignParticipationId', campaignParticipationIds);
return Object.fromEntries(
results.map(({ campaignParticipationId, snapshot }) => [
campaignParticipationId,
snapshot.map(({ createdAt, ...data }) => {
return new KnowledgeElement({ ...data, createdAt: new Date(createdAt) });
}),
]),
);
}