Skip to content

Commit b2013e0

Browse files
laura-bergoensfrinyvonnickxav-car
committed
tech(api): save of knowledge-element-snapshot-repository does "upsert" now
Co-authored-by: Yvonnick Frin <[email protected]> Co-authored-by: Xavier Carron <[email protected]>
1 parent b99dbc4 commit b2013e0

File tree

2 files changed

+57
-27
lines changed

2 files changed

+57
-27
lines changed
Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,32 @@
11
import { knex } from '../../../../../db/knex-database-connection.js';
22
import { DomainTransaction } from '../../../../shared/domain/DomainTransaction.js';
3-
import { AlreadyExistingEntityError } from '../../../../shared/domain/errors.js';
43
import { KnowledgeElement } from '../../../../shared/domain/models/KnowledgeElement.js';
5-
import * as knexUtils from '../../../../shared/infrastructure/utils/knex-utils.js';
64
import { CampaignParticipationKnowledgeElementSnapshots } from '../../../shared/domain/read-models/CampaignParticipationKnowledgeElementSnapshots.js';
75

8-
const save = async function ({ userId, snappedAt, snapshot, campaignParticipationId }) {
9-
try {
10-
const knexConn = DomainTransaction.getConnection();
6+
export async function save({ userId, snappedAt, snapshot, campaignParticipationId }) {
7+
const knexConn = DomainTransaction.getConnection();
8+
const existingSnapshot = await knexConn
9+
.select('id')
10+
.from('knowledge-element-snapshots')
11+
.where('campaignParticipationId', campaignParticipationId)
12+
.first();
13+
if (existingSnapshot) {
14+
return await knexConn('knowledge-element-snapshots')
15+
.update({
16+
userId,
17+
snappedAt,
18+
snapshot,
19+
})
20+
.where('campaignParticipationId', campaignParticipationId);
21+
} else {
1122
return await knexConn('knowledge-element-snapshots').insert({
1223
userId,
1324
snappedAt,
1425
snapshot,
1526
campaignParticipationId,
1627
});
17-
} catch (error) {
18-
if (knexUtils.isUniqConstraintViolated(error)) {
19-
throw new AlreadyExistingEntityError(
20-
`A snapshot already exists for the user ${userId} at the datetime ${snappedAt}.`,
21-
);
22-
}
2328
}
24-
};
29+
}
2530

2631
/**
2732
* @function
@@ -30,7 +35,7 @@ const save = async function ({ userId, snappedAt, snapshot, campaignParticipatio
3035
* @param {number[]} campaignParticipationIds
3136
* @returns {Promise<Array<CampaignParticipationKnowledgeElementSnapshots>>}
3237
*/
33-
const findCampaignParticipationKnowledgeElementSnapshots = async function (campaignParticipationIds) {
38+
export async function findCampaignParticipationKnowledgeElementSnapshots(campaignParticipationIds) {
3439
const knowledgeElementsByCampaignParticipation = await findByCampaignParticipationIds(campaignParticipationIds);
3540
return campaignParticipationIds.map(
3641
(campaignParticipationId) =>
@@ -39,14 +44,14 @@ const findCampaignParticipationKnowledgeElementSnapshots = async function (campa
3944
campaignParticipationId: campaignParticipationId,
4045
}),
4146
);
42-
};
47+
}
4348

4449
/**
4550
*
4651
* @param {number[]} campaignParticipationIds
4752
* @returns {Object.<number, KnowledgeElement[]>}
4853
*/
49-
const findByCampaignParticipationIds = async function (campaignParticipationIds) {
54+
export async function findByCampaignParticipationIds(campaignParticipationIds) {
5055
const results = await knex
5156
.select('campaignParticipationId', 'snapshot')
5257
.from('knowledge-element-snapshots')
@@ -60,6 +65,4 @@ const findByCampaignParticipationIds = async function (campaignParticipationIds)
6065
}),
6166
]),
6267
);
63-
};
64-
65-
export { findByCampaignParticipationIds, findCampaignParticipationKnowledgeElementSnapshots, save };
68+
}

api/tests/prescription/campaign/integration/infrastructure/repositories/knowledge-element-snapshot-repository_test.js

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import * as knowledgeElementSnapshotRepository from '../../../../../../src/prescription/campaign/infrastructure/repositories/knowledge-element-snapshot-repository.js';
22
import { KnowledgeElementCollection } from '../../../../../../src/prescription/shared/domain/models/KnowledgeElementCollection.js';
33
import { DomainTransaction } from '../../../../../../src/shared/domain/DomainTransaction.js';
4-
import { AlreadyExistingEntityError } from '../../../../../../src/shared/domain/errors.js';
5-
import { catchErr, databaseBuilder, domainBuilder, expect, knex } from '../../../../../test-helper.js';
4+
import { databaseBuilder, domainBuilder, expect, knex } from '../../../../../test-helper.js';
65

76
describe('Integration | Repository | KnowledgeElementSnapshotRepository', function () {
87
describe('#save', function () {
9-
it('should save knowledge elements snapshot for a userId and a date', async function () {
8+
it('should create a new knowledge elements snapshot when no snapshot exist for given campaignParticipationId', async function () {
109
// given
1110
const snappedAt = new Date('2019-04-01');
1211
const userId = databaseBuilder.factory.buildUser().id;
@@ -34,28 +33,56 @@ describe('Integration | Repository | KnowledgeElementSnapshotRepository', functi
3433
const actualUserSnapshot = await knex.select('*').from('knowledge-element-snapshots').first();
3534
expect(actualUserSnapshot.userId).to.deep.equal(userId);
3635
expect(actualUserSnapshot.snappedAt).to.deep.equal(snappedAt);
37-
3836
expect(actualUserSnapshot.snapshot).to.deep.equal(JSON.parse(knowledgeElements.toSnapshot()));
3937
});
4038

41-
it('should throw an error if knowledge elements snapshot already exist for userId and a date', async function () {
39+
it('should update the existing knowledge elements snapshot when snapshot exists for given campaignParticipationId', async function () {
4240
// given
4341
const snappedAt = new Date('2019-04-01');
4442
const userId = databaseBuilder.factory.buildUser().id;
4543
const campaignParticipationId = databaseBuilder.factory.buildCampaignParticipation().id;
46-
databaseBuilder.factory.buildKnowledgeElementSnapshot({ userId, snappedAt, campaignParticipationId });
44+
const knowledgeElement1 = databaseBuilder.factory.buildKnowledgeElement({
45+
userId,
46+
createdAt: new Date('2019-03-01'),
47+
skillId: 'acquis1',
48+
});
49+
const knowledgeElement2 = databaseBuilder.factory.buildKnowledgeElement({
50+
userId,
51+
createdAt: new Date('2019-03-01'),
52+
skillId: 'acquis2',
53+
});
54+
const knowledgeElement3 = databaseBuilder.factory.buildKnowledgeElement({
55+
userId,
56+
createdAt: new Date('2019-03-01'),
57+
skillId: 'acquis3',
58+
});
59+
const knowledgeElementsBefore = new KnowledgeElementCollection([knowledgeElement1, knowledgeElement2]);
60+
databaseBuilder.factory.buildKnowledgeElementSnapshot({
61+
userId,
62+
snappedAt: new Date('2019-01-01'),
63+
campaignParticipationId,
64+
snapshot: knowledgeElementsBefore.toSnapshot(),
65+
});
4766
await databaseBuilder.commit();
67+
const knowledgeElementsAfter = new KnowledgeElementCollection([
68+
knowledgeElement1,
69+
knowledgeElement2,
70+
knowledgeElement3,
71+
]);
4872

4973
// when
50-
const error = await catchErr(knowledgeElementSnapshotRepository.save)({
74+
await knowledgeElementSnapshotRepository.save({
5175
userId,
5276
snappedAt,
53-
snapshot: JSON.stringify([]),
77+
snapshot: knowledgeElementsAfter.toSnapshot(),
5478
campaignParticipationId,
5579
});
5680

5781
// then
58-
expect(error).to.be.instanceOf(AlreadyExistingEntityError);
82+
const actualUserSnapshot = await knex.select('*').from('knowledge-element-snapshots').first();
83+
expect(actualUserSnapshot.userId).to.deep.equal(userId);
84+
expect(actualUserSnapshot.snappedAt).to.deep.equal(snappedAt);
85+
expect(actualUserSnapshot.snapshot).to.deep.equal(JSON.parse(knowledgeElementsAfter.toSnapshot()));
5986
});
6087

6188
context('when a transaction is given transaction', function () {

0 commit comments

Comments
 (0)