Skip to content

Commit

Permalink
feat(api): create quest controller and route
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexandre-Monney committed Oct 18, 2024
1 parent 67ac390 commit 7cb510d
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 0 deletions.
2 changes: 2 additions & 0 deletions api/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import { organizationLearnerRoutes } from './src/prescription/organization-learn
import { organizationPlaceRoutes } from './src/prescription/organization-place/routes.js';
import { targetProfileRoutes } from './src/prescription/target-profile/routes.js';
import { profileRoutes } from './src/profile/routes.js';
import { questRoutes } from './src/quest/routes.js';
import { schoolRoutes } from './src/school/routes.js';
import { config } from './src/shared/config.js';
import { monitoringTools } from './src/shared/infrastructure/monitoring-tools.js';
Expand Down Expand Up @@ -155,6 +156,7 @@ const setupRoutesAndPlugins = async function (server) {
organizationalEntitiesRoutes,
sharedRoutes,
profileRoutes,
questRoutes,
evaluationRoutes,
flashCertificationRoutes,
devcompRoutes,
Expand Down
34 changes: 34 additions & 0 deletions api/src/quest/application/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import Joi from 'joi';

import { securityPreHandlers } from '../../shared/application/security-pre-handlers.js';
import { identifiersType } from '../../shared/domain/types/identifiers-type.js';
import { questController } from './quest-controller.js';

const register = async function (server) {
server.route([
{
method: 'GET',
path: '/api/campaign-participations/{campaignParticipationId}/quest-results',
config: {
pre: [
{
method: securityPreHandlers.checkCampaignParticipationBelongsToUser,
},
],
handler: questController.getQuestResults,
validate: {
params: Joi.object({
campaignParticipationId: identifiersType.campaignParticipationId,
}),
},
notes: [
'- **Route nécessitant une authentification**\n' +
"- Récupère le résultat d'une quête pour une participation et un user donné",
],
tags: ['api', 'quest'],
},
},
]);
};
const name = 'quest-api';
export { name, register };
20 changes: 20 additions & 0 deletions api/src/quest/application/quest-controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import * as requestResponseUtils from '../../shared/infrastructure/utils/request-response-utils.js';
import { usecases } from '../domain/usecases/index.js';
import * as questResultSerializer from '../infrastructure/serializers/quest-result-serializer.js';

const getQuestResults = async function (request, h, dependencies = { questResultSerializer, requestResponseUtils }) {
const { campaignParticipationId } = request.params;
const userId = dependencies.requestResponseUtils.extractUserIdFromRequest(request);

const questResults = await usecases.getQuestResultsForCampaignParticipation({ userId, campaignParticipationId });

const serializedQuestResults = dependencies.questResultSerializer.serialize(questResults);

return h.response(serializedQuestResults);
};

const questController = {
getQuestResults,
};

export { questController };
5 changes: 5 additions & 0 deletions api/src/quest/routes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import * as questRoute from './application/index.js';

const questRoutes = [questRoute];

export { questRoutes };
49 changes: 49 additions & 0 deletions api/tests/quest/acceptance/application/quest-route_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import {
createServer,
databaseBuilder,
expect,
generateValidRequestAuthorizationHeader,
} from '../../../test-helper.js';

describe('Quest | Acceptance | Application | Quest Route ', function () {
let server;

beforeEach(async function () {
server = await createServer();
});

describe('GET /api/campaign-participations/{campaignParticipationId}/quest-results', function () {
it('should return quest results for given campaignPaticipationId and userId', async function () {
// given
const organizationId = databaseBuilder.factory.buildOrganization({ type: 'SCO' }).id;
const { id: organizationLearnerId, userId } = databaseBuilder.factory.buildOrganizationLearner({
organizationId,
});
const { id: campaignParticipationId } = databaseBuilder.factory.buildCampaignParticipation({
organizationLearnerId,
userId,
});
const rewardId = databaseBuilder.factory.buildAttestation().id;
databaseBuilder.factory.buildQuest({
rewardType: 'attestations',
rewardId,
eligibilityRequirements: [],
successRequirements: [],
}).id;

await databaseBuilder.commit();
const options = {
method: 'GET',
headers: { authorization: generateValidRequestAuthorizationHeader(userId) },
url: `/api/campaign-participations/${campaignParticipationId}/quest-results`,
};

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

// then
expect(response.statusCode).to.equal(200);
expect(response.result.data).to.have.lengthOf(1);
});
});
});
25 changes: 25 additions & 0 deletions api/tests/quest/unit/application/index_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import * as moduleUnderTest from '../../../../src/quest/application/index.js';
import { questController } from '../../../../src/quest/application/quest-controller.js';
import { securityPreHandlers } from '../../../../src/shared/application/security-pre-handlers.js';
import { expect, HttpTestServer, sinon } from '../../../test-helper.js';

describe('Quest | Unit | Router | quest-router', function () {
describe('GET /api/campaign-participations/{campaignParticipationId}/quest-results', function () {
it('should call checkCampaignParticipationBelongsToUser prehandler', async function () {
// given
sinon.stub(securityPreHandlers, 'checkCampaignParticipationBelongsToUser').returns(() => true);
sinon.stub(questController, 'getQuestResults').callsFake((request, h) => h.response());

const httpTestServer = new HttpTestServer();
await httpTestServer.register(moduleUnderTest);

const campaignParticipationId = 123;

// when
await httpTestServer.request('GET', `/api/campaign-participations/${campaignParticipationId}/quest-results`);

// then
expect(securityPreHandlers.checkCampaignParticipationBelongsToUser).to.have.been.called;
});
});
});

0 comments on commit 7cb510d

Please sign in to comment.