Skip to content

Commit

Permalink
[BUGFIX] Désactiver complètement le push FT (#10090)
Browse files Browse the repository at this point in the history
  • Loading branch information
xav-car authored Sep 11, 2024
1 parent 4ce7ed5 commit 82acb0c
Show file tree
Hide file tree
Showing 10 changed files with 313 additions and 712 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { PoleEmploiSending } from '../../../src/shared/domain/models/PoleEmploiSending.js';
import { logger } from '../../../src/shared/infrastructure/utils/logger.js';
import { PoleEmploiPayload } from '../../infrastructure/externals/pole-emploi/PoleEmploiPayload.js';
import * as httpErrorsHelper from '../../infrastructure/http/errors-helper.js';
import { httpAgent } from '../../infrastructure/http/http-agent.js';

const sendCompletedParticipationResultsToPoleEmploi = async ({
campaignParticipationId,
assessmentRepository,
authenticationMethodRepository,
campaignParticipationRepository,
campaignRepository,
organizationRepository,
poleEmploiNotifier,
poleEmploiSendingRepository,
targetProfileRepository,
userRepository,
notifierDependencies = {
httpAgent,
httpErrorsHelper,
logger,
},
}) => {
if (!campaignParticipationId) return;

const participation = await campaignParticipationRepository.get(campaignParticipationId);
const campaign = await campaignRepository.get(participation.campaignId);
const organization = await organizationRepository.get(campaign.organizationId);

if (campaign.isAssessment() && organization.isPoleEmploi) {
const user = await userRepository.get(participation.userId);
const targetProfile = await targetProfileRepository.get(campaign.targetProfileId);
const assessment = await assessmentRepository.get(participation.lastAssessment.id);

const payload = PoleEmploiPayload.buildForParticipationFinished({
user,
campaign,
targetProfile,
participation,
assessment,
});
const response = await poleEmploiNotifier.notify(user.id, payload, {
authenticationMethodRepository: authenticationMethodRepository,
...notifierDependencies,
});

const poleEmploiSending = PoleEmploiSending.buildForParticipationFinished({
campaignParticipationId,
payload: payload.toString(),
isSuccessful: response.isSuccessful,
responseCode: response.code,
});

return poleEmploiSendingRepository.create({ poleEmploiSending });
}
};

export { sendCompletedParticipationResultsToPoleEmploi };
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { PoleEmploiSending } from '../../../src/shared/domain/models/PoleEmploiSending.js';
import { logger } from '../../../src/shared/infrastructure/utils/logger.js';
import { PoleEmploiPayload } from '../../infrastructure/externals/pole-emploi/PoleEmploiPayload.js';
import * as httpErrorsHelper from '../../infrastructure/http/errors-helper.js';
import { httpAgent } from '../../infrastructure/http/http-agent.js';

const sendStartedParticipationResultsToPoleEmploi = async ({
campaignParticipationId,
authenticationMethodRepository,
campaignParticipationRepository,
campaignRepository,
organizationRepository,
poleEmploiNotifier,
poleEmploiSendingRepository,
targetProfileRepository,
userRepository,
notifierDependencies = {
httpAgent,
httpErrorsHelper,
logger,
},
}) => {
const participation = await campaignParticipationRepository.get(campaignParticipationId);
const campaign = await campaignRepository.get(participation.campaignId);
const organization = await organizationRepository.get(campaign.organizationId);

if (campaign.isAssessment() && organization.isPoleEmploi) {
const user = await userRepository.get(participation.userId);
const targetProfile = await targetProfileRepository.get(campaign.targetProfileId);

const payload = PoleEmploiPayload.buildForParticipationStarted({
user,
campaign,
targetProfile,
participation,
});

const response = await poleEmploiNotifier.notify(user.id, payload, {
authenticationMethodRepository: authenticationMethodRepository,
...notifierDependencies,
});

const poleEmploiSending = PoleEmploiSending.buildForParticipationStarted({
campaignParticipationId,
payload: payload.toString(),
isSuccessful: response.isSuccessful,
responseCode: response.code,
});

await poleEmploiSendingRepository.create({ poleEmploiSending });
}
};

export { sendStartedParticipationResultsToPoleEmploi };
Original file line number Diff line number Diff line change
@@ -1,20 +1,6 @@
import * as poleEmploiNotifier from '../../../../../lib/infrastructure/externals/pole-emploi/pole-emploi-notifier.js';
import { PoleEmploiPayload } from '../../../../../lib/infrastructure/externals/pole-emploi/PoleEmploiPayload.js';
import * as httpErrorsHelper from '../../../../../lib/infrastructure/http/errors-helper.js';
import { httpAgent } from '../../../../../lib/infrastructure/http/http-agent.js';
import * as campaignParticipationRepository from '../../../../../lib/infrastructure/repositories/campaign-participation-repository.js';
import * as campaignRepository from '../../../../../lib/infrastructure/repositories/campaign-repository.js';
import * as poleEmploiSendingRepository from '../../../../../lib/infrastructure/repositories/pole-emploi-sending-repository.js';
import * as targetProfileRepository from '../../../../../lib/infrastructure/repositories/target-profile-repository.js';
import { logger } from '../../../../../src/shared/infrastructure/utils/logger.js';
import { assessmentRepository } from '../../../../certification/session-management/infrastructure/repositories/index.js';
import * as authenticationMethodRepository from '../../../../identity-access-management/infrastructure/repositories/authentication-method.repository.js';
import * as userRepository from '../../../../identity-access-management/infrastructure/repositories/user.repository.js';
import { usecases } from '../../../../../lib/domain/usecases/index.js';
import { JobController } from '../../../../shared/application/jobs/job-controller.js';
import { PoleEmploiSending } from '../../../../shared/domain/models/index.js';
import * as organizationRepository from '../../../../shared/infrastructure/repositories/organization-repository.js';
import { ParticipationCompletedJob } from '../../domain/models/ParticipationCompletedJob.js';

export class ParticipationCompletedJobController extends JobController {
constructor() {
super(ParticipationCompletedJob.name);
Expand All @@ -24,58 +10,9 @@ export class ParticipationCompletedJobController extends JobController {
return 'PoleEmploiParticipationCompletedJob';
}

async handle({
data,
dependencies = {
authenticationMethodRepository,
assessmentRepository,
campaignRepository,
campaignParticipationRepository,
organizationRepository,
poleEmploiSendingRepository,
targetProfileRepository,
userRepository,
poleEmploiNotifier,
logger,
httpAgent,
httpErrorsHelper,
},
}) {
async handle({ data }) {
const { campaignParticipationId } = data;

if (!campaignParticipationId) return;

const participation = await dependencies.campaignParticipationRepository.get(campaignParticipationId);
const campaign = await dependencies.campaignRepository.get(participation.campaignId);
const organization = await dependencies.organizationRepository.get(campaign.organizationId);

if (campaign.isAssessment() && organization.isPoleEmploi) {
const user = await dependencies.userRepository.get(participation.userId);
const targetProfile = await dependencies.targetProfileRepository.get(campaign.targetProfileId);
const assessment = await dependencies.assessmentRepository.get(participation.lastAssessment.id);

const payload = PoleEmploiPayload.buildForParticipationFinished({
user,
campaign,
targetProfile,
participation,
assessment,
});
const response = await dependencies.poleEmploiNotifier.notify(user.id, payload, {
authenticationMethodRepository: dependencies.authenticationMethodRepository,
httpAgent: dependencies.httpAgent,
httpErrorsHelper: dependencies.httpErrorsHelper,
logger: dependencies.logger,
});

const poleEmploiSending = PoleEmploiSending.buildForParticipationFinished({
campaignParticipationId,
payload: payload.toString(),
isSuccessful: response.isSuccessful,
responseCode: response.code,
});

return dependencies.poleEmploiSendingRepository.create({ poleEmploiSending });
}
await usecases.sendCompletedParticipationResultsToPoleEmploi({ campaignParticipationId });
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
import * as poleEmploiNotifier from '../../../../../lib/infrastructure/externals/pole-emploi/pole-emploi-notifier.js';
import { PoleEmploiPayload } from '../../../../../lib/infrastructure/externals/pole-emploi/PoleEmploiPayload.js';
import * as httpErrorsHelper from '../../../../../lib/infrastructure/http/errors-helper.js';
import { httpAgent } from '../../../../../lib/infrastructure/http/http-agent.js';
import * as campaignRepository from '../../../../../lib/infrastructure/repositories/campaign-repository.js';
import * as poleEmploiSendingRepository from '../../../../../lib/infrastructure/repositories/pole-emploi-sending-repository.js';
import * as targetProfileRepository from '../../../../../lib/infrastructure/repositories/target-profile-repository.js';
import * as authenticationMethodRepository from '../../../../identity-access-management/infrastructure/repositories/authentication-method.repository.js';
import * as userRepository from '../../../../identity-access-management/infrastructure/repositories/user.repository.js';
import { usecases } from '../../../../../lib/domain/usecases/index.js';
import { JobController } from '../../../../shared/application/jobs/job-controller.js';
import { PoleEmploiSending } from '../../../../shared/domain/models/index.js';
import * as organizationRepository from '../../../../shared/infrastructure/repositories/organization-repository.js';
import { logger } from '../../../../shared/infrastructure/utils/logger.js';
import { ParticipationStartedJob } from '../../domain/models/ParticipationStartedJob.js';
import * as campaignParticipationRepository from '../../infrastructure/repositories/campaign-participation-repository.js';

export class ParticipationStartedJobController extends JobController {
constructor() {
Expand All @@ -23,54 +11,9 @@ export class ParticipationStartedJobController extends JobController {
return 'PoleEmploiParticipationStartedJob';
}

async handle({
data,
dependencies = {
authenticationMethodRepository,
campaignRepository,
campaignParticipationRepository,
organizationRepository,
poleEmploiSendingRepository,
targetProfileRepository,
userRepository,
poleEmploiNotifier,
httpAgent,
httpErrorsHelper,
logger,
},
}) {
async handle({ data }) {
const { campaignParticipationId } = data;

const participation = await dependencies.campaignParticipationRepository.get(campaignParticipationId);
const campaign = await dependencies.campaignRepository.get(participation.campaignId);
const organization = await dependencies.organizationRepository.get(campaign.organizationId);

if (campaign.isAssessment() && organization.isPoleEmploi) {
const user = await dependencies.userRepository.get(participation.userId);
const targetProfile = await dependencies.targetProfileRepository.get(campaign.targetProfileId);

const payload = PoleEmploiPayload.buildForParticipationStarted({
user,
campaign,
targetProfile,
participation,
});

const response = await dependencies.poleEmploiNotifier.notify(user.id, payload, {
authenticationMethodRepository: dependencies.authenticationMethodRepository,
httpAgent: dependencies.httpAgent,
httpErrorsHelper: dependencies.httpErrorsHelper,
logger: dependencies.logger,
});

const poleEmploiSending = PoleEmploiSending.buildForParticipationStarted({
campaignParticipationId,
payload: payload.toString(),
isSuccessful: response.isSuccessful,
responseCode: response.code,
});

await dependencies.poleEmploiSendingRepository.create({ poleEmploiSending });
}
await usecases.sendSharedParticipationResultsToPoleEmploi({ campaignParticipationId });
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { usecases } from '../../../../lib/domain/usecases/index.js';
import * as poleEmploiNotifier from '../../../../lib/infrastructure/externals/pole-emploi/pole-emploi-notifier.js';
import {
databaseBuilder,
expect,
knex,
learningContentBuilder,
mockLearningContent,
sinon,
} from '../../../test-helper.js';

describe('Integration | Domain | UseCases | send-completed-participation-results-to-pole-emploi', function () {
let campaignParticipationId, userId, responseCode;
let httpAgentStub, httpErrorsHelperStub, loggerStub;

beforeEach(async function () {
httpAgentStub = { post: sinon.stub() };
loggerStub = { info: sinon.stub(), error: sinon.stub() };
httpErrorsHelperStub = { serializeHttpErrorResponse: sinon.stub() };
responseCode = Symbol('responseCode');

userId = databaseBuilder.factory.buildUser().id;
databaseBuilder.factory.buildAuthenticationMethod.withPoleEmploiAsIdentityProvider({ userId });

const organizationId = databaseBuilder.factory.buildOrganization().id;
const tagId = databaseBuilder.factory.buildTag({ name: 'POLE EMPLOI' }).id;
databaseBuilder.factory.buildOrganizationTag({ organizationId, tagId });
const campaignId = databaseBuilder.factory.buildCampaign({ organizationId }).id;
databaseBuilder.factory.buildCampaignSkill({ campaignId });
campaignParticipationId = databaseBuilder.factory.buildCampaignParticipation({ campaignId, userId }).id;
databaseBuilder.factory.buildAssessment({ campaignParticipationId, userId });
const learningContentObjects = learningContentBuilder.fromAreas([]);
mockLearningContent(learningContentObjects);
return databaseBuilder.commit();
});

it('should save success of this notification', async function () {
// given
httpAgentStub.post.resolves({
isSuccessful: true,
code: responseCode,
data: {
access_token: 'token',
expires_in: new Date(),
refresh_token: 'refresh_token',
},
});

// when
await usecases.sendCompletedParticipationResultsToPoleEmploi({
campaignParticipationId,
poleEmploiNotifier,
notifierDependencies: {
httpAgent: httpAgentStub,
httpErrorsHelper: httpErrorsHelperStub,
logger: loggerStub,
},
});

// then
const poleEmploiSendings = await knex('pole-emploi-sendings').where({ campaignParticipationId });
expect(poleEmploiSendings.length).to.equal(1);
expect(poleEmploiSendings[0].responseCode).to.equal(responseCode.toString());
expect(poleEmploiSendings[0].type).to.equal('CAMPAIGN_PARTICIPATION_COMPLETION');
});

it('should return a disable send notification by default (if push is disabled) ', async function () {
// when
await usecases.sendCompletedParticipationResultsToPoleEmploi({
campaignParticipationId,
});

// then
const poleEmploiSendings = await knex('pole-emploi-sendings').where({ campaignParticipationId });
expect(poleEmploiSendings.length).to.equal(1);
expect(poleEmploiSendings[0].isSuccessful).to.be.false;
expect(poleEmploiSendings[0].responseCode).to.equal('SENDING-DISABLED');
expect(poleEmploiSendings[0].type).to.equal('CAMPAIGN_PARTICIPATION_COMPLETION');
});
});
Loading

0 comments on commit 82acb0c

Please sign in to comment.