Skip to content

Commit

Permalink
feat(api): migrate new certification center member route
Browse files Browse the repository at this point in the history
  • Loading branch information
P-Jeremy committed Feb 7, 2025
1 parent c594d2d commit 028fb64
Show file tree
Hide file tree
Showing 9 changed files with 278 additions and 236 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,6 @@ const findCertificationCenterMembershipsByCertificationCenter = async function (
return dependencies.certificationCenterMembershipSerializer.serialize(certificationCenterMemberships);
};

const createCertificationCenterMembershipByEmail = async function (
request,
h,
dependencies = { certificationCenterMembershipSerializer },
) {
const certificationCenterId = request.params.certificationCenterId;
const { email } = request.payload;

const certificationCenterMembership = await usecases.createCertificationCenterMembershipByEmail({
certificationCenterId,
email,
});
return h
.response(dependencies.certificationCenterMembershipSerializer.serialize(certificationCenterMembership))
.created();
};

const updateReferer = async function (request, h) {
const certificationCenterId = request.params.certificationCenterId;
const { userId, isReferer } = request.payload.data.attributes;
Expand All @@ -45,7 +28,6 @@ const updateReferer = async function (request, h) {
};

const certificationCenterController = {
createCertificationCenterMembershipByEmail,
findCertificationCenterMembershipsByCertificationCenter,
updateReferer,
};
Expand Down
33 changes: 0 additions & 33 deletions api/lib/application/certification-centers/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,39 +35,6 @@ const register = async function (server) {
tags: ['api', 'admin', 'certification-center-membership'],
},
},
{
method: 'POST',
path: '/api/admin/certification-centers/{certificationCenterId}/certification-center-memberships',
config: {
pre: [
{
method: (request, h) =>
securityPreHandlers.hasAtLeastOneAccessOf([
securityPreHandlers.checkAdminMemberHasRoleSuperAdmin,
securityPreHandlers.checkAdminMemberHasRoleCertif,
securityPreHandlers.checkAdminMemberHasRoleSupport,
securityPreHandlers.checkAdminMemberHasRoleMetier,
])(request, h),
assign: 'hasAuthorizationToAccessAdminScope',
},
],
validate: {
params: Joi.object({
certificationCenterId: identifiersType.certificationCenterId,
}),
payload: Joi.object().required().keys({
email: Joi.string().email().required(),
}),
},
handler: certificationCenterController.createCertificationCenterMembershipByEmail,
notes: [
"- **Cette route est restreinte aux utilisateurs ayant les droits d'accès**\n" +
"- Création d‘un nouveau membre d'un centre de certification,\n" +
"à partir de l'adresse e-mail d'un utilisateur.",
],
tags: ['api', 'certification-center-membership'],
},
},
];
const certifRoutes = [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,27 @@ const disableFromPixAdmin = async function (request, h, dependencies = { request
return h.response().code(204);
};

const createCertificationCenterMembershipByEmail = async function (
request,
h,
dependencies = { certificationCenterMembershipSerializer },
) {
const certificationCenterId = request.params.certificationCenterId;
const { email } = request.payload;

const certificationCenterMembership = await usecases.createCertificationCenterMembershipByEmail({
certificationCenterId,
email,
});
return h
.response(dependencies.certificationCenterMembershipSerializer.serialize(certificationCenterMembership))
.created();
};

const certificationCenterMembershipAdminController = {
updateRole,
disableFromPixAdmin,
createCertificationCenterMembershipByEmail,
};

export { certificationCenterMembershipAdminController };
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import Joi from 'joi';

import { securityPreHandlers } from '../../../shared/application/security-pre-handlers.js';
import { identifiersType } from '../../../shared/domain/types/identifiers-type.js';
import { certificationCenterMembershipAdminController } from './certification-center-membership.admin.controller.js';

export const certificationCenterMembershipAdminRoutes = [
Expand Down Expand Up @@ -50,4 +53,37 @@ export const certificationCenterMembershipAdminRoutes = [
tags: ['api', 'certification-center-membership'],
},
},
{
method: 'POST',
path: '/api/admin/certification-centers/{certificationCenterId}/certification-center-memberships',
config: {
pre: [
{
method: (request, h) =>
securityPreHandlers.hasAtLeastOneAccessOf([
securityPreHandlers.checkAdminMemberHasRoleSuperAdmin,
securityPreHandlers.checkAdminMemberHasRoleCertif,
securityPreHandlers.checkAdminMemberHasRoleSupport,
securityPreHandlers.checkAdminMemberHasRoleMetier,
])(request, h),
assign: 'hasAuthorizationToAccessAdminScope',
},
],
validate: {
params: Joi.object({
certificationCenterId: identifiersType.certificationCenterId,
}),
payload: Joi.object().required().keys({
email: Joi.string().email().required(),
}),
},
handler: certificationCenterMembershipAdminController.createCertificationCenterMembershipByEmail,
notes: [
"- **Cette route est restreinte aux utilisateurs ayant les droits d'accès**\n" +
"- Création d‘un nouveau membre d'un centre de certification,\n" +
"à partir de l'adresse e-mail d'un utilisateur.",
],
tags: ['api', 'certification-center-membership'],
},
},
];
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
} from '../../../test-helper.js';

describe('Acceptance | API | Certification Center', function () {
let server, request;
let server;

beforeEach(async function () {
server = await createServer();
Expand Down Expand Up @@ -197,108 +197,6 @@ describe('Acceptance | API | Certification Center', function () {
});
});

describe('POST /api/admin/certification-centers/{certificationCenterId}/certification-center-memberships', function () {
let certificationCenterId;
let email;

beforeEach(async function () {
email = '[email protected]';

certificationCenterId = databaseBuilder.factory.buildCertificationCenter().id;
databaseBuilder.factory.buildUser({ email });

request = {
headers: generateAuthenticatedUserRequestHeaders(),
method: 'POST',
url: `/api/admin/certification-centers/${certificationCenterId}/certification-center-memberships`,
payload: { email },
};

await databaseBuilder.commit();
});

it('should return 201 HTTP status', async function () {
// when
const response = await server.inject(request);

// then
expect(response.statusCode).to.equal(201);
});

context('when user is not SuperAdmin', function () {
it('should return 403 HTTP status code ', async function () {
// given
request.headers = generateAuthenticatedUserRequestHeaders({ userId: 1111 });

// when
const response = await server.inject(request);

// then
expect(response.statusCode).to.equal(403);
});
});

context('when user is not authenticated', function () {
it('should return 401 HTTP status code', async function () {
// given
request.headers.authorization = 'invalid.access.token';

// when
const response = await server.inject(request);

// then
expect(response.statusCode).to.equal(401);
});
});

context('when certification center does not exist', function () {
it('should return 404 HTTP status code', async function () {
// given
request.url = '/api/admin/certification-centers/1/certification-center-memberships';

// when
const response = await server.inject(request);

// then
expect(response.statusCode).to.equal(400);
});
});

context("when user's email does not exist", function () {
it('should return 404 HTTP status code', async function () {
// given
request.payload.email = '[email protected]';

// when
const response = await server.inject(request);

// then
expect(response.statusCode).to.equal(404);
});
});

context('when user is already member of the certification center', function () {
it('should return 412 HTTP status code', async function () {
// given
email = '[email protected]';
const userId = databaseBuilder.factory.buildUser({ email }).id;
databaseBuilder.factory.buildCertificationCenterMembership({
certificationCenterId,
userId,
});
request.payload.email = email;

await databaseBuilder.commit();

// when
const response = await server.inject(request);

// then
expect(response.statusCode).to.equal(412);
});
});
});

describe('POST /api/certif/certification-centers/{certificationCenterId}/update-referer', function () {
it('should return 204 HTTP status', async function () {
// given
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,4 +250,108 @@ describe('Acceptance | Team | Application | Admin | Routes | certification-cente
});
});
});

describe('POST /api/admin/certification-centers/{certificationCenterId}/certification-center-memberships', function () {
let certificationCenterId;
let email;
let request;

beforeEach(async function () {
email = '[email protected]';

certificationCenterId = databaseBuilder.factory.buildCertificationCenter().id;
const adminId = databaseBuilder.factory.buildUser.withRole().id;
databaseBuilder.factory.buildUser({ email });

request = {
headers: generateAuthenticatedUserRequestHeaders({ userId: adminId }),
method: 'POST',
url: `/api/admin/certification-centers/${certificationCenterId}/certification-center-memberships`,
payload: { email },
};

await databaseBuilder.commit();
});

it('should return 201 HTTP status', async function () {
// when
const response = await server.inject(request);

// then
expect(response.statusCode).to.equal(201);
});

context('when user is not SuperAdmin', function () {
it('should return 403 HTTP status code ', async function () {
// given
request.headers = generateAuthenticatedUserRequestHeaders({ userId: 1111 });

// when
const response = await server.inject(request);

// then
expect(response.statusCode).to.equal(403);
});
});

context('when user is not authenticated', function () {
it('should return 401 HTTP status code', async function () {
// given
request.headers.authorization = 'invalid.access.token';

// when
const response = await server.inject(request);

// then
expect(response.statusCode).to.equal(401);
});
});

context('when certification center does not exist', function () {
it('should return 404 HTTP status code', async function () {
// given
request.url = '/api/admin/certification-centers/1/certification-center-memberships';

// when
const response = await server.inject(request);

// then
expect(response.statusCode).to.equal(400);
});
});

context("when user's email does not exist", function () {
it('should return 404 HTTP status code', async function () {
// given
request.payload.email = '[email protected]';

// when
const response = await server.inject(request);

// then
expect(response.statusCode).to.equal(404);
});
});

context('when user is already member of the certification center', function () {
it('should return 412 HTTP status code', async function () {
// given
email = '[email protected]';
const userId = databaseBuilder.factory.buildUser({ email }).id;
databaseBuilder.factory.buildCertificationCenterMembership({
certificationCenterId,
userId,
});
request.payload.email = email;

await databaseBuilder.commit();

// when
const response = await server.inject(request);

// then
expect(response.statusCode).to.equal(412);
});
});
});
});
Loading

0 comments on commit 028fb64

Please sign in to comment.