Skip to content

Commit

Permalink
[TECH] migrate /api/admin/target-profiles/{id}/badges route (PIX-14465)…
Browse files Browse the repository at this point in the history
… (#10172)
  • Loading branch information
La-toile-cosmique authored Sep 26, 2024
1 parent c62ae17 commit 750478f
Show file tree
Hide file tree
Showing 8 changed files with 463 additions and 451 deletions.
55 changes: 0 additions & 55 deletions api/lib/application/target-profiles/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -161,61 +161,6 @@ const register = async function (server) {
],
},
},
{
method: 'POST',
path: '/api/admin/target-profiles/{id}/badges',
config: {
pre: [
{
method: (request, h) =>
securityPreHandlers.hasAtLeastOneAccessOf([
securityPreHandlers.checkAdminMemberHasRoleSuperAdmin,
securityPreHandlers.checkAdminMemberHasRoleSupport,
securityPreHandlers.checkAdminMemberHasRoleMetier,
])(request, h),
assign: 'hasAuthorizationToAccessAdminScope',
},
],
validate: {
params: Joi.object({
id: identifiersType.targetProfileId,
}),
payload: Joi.object({
data: Joi.object({
attributes: Joi.object({
key: Joi.string().required(),
'alt-message': Joi.string().required(),
'image-url': Joi.string().required(),
message: Joi.string().required().allow('').allow(null),
title: Joi.string().required().allow('').allow(null),
'is-certifiable': Joi.boolean().required(),
'is-always-visible': Joi.boolean().required(),
'campaign-threshold': Joi.number().min(0).max(100).allow(null),
'capped-tubes-criteria': Joi.array().items({
name: Joi.string(),
threshold: Joi.string().required(),
cappedTubes: Joi.array()
.min(1)
.items({
id: Joi.string(),
level: Joi.number().min(0),
}),
}),
})
.or('campaign-threshold', 'capped-tubes-criteria')
.required(),
type: Joi.string().required(),
}).required(),
}).required(),
},
handler: targetProfileController.createBadge,
tags: ['api', 'admin', 'badges'],
notes: [
"- **Cette route est restreinte aux utilisateurs authentifiés ayant les droits d'accès**\n" +
'- Elle permet de créer un résultat thématique rattaché au profil cible.',
],
},
},
{
method: 'PATCH',
path: '/api/admin/target-profiles/{id}',
Expand Down
13 changes: 0 additions & 13 deletions api/lib/application/target-profiles/target-profile-controller.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import { usecases as devcompUsecases } from '../../../src/devcomp/domain/usecases/index.js';
import * as trainingSummarySerializer from '../../../src/devcomp/infrastructure/serializers/jsonapi/training-summary-serializer.js';
import { evaluationUsecases } from '../../../src/evaluation/domain/usecases/index.js';
import { deserializer as badgeCreationDeserializer } from '../../../src/evaluation/infrastructure/serializers/jsonapi/badge-creation-serializer.js';
import * as badgeSerializer from '../../../src/evaluation/infrastructure/serializers/jsonapi/badge-serializer.js';
import * as targetProfileSerializer from '../../../src/prescription/target-profile/infrastructure/serializers/jsonapi/target-profile-serializer.js';
import * as targetProfileSummaryForAdminSerializer from '../../../src/prescription/target-profile/infrastructure/serializers/jsonapi/target-profile-summary-for-admin-serializer.js';
import { usecases } from '../../domain/usecases/index.js';
Expand Down Expand Up @@ -63,22 +60,12 @@ const findPaginatedTrainings = async function (request, h, dependencies = { trai
return dependencies.trainingSummarySerializer.serialize(trainings, meta);
};

const createBadge = async function (request, h) {
const targetProfileId = request.params.id;
const badgeCreation = await badgeCreationDeserializer.deserialize(request.payload);

const createdBadge = await evaluationUsecases.createBadge({ targetProfileId, badgeCreation });

return h.response(badgeSerializer.serialize(createdBadge)).created();
};

const targetProfileController = {
findPaginatedFilteredTargetProfileSummariesForAdmin,
getTargetProfileForAdmin,
updateTargetProfile,
createTargetProfile,
findPaginatedTrainings,
createBadge,
};

export { targetProfileController };
16 changes: 13 additions & 3 deletions api/src/evaluation/application/badges/badges-controller.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { evaluationUsecases as usecases } from '../../../evaluation/domain/usecases/index.js';
import { evaluationUsecases } from '../../../evaluation/domain/usecases/index.js';
import { sharedUsecases } from '../../../shared/domain/usecases/index.js';
import { deserializer as badgeCreationDeserializer } from '../../infrastructure/serializers/jsonapi/badge-creation-serializer.js';
import * as badgeSerializer from '../../infrastructure/serializers/jsonapi/badge-serializer.js';

const updateBadge = async function (request, h) {
const badgeId = request.params.id;
const badge = badgeSerializer.deserialize(request.payload);

const updatedBadge = await usecases.updateBadge({ badgeId, badge });
const updatedBadge = await evaluationUsecases.updateBadge({ badgeId, badge });

return h.response(badgeSerializer.serialize(updatedBadge)).code(204);
};
Expand All @@ -18,6 +19,15 @@ const deleteUnassociatedBadge = async function (request, h) {
return h.response().code(204);
};

const badgesController = { updateBadge, deleteUnassociatedBadge };
const createBadge = async function (request, h) {
const targetProfileId = request.params.id;
const badgeCreation = await badgeCreationDeserializer.deserialize(request.payload);

const createdBadge = await evaluationUsecases.createBadge({ targetProfileId, badgeCreation });

return h.response(badgeSerializer.serialize(createdBadge)).created();
};

const badgesController = { updateBadge, deleteUnassociatedBadge, createBadge };

export { badgesController };
55 changes: 55 additions & 0 deletions api/src/evaluation/application/badges/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,61 @@ const register = async function (server) {
],
},
},
{
method: 'POST',
path: '/api/admin/target-profiles/{id}/badges',
config: {
pre: [
{
method: (request, h) =>
securityPreHandlers.hasAtLeastOneAccessOf([
securityPreHandlers.checkAdminMemberHasRoleSuperAdmin,
securityPreHandlers.checkAdminMemberHasRoleSupport,
securityPreHandlers.checkAdminMemberHasRoleMetier,
])(request, h),
assign: 'hasAuthorizationToAccessAdminScope',
},
],
validate: {
params: Joi.object({
id: identifiersType.targetProfileId,
}),
payload: Joi.object({
data: Joi.object({
attributes: Joi.object({
key: Joi.string().required(),
'alt-message': Joi.string().required(),
'image-url': Joi.string().required(),
message: Joi.string().required().allow('').allow(null),
title: Joi.string().required().allow('').allow(null),
'is-certifiable': Joi.boolean().required(),
'is-always-visible': Joi.boolean().required(),
'campaign-threshold': Joi.number().min(0).max(100).allow(null),
'capped-tubes-criteria': Joi.array().items({
name: Joi.string(),
threshold: Joi.string().required(),
cappedTubes: Joi.array()
.min(1)
.items({
id: Joi.string(),
level: Joi.number().min(0),
}),
}),
})
.or('campaign-threshold', 'capped-tubes-criteria')
.required(),
type: Joi.string().required(),
}).required(),
}).required(),
},
handler: badgesController.createBadge,
tags: ['api', 'admin', 'badges'],
notes: [
"- **Cette route est restreinte aux utilisateurs authentifiés ayant les droits d'accès**\n" +
'- Elle permet de créer un résultat thématique rattaché au profil cible.',
],
},
},
]);
};

Expand Down
Loading

0 comments on commit 750478f

Please sign in to comment.