Skip to content

Commit

Permalink
[TECH] Migrer les routes liés au campaign participation dans leurs Bo…
Browse files Browse the repository at this point in the history
…unded Context (PIX-11678)

 #8461
  • Loading branch information
pix-service-auto-merge authored Mar 21, 2024
2 parents 23ca411 + f1cf82b commit fa0717e
Show file tree
Hide file tree
Showing 80 changed files with 1,210 additions and 1,282 deletions.
Original file line number Diff line number Diff line change
@@ -1,100 +1,7 @@
import { usecases as devcompUsecases } from '../../../src/devcomp/domain/usecases/index.js';
import * as trainingSerializer from '../../../src/devcomp/infrastructure/serializers/jsonapi/training-serializer.js';
import { usecases } from '../../domain/usecases/index.js';
import { DomainTransaction } from '../../infrastructure/DomainTransaction.js';
import * as campaignAnalysisSerializer from '../../infrastructure/serializers/jsonapi/campaign-analysis-serializer.js';
import * as campaignAssessmentParticipationResultSerializer from '../../infrastructure/serializers/jsonapi/campaign-assessment-participation-result-serializer.js';
import * as campaignAssessmentParticipationSerializer from '../../infrastructure/serializers/jsonapi/campaign-assessment-participation-serializer.js';
import * as campaignProfileSerializer from '../../infrastructure/serializers/jsonapi/campaign-profile-serializer.js';
import { extractLocaleFromRequest } from '../../infrastructure/utils/request-response-utils.js';

const getAnalysis = async function (request, h, dependencies = { campaignAnalysisSerializer }) {
const { userId } = request.auth.credentials;
const campaignParticipationId = request.params.id;
const locale = extractLocaleFromRequest(request);

const campaignAnalysis = await usecases.computeCampaignParticipationAnalysis({
userId,
campaignParticipationId,
locale,
});
return dependencies.campaignAnalysisSerializer.serialize(campaignAnalysis);
};

const getCampaignProfile = async function (request, h, dependencies = { campaignProfileSerializer }) {
const { userId } = request.auth.credentials;
const { campaignId, campaignParticipationId } = request.params;
const locale = extractLocaleFromRequest(request);

const campaignProfile = await usecases.getCampaignProfile({ userId, campaignId, campaignParticipationId, locale });
return dependencies.campaignProfileSerializer.serialize(campaignProfile);
};

const getCampaignAssessmentParticipation = async function (request) {
const { userId } = request.auth.credentials;
const { campaignId, campaignParticipationId } = request.params;

const campaignAssessmentParticipation = await usecases.getCampaignAssessmentParticipation({
userId,
campaignId,
campaignParticipationId,
});
return campaignAssessmentParticipationSerializer.serialize(campaignAssessmentParticipation);
};

const deleteParticipation = async function (request, h) {
const { userId } = request.auth.credentials;
const { id, campaignParticipationId } = request.params;
await DomainTransaction.execute(async (domainTransaction) => {
await usecases.deleteCampaignParticipation({
userId,
campaignId: id,
campaignParticipationId,
domainTransaction,
});
});
return h.response({}).code(204);
};

const getCampaignAssessmentParticipationResult = async function (
request,
h,
dependencies = { campaignAssessmentParticipationResultSerializer },
) {
const { userId } = request.auth.credentials;
const { campaignId, campaignParticipationId } = request.params;
const locale = extractLocaleFromRequest(request);

const campaignAssessmentParticipationResult = await usecases.getCampaignAssessmentParticipationResult({
userId,
campaignId,
campaignParticipationId,
locale,
});
return dependencies.campaignAssessmentParticipationResultSerializer.serialize(campaignAssessmentParticipationResult);
};

const updateParticipantExternalId = async function (request, h) {
const campaignParticipationId = request.params.id;
const participantExternalId = request.payload.data.attributes['participant-external-id'];

await usecases.updateParticipantExternalId({ campaignParticipationId, participantExternalId });
return h.response({}).code(204);
};

const deleteCampaignParticipationForAdmin = async function (request, h) {
const { userId } = request.auth.credentials;
const { id: campaignParticipationId } = request.params;
await DomainTransaction.execute(async (domainTransaction) => {
await usecases.deleteCampaignParticipationForAdmin({
userId,
campaignParticipationId,
domainTransaction,
});
});
return h.response({}).code(204);
};

const findTrainings = async function (request, h, dependencies = { trainingSerializer }) {
const { userId } = request.auth.credentials;
const { id: campaignParticipationId } = request.params;
Expand All @@ -109,13 +16,6 @@ const findTrainings = async function (request, h, dependencies = { trainingSeria
};

const campaignParticipationController = {
getAnalysis,
getCampaignProfile,
getCampaignAssessmentParticipation,
deleteParticipation,
getCampaignAssessmentParticipationResult,
updateParticipantExternalId,
deleteCampaignParticipationForAdmin,
findTrainings,
};

Expand Down
146 changes: 0 additions & 146 deletions api/lib/application/campaign-participations/index.js
Original file line number Diff line number Diff line change
@@ -1,156 +1,10 @@
import Joi from 'joi';

import { securityPreHandlers } from '../../../src/shared/application/security-pre-handlers.js';
import { identifiersType } from '../../../src/shared/domain/types/identifiers-type.js';
import { campaignParticipationController } from './campaign-participation-controller.js';

const register = async function (server) {
server.route([
{
method: 'GET',
path: '/api/campaign-participations/{id}/analyses',
config: {
validate: {
params: Joi.object({
id: identifiersType.campaignParticipationId,
}),
},
handler: campaignParticipationController.getAnalysis,
notes: [
'- **Cette route est restreinte aux utilisateurs authentifiés**\n' +
'- L‘utilisateur doit avoir les droits d‘accès à l‘organisation liée à la participation à la campagne',
"- Récupération de l'analyse d'un participant pour la participation à la campagne",
],
tags: ['api', 'campaign-participation'],
},
},
{
method: 'DELETE',
path: '/api/campaigns/{id}/campaign-participations/{campaignParticipationId}',
config: {
pre: [{ method: securityPreHandlers.checkAuthorizationToManageCampaign }],
validate: {
params: Joi.object({
id: identifiersType.campaignId,
campaignParticipationId: identifiersType.campaignParticipationId,
}),
},
handler: campaignParticipationController.deleteParticipation,
notes: [
"- **Cette route est restreinte aux utilisateurs authentifiés, administrateurs de l'espace Pix Orga ou gestionnaire de la campagne**\n" +
'-Permet de supprimer une campaigne participation',
],
tags: ['api', 'campaign-participation'],
},
},
{
method: 'GET',
path: '/api/campaigns/{campaignId}/profiles-collection-participations/{campaignParticipationId}',
config: {
validate: {
params: Joi.object({
campaignId: identifiersType.campaignId,
campaignParticipationId: identifiersType.campaignParticipationId,
}),
},
handler: campaignParticipationController.getCampaignProfile,
notes: [
'- **Cette route est restreinte aux utilisateurs authentifiés**\n' +
'- L’utilisateur doit avoir les droits d‘accès à l‘organisation liée à la participation à la campagne\n' +
'- Récupération du profil d’un participant pour la participation à la campagne',
],
tags: ['api', 'campaign-participation'],
},
},
{
method: 'GET',
path: '/api/campaigns/{campaignId}/assessment-participations/{campaignParticipationId}',
config: {
validate: {
params: Joi.object({
campaignId: identifiersType.campaignId,
campaignParticipationId: identifiersType.campaignParticipationId,
}),
},
handler: campaignParticipationController.getCampaignAssessmentParticipation,
notes: [
'- **Cette route est restreinte aux utilisateurs authentifiés**\n' +
'- L’utilisateur doit avoir les droits d‘accès à l‘organisation liée à la campagne\n' +
'- Récupération de l’évaluation d’un participant pour la campagne donnée',
],
tags: ['api', 'campaign-participation'],
},
},
{
method: 'GET',
path: '/api/campaigns/{campaignId}/assessment-participations/{campaignParticipationId}/results',
config: {
validate: {
params: Joi.object({
campaignId: identifiersType.campaignId,
campaignParticipationId: identifiersType.campaignParticipationId,
}),
},
handler: campaignParticipationController.getCampaignAssessmentParticipationResult,
notes: [
'- **Cette route est restreinte aux utilisateurs authentifiés**\n' +
'- L’utilisateur doit avoir les droits d‘accès à l‘organisation liée à la campagne\n' +
'- Récupération des résultats de l’évaluation d’un participant pour la campagne donnée',
],
tags: ['api', 'campaign-participation'],
},
},
{
method: 'PATCH',
path: '/api/admin/campaign-participations/{id}',
config: {
pre: [
{
method: (request, h) =>
securityPreHandlers.hasAtLeastOneAccessOf([
securityPreHandlers.checkAdminMemberHasRoleSuperAdmin,
securityPreHandlers.checkAdminMemberHasRoleSupport,
securityPreHandlers.checkAdminMemberHasRoleMetier,
])(request, h),
assign: 'hasAuthorizationToAccessAdminScope',
},
],
validate: {
params: Joi.object({
id: identifiersType.campaignParticipationId,
}),
},
handler: campaignParticipationController.updateParticipantExternalId,
tags: ['api', 'campaign', 'participations', 'admin'],
notes: [
'- **Cette route est restreinte aux utilisateurs ayant accès à Pix Admin**\n' +
"- Elle permet de mettre à jour l'identifaint externe d'une participation ",
],
},
},
{
method: 'DELETE',
path: '/api/admin/campaign-participations/{id}',
config: {
pre: [
{
method: (request, h) =>
securityPreHandlers.hasAtLeastOneAccessOf([
securityPreHandlers.checkAdminMemberHasRoleSuperAdmin,
securityPreHandlers.checkAdminMemberHasRoleSupport,
])(request, h),
},
],
validate: {
params: Joi.object({
id: identifiersType.campaignParticipationId,
}),
},
handler: campaignParticipationController.deleteCampaignParticipationForAdmin,
notes: ['- Permet à un administrateur de supprimer une participation à une campagne'],
tags: ['api', 'campaign-participations'],
},
},
{
method: 'GET',
path: '/api/campaign-participations/{id}/trainings',
Expand Down
2 changes: 1 addition & 1 deletion api/lib/application/campaigns/campaign-controller.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as campaignAnalysisSerializer from '../../../src/prescription/campaign-participation/infrastructure/serializers/jsonapi/campaign-analysis-serializer.js';
import { extractParameters } from '../../../src/shared/infrastructure/utils/query-params-utils.js';
import { usecases } from '../../domain/usecases/index.js';
import * as campaignAnalysisSerializer from '../../infrastructure/serializers/jsonapi/campaign-analysis-serializer.js';
import * as campaignCollectiveResultSerializer from '../../infrastructure/serializers/jsonapi/campaign-collective-result-serializer.js';
import * as campaignToJoinSerializer from '../../infrastructure/serializers/jsonapi/campaign-to-join-serializer.js';
import * as divisionSerializer from '../../infrastructure/serializers/jsonapi/division-serializer.js';
Expand Down
3 changes: 0 additions & 3 deletions api/lib/application/error-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,6 @@ function _mapToHttpError(error) {
if (error instanceof DomainErrors.ImproveCompetenceEvaluationForbiddenError) {
return new HttpErrors.ImproveCompetenceEvaluationForbiddenError(error.message);
}
if (error instanceof DomainErrors.CampaignParticipationDeletedError) {
return new HttpErrors.PreconditionFailedError(error.message);
}
if (error instanceof DomainErrors.AlreadyRatedAssessmentError) {
return new HttpErrors.PreconditionFailedError('Assessment is already rated.');
}
Expand Down
7 changes: 0 additions & 7 deletions api/lib/domain/errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -1025,12 +1025,6 @@ class MissingBadgeCriterionError extends DomainError {
}
}

class CampaignParticipationDeletedError extends DomainError {
constructor(message = 'La participation est supprimée.') {
super(message);
}
}

class DifferentExternalIdentifierError extends DomainError {
constructor(
message = "La valeur de l'externalIdentifier de la méthode de connexion ne correspond pas à celui reçu par le partenaire.",
Expand Down Expand Up @@ -1096,7 +1090,6 @@ export {
AuthenticationMethodAlreadyExistsError,
AuthenticationMethodNotFoundError,
CampaignCodeError,
CampaignParticipationDeletedError,
CampaignTypeError,
CancelledInvitationError,
CandidateNotAuthorizedToJoinSessionError,
Expand Down
63 changes: 0 additions & 63 deletions api/lib/domain/models/CampaignParticipation.js

This file was deleted.

2 changes: 1 addition & 1 deletion api/lib/domain/models/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import { Challenge } from '../../../src/shared/domain/models/Challenge.js';
import { Competence } from '../../../src/shared/domain/models/Competence.js';
import { Examiner } from '../../../src/shared/domain/models/Examiner.js';
import { CampaignParticipant } from './../../../src/prescription/campaign-participation/domain/models/CampaignParticipant.js';
import { CampaignParticipation } from './../../../src/prescription/campaign-participation/domain/models/CampaignParticipation.js';
import { AccountRecoveryDemand } from './AccountRecoveryDemand.js';
import { AnswerCollectionForScoring } from './AnswerCollectionForScoring.js';
import { Area } from './Area.js';
Expand All @@ -46,7 +47,6 @@ import { BadgeDetails } from './BadgeDetails.js';
import { BadgeForCalculation } from './BadgeForCalculation.js';
import { Campaign } from './Campaign.js';
import { CampaignLearningContent } from './CampaignLearningContent.js';
import { CampaignParticipation } from './CampaignParticipation.js';
import { CampaignParticipationResult } from './CampaignParticipationResult.js';
import { CertifiableBadgeAcquisition } from './CertifiableBadgeAcquisition.js';
import { CertifiableProfileForLearningContent } from './CertifiableProfileForLearningContent.js';
Expand Down
Loading

0 comments on commit fa0717e

Please sign in to comment.