Skip to content

Commit 333498d

Browse files
[TECH] Supprimer le double model Campaign (PIX-16997)
#11620
2 parents 7c0a1ac + 723d720 commit 333498d

File tree

19 files changed

+45
-340
lines changed

19 files changed

+45
-340
lines changed

api/src/prescription/campaign-participation/domain/models/CampaignParticipation.js

+4-10
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
CantImproveCampaignParticipationError,
77
} from '../../../../../src/shared/domain/errors.js';
88
import { ArchivedCampaignError } from '../../../campaign/domain/errors.js';
9-
import { CampaignParticipationStatuses, CampaignTypes } from '../../../shared/domain/constants.js';
9+
import { CampaignParticipationStatuses } from '../../../shared/domain/constants.js';
1010
import { CampaignParticiationInvalidStatus, CampaignParticipationDeletedError } from '../errors.js';
1111

1212
class CampaignParticipation {
@@ -67,10 +67,6 @@ class CampaignParticipation {
6767
return _.maxBy(this.assessments, 'createdAt');
6868
}
6969

70-
getTargetProfileId() {
71-
return _.get(this, 'campaign.targetProfileId', null);
72-
}
73-
7470
get campaignId() {
7571
return _.get(this, 'campaign.id', null);
7672
}
@@ -96,8 +92,7 @@ class CampaignParticipation {
9692
throw new CampaignParticiationInvalidStatus(this.id, CampaignParticipationStatuses.TO_SHARE);
9793
}
9894

99-
//TODO: rewrite when we have only one model for Campaign, for now now tests are based on Campaign.js from api context
100-
if (this.campaign.type === CampaignTypes.PROFILES_COLLECTION) {
95+
if (this.campaign.isProfilesCollection) {
10196
throw new CantImproveCampaignParticipationError();
10297
}
10398
}
@@ -110,14 +105,13 @@ class CampaignParticipation {
110105
if (this.isShared) {
111106
throw new AlreadySharedCampaignParticipationError();
112107
}
113-
if (!this.campaign.isAccessible()) {
108+
if (!this.campaign.isAccessible) {
114109
throw new ArchivedCampaignError('Cannot share results on an archived campaign.');
115110
}
116111
if (this.isDeleted) {
117112
throw new CampaignParticipationDeletedError('Cannot share results on a deleted participation.');
118113
}
119-
//TODO: rewrite when we have only one model for Campaign, for now tests are based on Campaign.js from api context
120-
if (this.campaign.type === CampaignTypes.ASSESSMENT && lastAssessmentNotCompleted(this)) {
114+
if (this.campaign.isAssessment && lastAssessmentNotCompleted(this)) {
121115
throw new AssessmentNotCompletedError();
122116
}
123117
}

api/src/prescription/campaign-participation/domain/usecases/send-shared-participation-results-to-pole-emploi.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ const sendSharedParticipationResultsToPoleEmploi = async ({
2727
const campaign = await campaignRepository.get(participation.campaignId);
2828
const organization = await organizationRepository.get(campaign.organizationId);
2929

30-
//TODO: rewrite when we have only one model for Campaign, for now tests are based on Campaign.js from api context
31-
if (campaign.type === 'ASSESSMENT' && organization.isPoleEmploi) {
30+
if (campaign.isAssessment && organization.isPoleEmploi) {
3231
const badges = await badgeRepository.findByCampaignId(participation.campaignId);
3332
const badgeAcquiredIds = await badgeAcquisitionRepository.getAcquiredBadgeIds({
3433
badgeIds: badges.map((badge) => badge.id),

api/src/prescription/campaign-participation/infrastructure/repositories/campaign-participation-repository.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { constants } from '../../../../shared/domain/constants.js';
55
import { DomainTransaction } from '../../../../shared/domain/DomainTransaction.js';
66
import { NotFoundError } from '../../../../shared/domain/errors.js';
77
import { Assessment } from '../../../../shared/domain/models/Assessment.js';
8-
import { Campaign } from '../../../../shared/domain/models/Campaign.js';
98
import * as knowledgeElementRepository from '../../../../shared/infrastructure/repositories/knowledge-element-repository.js';
9+
import { Campaign } from '../../../campaign/domain/models/Campaign.js';
1010
import * as campaignRepository from '../../../campaign/infrastructure/repositories/campaign-repository.js';
1111
import * as knowledgeElementSnapshotRepository from '../../../campaign/infrastructure/repositories/knowledge-element-snapshot-repository.js';
1212
import { CampaignParticipationStatuses, CampaignTypes } from '../../../shared/domain/constants.js';

api/src/prescription/campaign-participation/infrastructure/serializers/jsonapi/campaign-participation-serializer.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import jsonapiSerializer from 'jsonapi-serializer';
22

33
const { Serializer, Deserializer } = jsonapiSerializer;
44

5-
import { Campaign } from '../../../../../shared/domain/models/Campaign.js';
5+
import { Campaign } from '../../../../campaign/domain/models/Campaign.js';
66
import { CampaignParticipation } from '../../../domain/models/CampaignParticipation.js';
77

88
const serialize = function (campaignParticipation) {

api/src/prescription/campaign/domain/models/Campaign.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,17 @@ class Campaign {
1313
id,
1414
name,
1515
code,
16+
title,
17+
externalIdLabel,
18+
externalIdType,
1619
organizationId,
20+
externalIdHelpImageUrl,
21+
alternativeTextToExternalIdHelpImage,
1722
creatorId,
1823
createdAt,
1924
targetProfileId,
20-
externalIdLabel,
21-
externalIdType,
22-
title,
2325
customLandingPageText,
2426
type,
25-
externalIdHelpImageUrl,
26-
alternativeTextToExternalIdHelpImage,
2727
isForAbsoluteNovice,
2828
customResultPageText,
2929
customResultPageButtonText,
@@ -38,6 +38,7 @@ class Campaign {
3838
participationCount,
3939
} = {}) {
4040
this.id = id;
41+
this.isForAbsoluteNovice = isForAbsoluteNovice;
4142
this.code = code;
4243
this.externalIdLabel = externalIdLabel;
4344
this.externalIdType = externalIdType;
@@ -47,7 +48,6 @@ class Campaign {
4748
this.externalIdHelpImageUrl = externalIdHelpImageUrl;
4849
this.alternativeTextToExternalIdHelpImage = alternativeTextToExternalIdHelpImage;
4950
this.customLandingPageText = customLandingPageText;
50-
this.isForAbsoluteNovice = isForAbsoluteNovice;
5151
this.customResultPageText = customResultPageText;
5252
this.customResultPageButtonText = customResultPageButtonText;
5353
this.customResultPageButtonUrl = customResultPageButtonUrl;

api/src/prescription/campaign/domain/usecases/start-writing-campaign-profiles-collection-results-to-stream.js

-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ const startWritingCampaignProfilesCollectionResultsToStream = async function ({
2323
const translate = i18n.__;
2424
let additionalHeaders = [];
2525

26-
//TODO: rewrite when we have only one model for Campaign, for now tests are based on Campaign.js from api context
2726
if (!campaign.isProfilesCollection) {
2827
throw new CampaignTypeError();
2928
}

api/src/prescription/campaign/infrastructure/repositories/campaign-repository.js

+2-5
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import { knex } from '../../../../../db/knex-database-connection.js';
22
import { CAMPAIGN_FEATURES } from '../../../../shared/domain/constants.js';
33
import { DomainTransaction } from '../../../../shared/domain/DomainTransaction.js';
44
import { NotFoundError } from '../../../../shared/domain/errors.js';
5-
import { Campaign } from '../../../../shared/domain/models/Campaign.js';
65
import * as skillRepository from '../../../../shared/infrastructure/repositories/skill-repository.js';
76
import * as tubeRepository from '../../../../shared/infrastructure/repositories/tube-repository.js';
7+
import { Campaign } from '../../domain/models/Campaign.js';
88

99
const areKnowledgeElementsResettable = async function ({ id }) {
1010
const knexConn = DomainTransaction.getConnection();
@@ -23,7 +23,7 @@ const areKnowledgeElementsResettable = async function ({ id }) {
2323
const getByCode = async function (code) {
2424
const campaign = await knex('campaigns').first().where({ code });
2525
if (!campaign) return null;
26-
return new Campaign({ ...campaign, organization: { id: campaign.organizationId } });
26+
return new Campaign(campaign);
2727
};
2828

2929
const get = async function (id) {
@@ -44,9 +44,6 @@ const get = async function (id) {
4444
return new Campaign({
4545
...campaign,
4646
...{ externalIdLabel: featureExternalId?.params?.label, externalIdType: featureExternalId?.params?.type },
47-
organization: { id: campaign.organizationId },
48-
targetProfile: { id: campaign.targetProfileId },
49-
creator: { id: campaign.creatorId },
5047
});
5148
};
5249

api/src/shared/domain/models/Campaign.js

-89
This file was deleted.

api/src/shared/domain/models/index.js

-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ import { AuthenticationSessionContent } from './AuthenticationSessionContent.js'
5555
import { BadgeCriterionForCalculation } from './BadgeCriterionForCalculation.js';
5656
import { BadgeDetails } from './BadgeDetails.js';
5757
import { BadgeForCalculation } from './BadgeForCalculation.js';
58-
import { Campaign } from './Campaign.js';
5958
import { CampaignLearningContent } from './CampaignLearningContent.js';
6059
import { CampaignParticipationResult } from './CampaignParticipationResult.js';
6160
import { CertifiableBadgeAcquisition } from './CertifiableBadgeAcquisition.js';
@@ -124,7 +123,6 @@ export {
124123
BadgeCriterionForCalculation,
125124
BadgeDetails,
126125
BadgeForCalculation,
127-
Campaign,
128126
CampaignCreator,
129127
CampaignForCreation,
130128
CampaignLearningContent,

api/tests/prescription/campaign-participation/unit/domain/models/CampaignParticipation_test.js

+1-34
Original file line numberDiff line numberDiff line change
@@ -19,39 +19,6 @@ import { catchErr, catchErrSync, domainBuilder, expect, sinon } from '../../../.
1919
const { TO_SHARE, SHARED, STARTED } = CampaignParticipationStatuses;
2020

2121
describe('Unit | Domain | Models | CampaignParticipation', function () {
22-
describe('#getTargetProfileId', function () {
23-
it('should return the targetProfileId from campaign associated', function () {
24-
// given
25-
const campaign = domainBuilder.buildCampaign.ofTypeAssessment();
26-
const campaignParticipation = new CampaignParticipation({
27-
id: 1,
28-
campaign,
29-
assessmentId: 1,
30-
});
31-
32-
// when
33-
const targetProfileId = campaignParticipation.getTargetProfileId();
34-
35-
// then
36-
expect(targetProfileId).to.equal(campaign.targetProfile.id);
37-
});
38-
39-
it('should return null if has not campaign', function () {
40-
// given
41-
const campaignParticipation = new CampaignParticipation({
42-
id: 1,
43-
campaign: null,
44-
assessmentId: 1,
45-
});
46-
47-
// when
48-
const targetProfileId = campaignParticipation.getTargetProfileId();
49-
50-
// then
51-
expect(targetProfileId).to.equal(null);
52-
});
53-
});
54-
5522
describe('delete', function () {
5623
let clock;
5724
const now = new Date('2021-09-25');
@@ -219,7 +186,7 @@ describe('Unit | Domain | Models | CampaignParticipation', function () {
219186

220187
context('when the campaign is not accessible', function () {
221188
it('throws an ArchivedCampaignError error', async function () {
222-
const campaign = { isAccessible: () => false };
189+
const campaign = { isAccessible: false };
223190
const campaignParticipation = new CampaignParticipation({ campaign });
224191

225192
const error = await catchErr(campaignParticipation.share, campaignParticipation)();

api/tests/prescription/campaign-participation/unit/domain/usecases/send-shared-participation-results-to-pole-emploi_test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ describe('Unit | Domain | UseCase | send-shared-participation-results-to-pole-em
154154
createdAt: new Date('2020-01-01'),
155155
archivedAt: new Date('2020-02-01'),
156156
type: 'ASSESSMENT',
157-
targetProfile: { id: 'targetProfileId1' },
158-
organization: { id: organizationId },
157+
targetProfileId: 'targetProfileId1',
158+
organizationId,
159159
});
160160
campaignParticipationRepository.get.withArgs(campaignParticipationId).resolves(
161161
domainBuilder.buildCampaignParticipation({
@@ -231,7 +231,7 @@ describe('Unit | Domain | UseCase | send-shared-participation-results-to-pole-em
231231
const campaign = domainBuilder.buildCampaign({
232232
id: campaignId,
233233
type: 'ASSESSMENT',
234-
organization: { id: organizationId },
234+
organizationId,
235235
});
236236
campaignParticipationRepository.get.withArgs(campaignParticipationId).resolves(
237237
domainBuilder.buildCampaignParticipation({

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import _ from 'lodash';
22

3+
import { Campaign } from '../../../../../../src/prescription/campaign/domain/models/Campaign.js';
34
import * as campaignRepository from '../../../../../../src/prescription/campaign/infrastructure/repositories/campaign-repository.js';
45
import { CampaignExternalIdTypes } from '../../../../../../src/prescription/shared/domain/constants.js';
56
import { CAMPAIGN_FEATURES } from '../../../../../../src/shared/domain/constants.js';
67
import { NotFoundError } from '../../../../../../src/shared/domain/errors.js';
7-
import { Campaign } from '../../../../../../src/shared/domain/models/Campaign.js';
88
import { databaseBuilder, domainBuilder, expect } from '../../../../../test-helper.js';
99

1010
describe('Integration | Repository | Campaign', function () {

api/tests/prescription/campaign/unit/application/api/campaigns-api_test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as campaignApi from '../../../../../../src/prescription/campaign/application/api/campaigns-api.js';
22
import { UserNotAuthorizedToCreateCampaignError } from '../../../../../../src/prescription/campaign/domain/errors.js';
3+
import { Campaign } from '../../../../../../src/prescription/campaign/domain/models/Campaign.js';
34
import { usecases } from '../../../../../../src/prescription/campaign/domain/usecases/index.js';
4-
import { Campaign } from '../../../../../../src/shared/domain/models/Campaign.js';
55
import { CampaignReport } from '../../../../../../src/shared/domain/read-models/CampaignReport.js';
66
import { catchErr, expect, sinon } from '../../../../../test-helper.js';
77
import { domainBuilder } from '../../../../../tooling/domain-builder/domain-builder.js';

api/tests/prescription/campaign/unit/domain/usecases/start-writing-campaign-profiles-collection-results-to-stream_test.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ describe('Unit | Domain | Use Cases | start-writing-campaign-profiles-collection
4646
const organization = domainBuilder.buildOrganization();
4747
const user = domainBuilder.buildUser();
4848
domainBuilder.buildMembership({ user, organization });
49-
const campaign = domainBuilder.buildCampaign.ofTypeAssessment({ organization });
49+
const campaign = domainBuilder.buildCampaign.ofTypeAssessment({ organizationId: organization.id });
5050
campaignRepository.get.withArgs(campaign.id).resolves(campaign);
5151
userRepository.getWithMemberships.withArgs(user.id).resolves(user);
5252

@@ -77,7 +77,7 @@ describe('Unit | Domain | Use Cases | start-writing-campaign-profiles-collection
7777
const organization = domainBuilder.buildOrganization();
7878
const user = domainBuilder.buildUser();
7979
domainBuilder.buildMembership({ user, organization });
80-
const campaign = domainBuilder.buildCampaign.ofTypeProfilesCollection();
80+
const campaign = domainBuilder.buildCampaign.ofTypeProfilesCollection({ organizationId: organization.id });
8181
campaignRepository.get.withArgs(campaign.id).resolves(campaign);
8282
userRepository.getWithMemberships.withArgs(user.id).resolves(user);
8383
organizationRepository.get.withArgs(organization.id).resolves(organization);

api/tests/prescription/learner-management/unit/domain/usecases/reconcile-sco-organization-learner-automatically_test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ describe('Unit | UseCase | reconcile-sco-organization-learner-automatically', fu
2828
campaignRepository = { getByCode: sinon.stub() };
2929
getCampaignStub = campaignRepository.getByCode
3030
.withArgs(campaignCode)
31-
.resolves(domainBuilder.buildCampaign({ organization: { id: organizationId } }));
31+
.resolves(domainBuilder.buildCampaign({ organizationId }));
3232

3333
organizationLearnerRepository = {
3434
reconcileUserByNationalStudentIdAndOrganizationId: sinon.stub(),

0 commit comments

Comments
 (0)