Skip to content

Commit

Permalink
[TECH] Migration du usecase permettant d'associer un utilisateur à un…
Browse files Browse the repository at this point in the history
… candidat inscrit en certification (PIX-13808)

 #9860
  • Loading branch information
pix-service-auto-merge committed Aug 21, 2024
2 parents 590670c + 4c0fb46 commit 07a610b
Show file tree
Hide file tree
Showing 53 changed files with 1,683 additions and 2,347 deletions.
18 changes: 0 additions & 18 deletions api/lib/application/sessions/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,24 +68,6 @@ const register = async function (server) {
],
},
},
{
method: 'POST',
path: '/api/sessions/{id}/candidate-participation',
config: {
validate: {
params: Joi.object({
id: identifiersType.sessionId,
}),
},
handler: sessionController.createCandidateParticipation,
tags: ['api', 'sessions', 'certification-candidates'],
notes: [
'Cette route est restreinte aux utilisateurs authentifiés',
'Elle associe un candidat de certification à une session\n' +
"à un utilisateur à l'aide des informations d'identité de celui-ci (nom, prénom et date de naissance).",
],
},
},
{
method: 'PATCH',
path: '/api/admin/sessions/{id}/publish',
Expand Down
27 changes: 0 additions & 27 deletions api/lib/application/sessions/session-controller.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,11 @@
import lodash from 'lodash';

import * as sessionManagementSerializer from '../../../src/certification/session-management/infrastructure/serializers/session-serializer.js';
import * as certificationCandidateSerializer from '../../../src/certification/shared/infrastructure/serializers/jsonapi/certification-candidate-serializer.js';
import { SessionPublicationBatchError } from '../../../src/shared/application/http-errors.js';
import { logger } from '../../../src/shared/infrastructure/utils/logger.js';
import { UserLinkedToCertificationCandidate } from '../../domain/events/UserLinkedToCertificationCandidate.js';
import * as sessionResultsLinkService from '../../domain/services/session-results-link-service.js';
import { usecases } from '../../domain/usecases/index.js';
import * as juryCertificationSummaryRepository from '../../infrastructure/repositories/jury-certification-summary-repository.js';
import * as juryCertificationSummarySerializer from '../../infrastructure/serializers/jsonapi/jury-certification-summary-serializer.js';

const { trim } = lodash;

const getJuryCertificationSummaries = async function (
request,
h,
Expand Down Expand Up @@ -39,26 +33,6 @@ const generateSessionResultsDownloadLink = async function (request, h, dependenc
return h.response({ sessionResultsLink });
};

const createCandidateParticipation = async function (request, h, dependencies = { certificationCandidateSerializer }) {
const userId = request.auth.credentials.userId;
const sessionId = request.params.id;
const firstName = trim(request.payload.data.attributes['first-name']);
const lastName = trim(request.payload.data.attributes['last-name']);
const birthdate = request.payload.data.attributes['birthdate'];

const event = await usecases.linkUserToSessionCertificationCandidate({
userId,
sessionId,
firstName,
lastName,
birthdate,
});

const certificationCandidate = await usecases.getCertificationCandidate({ userId, sessionId });
const serialized = await dependencies.certificationCandidateSerializer.serialize(certificationCandidate);
return event instanceof UserLinkedToCertificationCandidate ? h.response(serialized).created() : serialized;
};

const publish = async function (request, h, dependencies = { sessionManagementSerializer }) {
const sessionId = request.params.id;
const i18n = request.i18n;
Expand Down Expand Up @@ -101,7 +75,6 @@ const flagResultsAsSentToPrescriber = async function (request, h, dependencies =
const sessionController = {
getJuryCertificationSummaries,
generateSessionResultsDownloadLink,
createCandidateParticipation,
publish,
publishInBatch,
unpublish,
Expand Down

This file was deleted.

2 changes: 0 additions & 2 deletions api/lib/domain/events/UserLinkedToCertificationCandidate.js

This file was deleted.

5 changes: 0 additions & 5 deletions api/lib/domain/usecases/get-certification-candidate.js

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -90,16 +90,6 @@ const findByUserId = async function ({ userId }) {
return rawOrganizationLearners.map((rawOrganizationLearner) => new OrganizationLearner(rawOrganizationLearner));
};

const isOrganizationLearnerIdLinkedToUserAndSCOOrganization = async function ({ userId, organizationLearnerId }) {
const exist = await knex('view-active-organization-learners')
.select('view-active-organization-learners.id')
.join('organizations', 'view-active-organization-learners.organizationId', 'organizations.id')
.where({ userId, type: 'SCO', 'view-active-organization-learners.id': organizationLearnerId })
.first();

return Boolean(exist);
};

const _reconcileOrganizationLearners = async function (studentsToImport, allOrganizationLearnersInSameOrganization) {
const nationalStudentIdsFromFile = studentsToImport
.map((organizationLearnerData) => organizationLearnerData.nationalStudentId)
Expand Down Expand Up @@ -381,7 +371,6 @@ export {
get,
getLatestOrganizationLearner,
isActive,
isOrganizationLearnerIdLinkedToUserAndSCOOrganization,
reconcileUserByNationalStudentIdAndOrganizationId,
reconcileUserToOrganizationLearner,
updateCertificability,
Expand Down
28 changes: 28 additions & 0 deletions api/src/certification/enrolment/application/session-controller.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import lodash from 'lodash';

import { normalize } from '../../../shared/infrastructure/utils/string-utils.js';
import { usecases } from '../domain/usecases/index.js';
import * as enrolledCandidateRepository from '../infrastructure/repositories/enrolled-candidate-repository.js';
import * as enrolledCandidateSerializer from '../infrastructure/serializers/enrolled-candidate-serializer.js';
import * as sessionSerializer from '../infrastructure/serializers/session-serializer.js';
const { trim } = lodash;

const createSession = async function (request, _h, dependencies = { sessionSerializer }) {
const userId = request.auth.credentials.userId;
Expand Down Expand Up @@ -34,10 +40,32 @@ const get = async function (request, h, dependencies = { sessionSerializer }) {
return dependencies.sessionSerializer.serialize(session);
};

const createCandidateParticipation = async function (request, h) {
const userId = request.auth.credentials.userId;
const sessionId = request.params.id;
const firstName = trim(request.payload.data.attributes['first-name']);
const lastName = trim(request.payload.data.attributes['last-name']);
const birthdate = request.payload.data.attributes['birthdate'];

const { linkAlreadyDone, candidateId } = await usecases.linkUserToCandidate({
userId,
sessionId,
firstName,
lastName,
birthdate,
normalizeStringFnc: normalize,
});

const candidate = await enrolledCandidateRepository.get(candidateId);
const serialized = await enrolledCandidateSerializer.serializeForParticipation(candidate);
return linkAlreadyDone ? serialized : h.response(serialized).created();
};

const sessionController = {
createSession,
get,
update,
remove,
createCandidateParticipation,
};
export { sessionController };
35 changes: 34 additions & 1 deletion api/src/certification/enrolment/application/session-route.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import Joi from 'joi';
import JoiDate from '@joi/date';
import BaseJoi from 'joi';
const Joi = BaseJoi.extend(JoiDate);

import { securityPreHandlers } from '../../../shared/application/security-pre-handlers.js';
import { identifiersType } from '../../../shared/domain/types/identifiers-type.js';
Expand Down Expand Up @@ -98,6 +100,37 @@ const register = async function (server) {
tags: ['api', 'session'],
},
},
{
method: 'POST',
path: '/api/sessions/{id}/candidate-participation',
config: {
validate: {
params: Joi.object({
id: identifiersType.sessionId,
}),
options: {
allowUnknown: true,
},
payload: Joi.object({
data: {
type: Joi.string().valid('certification-candidates').required(),
attributes: Joi.object({
'first-name': Joi.string().empty(['', null]).required(),
'last-name': Joi.string().empty(['', null]).required(),
birthdate: Joi.date().format('YYYY-MM-DD').raw().required(),
}),
},
}),
},
handler: sessionController.createCandidateParticipation,
tags: ['api', 'sessions', 'certification-candidates'],
notes: [
'Cette route est restreinte aux utilisateurs authentifiés',
'Elle associe un candidat de certification\n' +
"à un utilisateur à l'aide des informations d'identité de celui-ci (nom, prénom et date de naissance).",
],
},
},
]);
};

Expand Down
4 changes: 4 additions & 0 deletions api/src/certification/enrolment/domain/models/Candidate.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ export class Candidate {
return this.userId === userId;
}

link(userId) {
this.userId = userId;
}

validateCertificationInstructions() {
this.hasSeenCertificationInstructions = true;
}
Expand Down
Loading

0 comments on commit 07a610b

Please sign in to comment.