Skip to content

Commit

Permalink
[TECH] Migration de la route api/certifications/:id vers src (PIX-13468
Browse files Browse the repository at this point in the history
…).

 #9543
  • Loading branch information
pix-service-auto-merge authored Jul 17, 2024
2 parents cddb2c7 + d47873e commit c807de6
Show file tree
Hide file tree
Showing 18 changed files with 1,004 additions and 1,144 deletions.
16 changes: 0 additions & 16 deletions api/lib/application/certifications/certification-controller.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,8 @@
import * as privateCertificateSerializer from '../../../src/certification/results/infrastructure/serializers/private-certificate-serializer.js';
import * as requestResponseUtils from '../../../src/shared/infrastructure/utils/request-response-utils.js';
import * as events from '../../domain/events/index.js';
import { usecases } from '../../domain/usecases/index.js';
import * as shareableCertificateSerializer from '../../infrastructure/serializers/jsonapi/shareable-certificate-serializer.js';

const getCertification = async function (request, h, dependencies = { requestResponseUtils }) {
const userId = request.auth.credentials.userId;
const certificationId = request.params.id;
const translate = request.i18n.__;
const locale = dependencies.requestResponseUtils.extractLocaleFromRequest(request);

const privateCertificate = await usecases.getPrivateCertificate({
userId,
certificationId,
locale,
});
return privateCertificateSerializer.serialize(privateCertificate, { translate });
};

const getCertificationByVerificationCode = async function (request, h, dependencies = { requestResponseUtils }) {
const verificationCode = request.payload.verificationCode;
const locale = dependencies.requestResponseUtils.extractLocaleFromRequest(request);
Expand Down Expand Up @@ -53,7 +38,6 @@ const deneutralizeChallenge = async function (request, h, dependencies = { event
};

const certificationController = {
getCertification,
getCertificationByVerificationCode,
neutralizeChallenge,
deneutralizeChallenge,
Expand Down
18 changes: 0 additions & 18 deletions api/lib/application/certifications/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,6 @@ import { certificationController } from './certification-controller.js';

const register = async function (server) {
server.route([
{
method: 'GET',
path: '/api/certifications/{id}',
config: {
validate: {
params: Joi.object({
id: identifiersType.certificationCourseId,
}),
},
handler: certificationController.getCertification,
notes: [
'- **Route nécessitant une authentification**\n' +
'- Seules les certifications de l’utilisateur authentifié sont accessibles\n' +
'- Récupération des informations d’une certification de l’utilisateur courant',
],
tags: ['api', 'certifications'],
},
},
{
method: 'POST',
path: '/api/shared-certifications',
Expand Down
90 changes: 3 additions & 87 deletions api/lib/infrastructure/repositories/certificate-repository.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,10 @@ import _ from 'lodash';

import { knex } from '../../../db/knex-database-connection.js';
import { NotFoundError } from '../../../lib/domain/errors.js';
import { CertifiedBadge } from '../../../lib/domain/read-models/CertifiedBadge.js';
import {
AssessmentResult,
CompetenceMark,
PrivateCertificate,
ResultCompetenceTree,
ShareableCertificate,
} from '../../domain/models/index.js';
import { CertifiedBadge } from '../../../src/certification/results/domain/read-models/CertifiedBadge.js';
import { AssessmentResult, ResultCompetenceTree, ShareableCertificate } from '../../domain/models/index.js';
import * as competenceTreeRepository from './competence-tree-repository.js';

const getPrivateCertificate = async function (id, { locale } = {}) {
const certificationCourseDTO = await _selectPrivateCertificates()
.where('certification-courses.id', '=', id)
.groupBy('certification-courses.id', 'sessions.id', 'assessment-results.id')
.where('certification-courses.isPublished', true)
.where('certification-courses.isCancelled', false)
.where('assessment-results.status', AssessmentResult.status.VALIDATED)
.first();

if (!certificationCourseDTO) {
throw new NotFoundError(`Certificate not found for ID ${id}`);
}

const certifiedBadges = await _getCertifiedBadges(id);

const competenceTree = await competenceTreeRepository.get({ locale });

return _toDomainForPrivateCertificate({
certificationCourseDTO,
competenceTree,
certifiedBadges,
});
};

const getShareableCertificateByVerificationCode = async function (verificationCode, { locale } = {}) {
const shareableCertificateDTO = await _selectShareableCertificates()
.groupBy('certification-courses.id', 'sessions.id', 'assessment-results.id')
Expand All @@ -53,7 +23,7 @@ const getShareableCertificateByVerificationCode = async function (verificationCo
return _toDomainForShareableCertificate({ shareableCertificateDTO, competenceTree, certifiedBadges });
};

export { getPrivateCertificate, getShareableCertificateByVerificationCode };
export { getShareableCertificateByVerificationCode };

async function _getCertifiedBadges(certificationCourseId) {
const complementaryCertificationCourseResults = await knex
Expand Down Expand Up @@ -92,34 +62,6 @@ async function _getCertifiedBadges(certificationCourseId) {
return CertifiedBadge.fromComplementaryCertificationCourseResults(complementaryCertificationCourseResults);
}

function _selectPrivateCertificates() {
return _getCertificateQuery().select({
id: 'certification-courses.id',
firstName: 'certification-courses.firstName',
lastName: 'certification-courses.lastName',
birthdate: 'certification-courses.birthdate',
birthplace: 'certification-courses.birthplace',
isPublished: 'certification-courses.isPublished',
isCancelled: 'certification-courses.isCancelled',
userId: 'certification-courses.userId',
date: 'certification-courses.createdAt',
verificationCode: 'certification-courses.verificationCode',
deliveredAt: 'sessions.publishedAt',
certificationCenter: 'sessions.certificationCenter',
maxReachableLevelOnCertificationDate: 'certification-courses.maxReachableLevelOnCertificationDate',
pixScore: 'assessment-results.pixScore',
commentForCandidate: 'assessment-results.commentForCandidate',
commentByAutoJury: 'assessment-results.commentByAutoJury',
assessmentResultStatus: 'assessment-results.status',
assessmentResultId: 'assessment-results.id',
competenceMarks: knex.raw(`
json_agg(
json_build_object('score', "competence-marks".score, 'level', "competence-marks".level, 'competence_code', "competence-marks"."competence_code")
ORDER BY "competence-marks"."competence_code" asc
)`),
});
}

function _selectShareableCertificates() {
return _getCertificateQuery()
.select({
Expand Down Expand Up @@ -165,32 +107,6 @@ function _getCertificateQuery() {
.leftJoin('competence-marks', 'competence-marks.assessmentResultId', 'assessment-results.id');
}

function _toDomainForPrivateCertificate({ certificationCourseDTO, competenceTree, certifiedBadges = [] }) {
if (competenceTree) {
const competenceMarks = _.compact(certificationCourseDTO.competenceMarks).map(
(competenceMark) => new CompetenceMark({ ...competenceMark }),
);

const resultCompetenceTree = ResultCompetenceTree.generateTreeFromCompetenceMarks({
competenceTree,
competenceMarks,
certificationId: certificationCourseDTO.id,
assessmentResultId: certificationCourseDTO.assessmentResultId,
});

return PrivateCertificate.buildFrom({
...certificationCourseDTO,
resultCompetenceTree,
certifiedBadgeImages: certifiedBadges,
});
}

return PrivateCertificate.buildFrom({
...certificationCourseDTO,
certifiedBadgeImages: certifiedBadges,
});
}

function _toDomainForShareableCertificate({ shareableCertificateDTO, competenceTree, certifiedBadges }) {
const resultCompetenceTree = ResultCompetenceTree.generateTreeFromCompetenceMarks({
competenceTree,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,21 @@
import * as requestResponseUtils from '../../../../src/shared/infrastructure/utils/request-response-utils.js';
import { usecases } from '../domain/usecases/index.js';
import * as privateCertificateSerializer from '../infrastructure/serializers/private-certificate-serializer.js';

const getCertification = async function (request, h, dependencies = { requestResponseUtils }) {
const userId = request.auth.credentials.userId;
const certificationId = request.params.id;
const translate = request.i18n.__;
const locale = dependencies.requestResponseUtils.extractLocaleFromRequest(request);

const privateCertificate = await usecases.getPrivateCertificate({
userId,
certificationId,
locale,
});
return privateCertificateSerializer.serialize(privateCertificate, { translate });
};

const findUserCertifications = async function (request) {
const userId = request.auth.credentials.userId;
const translate = request.i18n.__;
Expand All @@ -10,6 +25,7 @@ const findUserCertifications = async function (request) {
};

const certificationController = {
getCertification,
findUserCertifications,
};

Expand Down
21 changes: 21 additions & 0 deletions api/src/certification/results/application/certification-route.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,28 @@
import Joi from 'joi';

import { identifiersType } from '../../../shared/domain/types/identifiers-type.js';
import { certificationController } from './certification-controller.js';

const register = async function (server) {
server.route([
{
method: 'GET',
path: '/api/certifications/{id}',
config: {
validate: {
params: Joi.object({
id: identifiersType.certificationCourseId,
}),
},
handler: certificationController.getCertification,
notes: [
'- **Route nécessitant une authentification**\n' +
'- Seules les certifications de l’utilisateur authentifié sont accessibles\n' +
'- Récupération des informations d’une certification de l’utilisateur courant',
],
tags: ['api', 'certifications'],
},
},
{
method: 'GET',
path: '/api/certifications',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { NotFoundError } from '../../errors.js';
import { NotFoundError } from '../../../../shared/domain/errors.js';

const getPrivateCertificate = async function ({ certificationId, userId, locale, certificateRepository }) {
const privateCertificate = await certificateRepository.getPrivateCertificate(certificationId, { locale });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ import {
PrivateCertificate,
ResultCompetenceTree,
} from '../../../../../lib/domain/models/index.js';
import { CertifiedBadge } from '../../../../../lib/domain/read-models/CertifiedBadge.js';
import * as competenceTreeRepository from '../../../../../lib/infrastructure/repositories/competence-tree-repository.js';
import { NotFoundError } from '../../../../shared/domain/errors.js';
import { CertificationAttestation } from '../../domain/models/CertificationAttestation.js';
import { CertifiedBadge } from '../../domain/read-models/CertifiedBadge.js';

const findByDivisionForScoIsManagingStudentsOrganization = async function ({ organizationId, division }) {
const certificationCourseDTOs = await _selectCertificationAttestations()
Expand Down Expand Up @@ -79,10 +79,35 @@ const findPrivateCertificatesByUserId = async function ({ userId }) {
return privateCertificates;
};

const getPrivateCertificate = async function (id, { locale } = {}) {
const certificationCourseDTO = await _selectPrivateCertificates()
.where('certification-courses.id', '=', id)
.groupBy('certification-courses.id', 'sessions.id', 'assessment-results.id')
.where('certification-courses.isPublished', true)
.where('certification-courses.isCancelled', false)
.where('assessment-results.status', AssessmentResult.status.VALIDATED)
.first();

if (!certificationCourseDTO) {
throw new NotFoundError(`Certificate not found for ID ${id}`);
}

const certifiedBadges = await _getCertifiedBadges(id);

const competenceTree = await competenceTreeRepository.get({ locale });

return _toDomainForPrivateCertificate({
certificationCourseDTO,
competenceTree,
certifiedBadges,
});
};

export {
findByDivisionForScoIsManagingStudentsOrganization,
findPrivateCertificatesByUserId,
getCertificationAttestation,
getPrivateCertificate,
};

function _selectCertificationAttestations() {
Expand Down
Loading

0 comments on commit c807de6

Please sign in to comment.