Skip to content

Commit c807de6

Browse files
[TECH] Migration de la route api/certifications/:id vers src (PIX-13468).
#9543
2 parents cddb2c7 + d47873e commit c807de6

File tree

18 files changed

+1004
-1144
lines changed

18 files changed

+1004
-1144
lines changed

api/lib/application/certifications/certification-controller.js

-16
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,8 @@
1-
import * as privateCertificateSerializer from '../../../src/certification/results/infrastructure/serializers/private-certificate-serializer.js';
21
import * as requestResponseUtils from '../../../src/shared/infrastructure/utils/request-response-utils.js';
32
import * as events from '../../domain/events/index.js';
43
import { usecases } from '../../domain/usecases/index.js';
54
import * as shareableCertificateSerializer from '../../infrastructure/serializers/jsonapi/shareable-certificate-serializer.js';
65

7-
const getCertification = async function (request, h, dependencies = { requestResponseUtils }) {
8-
const userId = request.auth.credentials.userId;
9-
const certificationId = request.params.id;
10-
const translate = request.i18n.__;
11-
const locale = dependencies.requestResponseUtils.extractLocaleFromRequest(request);
12-
13-
const privateCertificate = await usecases.getPrivateCertificate({
14-
userId,
15-
certificationId,
16-
locale,
17-
});
18-
return privateCertificateSerializer.serialize(privateCertificate, { translate });
19-
};
20-
216
const getCertificationByVerificationCode = async function (request, h, dependencies = { requestResponseUtils }) {
227
const verificationCode = request.payload.verificationCode;
238
const locale = dependencies.requestResponseUtils.extractLocaleFromRequest(request);
@@ -53,7 +38,6 @@ const deneutralizeChallenge = async function (request, h, dependencies = { event
5338
};
5439

5540
const certificationController = {
56-
getCertification,
5741
getCertificationByVerificationCode,
5842
neutralizeChallenge,
5943
deneutralizeChallenge,

api/lib/application/certifications/index.js

-18
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,6 @@ import { certificationController } from './certification-controller.js';
66

77
const register = async function (server) {
88
server.route([
9-
{
10-
method: 'GET',
11-
path: '/api/certifications/{id}',
12-
config: {
13-
validate: {
14-
params: Joi.object({
15-
id: identifiersType.certificationCourseId,
16-
}),
17-
},
18-
handler: certificationController.getCertification,
19-
notes: [
20-
'- **Route nécessitant une authentification**\n' +
21-
'- Seules les certifications de l’utilisateur authentifié sont accessibles\n' +
22-
'- Récupération des informations d’une certification de l’utilisateur courant',
23-
],
24-
tags: ['api', 'certifications'],
25-
},
26-
},
279
{
2810
method: 'POST',
2911
path: '/api/shared-certifications',

api/lib/infrastructure/repositories/certificate-repository.js

+3-87
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,10 @@ import _ from 'lodash';
22

33
import { knex } from '../../../db/knex-database-connection.js';
44
import { NotFoundError } from '../../../lib/domain/errors.js';
5-
import { CertifiedBadge } from '../../../lib/domain/read-models/CertifiedBadge.js';
6-
import {
7-
AssessmentResult,
8-
CompetenceMark,
9-
PrivateCertificate,
10-
ResultCompetenceTree,
11-
ShareableCertificate,
12-
} from '../../domain/models/index.js';
5+
import { CertifiedBadge } from '../../../src/certification/results/domain/read-models/CertifiedBadge.js';
6+
import { AssessmentResult, ResultCompetenceTree, ShareableCertificate } from '../../domain/models/index.js';
137
import * as competenceTreeRepository from './competence-tree-repository.js';
148

15-
const getPrivateCertificate = async function (id, { locale } = {}) {
16-
const certificationCourseDTO = await _selectPrivateCertificates()
17-
.where('certification-courses.id', '=', id)
18-
.groupBy('certification-courses.id', 'sessions.id', 'assessment-results.id')
19-
.where('certification-courses.isPublished', true)
20-
.where('certification-courses.isCancelled', false)
21-
.where('assessment-results.status', AssessmentResult.status.VALIDATED)
22-
.first();
23-
24-
if (!certificationCourseDTO) {
25-
throw new NotFoundError(`Certificate not found for ID ${id}`);
26-
}
27-
28-
const certifiedBadges = await _getCertifiedBadges(id);
29-
30-
const competenceTree = await competenceTreeRepository.get({ locale });
31-
32-
return _toDomainForPrivateCertificate({
33-
certificationCourseDTO,
34-
competenceTree,
35-
certifiedBadges,
36-
});
37-
};
38-
399
const getShareableCertificateByVerificationCode = async function (verificationCode, { locale } = {}) {
4010
const shareableCertificateDTO = await _selectShareableCertificates()
4111
.groupBy('certification-courses.id', 'sessions.id', 'assessment-results.id')
@@ -53,7 +23,7 @@ const getShareableCertificateByVerificationCode = async function (verificationCo
5323
return _toDomainForShareableCertificate({ shareableCertificateDTO, competenceTree, certifiedBadges });
5424
};
5525

56-
export { getPrivateCertificate, getShareableCertificateByVerificationCode };
26+
export { getShareableCertificateByVerificationCode };
5727

5828
async function _getCertifiedBadges(certificationCourseId) {
5929
const complementaryCertificationCourseResults = await knex
@@ -92,34 +62,6 @@ async function _getCertifiedBadges(certificationCourseId) {
9262
return CertifiedBadge.fromComplementaryCertificationCourseResults(complementaryCertificationCourseResults);
9363
}
9464

95-
function _selectPrivateCertificates() {
96-
return _getCertificateQuery().select({
97-
id: 'certification-courses.id',
98-
firstName: 'certification-courses.firstName',
99-
lastName: 'certification-courses.lastName',
100-
birthdate: 'certification-courses.birthdate',
101-
birthplace: 'certification-courses.birthplace',
102-
isPublished: 'certification-courses.isPublished',
103-
isCancelled: 'certification-courses.isCancelled',
104-
userId: 'certification-courses.userId',
105-
date: 'certification-courses.createdAt',
106-
verificationCode: 'certification-courses.verificationCode',
107-
deliveredAt: 'sessions.publishedAt',
108-
certificationCenter: 'sessions.certificationCenter',
109-
maxReachableLevelOnCertificationDate: 'certification-courses.maxReachableLevelOnCertificationDate',
110-
pixScore: 'assessment-results.pixScore',
111-
commentForCandidate: 'assessment-results.commentForCandidate',
112-
commentByAutoJury: 'assessment-results.commentByAutoJury',
113-
assessmentResultStatus: 'assessment-results.status',
114-
assessmentResultId: 'assessment-results.id',
115-
competenceMarks: knex.raw(`
116-
json_agg(
117-
json_build_object('score', "competence-marks".score, 'level', "competence-marks".level, 'competence_code', "competence-marks"."competence_code")
118-
ORDER BY "competence-marks"."competence_code" asc
119-
)`),
120-
});
121-
}
122-
12365
function _selectShareableCertificates() {
12466
return _getCertificateQuery()
12567
.select({
@@ -165,32 +107,6 @@ function _getCertificateQuery() {
165107
.leftJoin('competence-marks', 'competence-marks.assessmentResultId', 'assessment-results.id');
166108
}
167109

168-
function _toDomainForPrivateCertificate({ certificationCourseDTO, competenceTree, certifiedBadges = [] }) {
169-
if (competenceTree) {
170-
const competenceMarks = _.compact(certificationCourseDTO.competenceMarks).map(
171-
(competenceMark) => new CompetenceMark({ ...competenceMark }),
172-
);
173-
174-
const resultCompetenceTree = ResultCompetenceTree.generateTreeFromCompetenceMarks({
175-
competenceTree,
176-
competenceMarks,
177-
certificationId: certificationCourseDTO.id,
178-
assessmentResultId: certificationCourseDTO.assessmentResultId,
179-
});
180-
181-
return PrivateCertificate.buildFrom({
182-
...certificationCourseDTO,
183-
resultCompetenceTree,
184-
certifiedBadgeImages: certifiedBadges,
185-
});
186-
}
187-
188-
return PrivateCertificate.buildFrom({
189-
...certificationCourseDTO,
190-
certifiedBadgeImages: certifiedBadges,
191-
});
192-
}
193-
194110
function _toDomainForShareableCertificate({ shareableCertificateDTO, competenceTree, certifiedBadges }) {
195111
const resultCompetenceTree = ResultCompetenceTree.generateTreeFromCompetenceMarks({
196112
competenceTree,

api/src/certification/results/application/certification-controller.js

+16
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
1+
import * as requestResponseUtils from '../../../../src/shared/infrastructure/utils/request-response-utils.js';
12
import { usecases } from '../domain/usecases/index.js';
23
import * as privateCertificateSerializer from '../infrastructure/serializers/private-certificate-serializer.js';
34

5+
const getCertification = async function (request, h, dependencies = { requestResponseUtils }) {
6+
const userId = request.auth.credentials.userId;
7+
const certificationId = request.params.id;
8+
const translate = request.i18n.__;
9+
const locale = dependencies.requestResponseUtils.extractLocaleFromRequest(request);
10+
11+
const privateCertificate = await usecases.getPrivateCertificate({
12+
userId,
13+
certificationId,
14+
locale,
15+
});
16+
return privateCertificateSerializer.serialize(privateCertificate, { translate });
17+
};
18+
419
const findUserCertifications = async function (request) {
520
const userId = request.auth.credentials.userId;
621
const translate = request.i18n.__;
@@ -10,6 +25,7 @@ const findUserCertifications = async function (request) {
1025
};
1126

1227
const certificationController = {
28+
getCertification,
1329
findUserCertifications,
1430
};
1531

api/src/certification/results/application/certification-route.js

+21
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,28 @@
1+
import Joi from 'joi';
2+
3+
import { identifiersType } from '../../../shared/domain/types/identifiers-type.js';
14
import { certificationController } from './certification-controller.js';
25

36
const register = async function (server) {
47
server.route([
8+
{
9+
method: 'GET',
10+
path: '/api/certifications/{id}',
11+
config: {
12+
validate: {
13+
params: Joi.object({
14+
id: identifiersType.certificationCourseId,
15+
}),
16+
},
17+
handler: certificationController.getCertification,
18+
notes: [
19+
'- **Route nécessitant une authentification**\n' +
20+
'- Seules les certifications de l’utilisateur authentifié sont accessibles\n' +
21+
'- Récupération des informations d’une certification de l’utilisateur courant',
22+
],
23+
tags: ['api', 'certifications'],
24+
},
25+
},
526
{
627
method: 'GET',
728
path: '/api/certifications',

api/lib/domain/usecases/certificate/get-private-certificate.js api/src/certification/results/domain/usecases/get-private-certificate.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { NotFoundError } from '../../errors.js';
1+
import { NotFoundError } from '../../../../shared/domain/errors.js';
22

33
const getPrivateCertificate = async function ({ certificationId, userId, locale, certificateRepository }) {
44
const privateCertificate = await certificateRepository.getPrivateCertificate(certificationId, { locale });

api/src/certification/results/infrastructure/repositories/certificate-repository.js

+26-1
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ import {
77
PrivateCertificate,
88
ResultCompetenceTree,
99
} from '../../../../../lib/domain/models/index.js';
10-
import { CertifiedBadge } from '../../../../../lib/domain/read-models/CertifiedBadge.js';
1110
import * as competenceTreeRepository from '../../../../../lib/infrastructure/repositories/competence-tree-repository.js';
1211
import { NotFoundError } from '../../../../shared/domain/errors.js';
1312
import { CertificationAttestation } from '../../domain/models/CertificationAttestation.js';
13+
import { CertifiedBadge } from '../../domain/read-models/CertifiedBadge.js';
1414

1515
const findByDivisionForScoIsManagingStudentsOrganization = async function ({ organizationId, division }) {
1616
const certificationCourseDTOs = await _selectCertificationAttestations()
@@ -79,10 +79,35 @@ const findPrivateCertificatesByUserId = async function ({ userId }) {
7979
return privateCertificates;
8080
};
8181

82+
const getPrivateCertificate = async function (id, { locale } = {}) {
83+
const certificationCourseDTO = await _selectPrivateCertificates()
84+
.where('certification-courses.id', '=', id)
85+
.groupBy('certification-courses.id', 'sessions.id', 'assessment-results.id')
86+
.where('certification-courses.isPublished', true)
87+
.where('certification-courses.isCancelled', false)
88+
.where('assessment-results.status', AssessmentResult.status.VALIDATED)
89+
.first();
90+
91+
if (!certificationCourseDTO) {
92+
throw new NotFoundError(`Certificate not found for ID ${id}`);
93+
}
94+
95+
const certifiedBadges = await _getCertifiedBadges(id);
96+
97+
const competenceTree = await competenceTreeRepository.get({ locale });
98+
99+
return _toDomainForPrivateCertificate({
100+
certificationCourseDTO,
101+
competenceTree,
102+
certifiedBadges,
103+
});
104+
};
105+
82106
export {
83107
findByDivisionForScoIsManagingStudentsOrganization,
84108
findPrivateCertificatesByUserId,
85109
getCertificationAttestation,
110+
getPrivateCertificate,
86111
};
87112

88113
function _selectCertificationAttestations() {

0 commit comments

Comments
 (0)