Skip to content

Commit 3440bef

Browse files
committed
🚧 api: uncancel route
1 parent 055f8f5 commit 3440bef

File tree

11 files changed

+91
-24
lines changed

11 files changed

+91
-24
lines changed

api/src/certification/session-management/application/cancellation-controller.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ const cancel = async function (request, h) {
99
};
1010

1111
const uncancel = async function (request, h) {
12+
const juryId = request.auth.credentials.userId;
1213
const certificationCourseId = request.params.certificationCourseId;
13-
await usecases.uncancelCertificationCourse({ certificationCourseId });
14+
await usecases.uncancel({ certificationCourseId, juryId });
15+
1416
return h.response().code(204);
1517
};
1618

api/src/certification/session-management/domain/usecases/cancel.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,5 @@ export const cancel = async function ({
3535
juryId,
3636
});
3737

38-
return certificationRescoringRepository.execute({ certificationCancelledEvent });
38+
return certificationRescoringRepository.execute({ event: certificationCancelledEvent });
3939
};

api/src/certification/session-management/domain/usecases/uncancel-certification-course.js

-7
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* @typedef {import('./index.js'.CertificationCourseRepository} CertificationCourseRepository
3+
* @typedef {import('./index.js'.CertificationRescoringRepository} CertificationRescoringRepository
4+
*/
5+
6+
import CertificationUncancelled from '../../../../shared/domain/events/CertificationUncancelled.js';
7+
8+
/**
9+
* @param {Object} params
10+
* @param {number} params.certificationCourseId
11+
* @param {number} params.juryId
12+
* @param {CertificationCourseRepository} params.certificationCourseRepository
13+
* @param {CertificationRescoringRepository} params.certificationRescoringRepository
14+
*/
15+
const uncancel = async function ({
16+
certificationCourseId,
17+
juryId,
18+
certificationCourseRepository,
19+
certificationRescoringRepository,
20+
}) {
21+
const certificationCourse = await certificationCourseRepository.get({ id: certificationCourseId });
22+
certificationCourse.uncancel();
23+
await certificationCourseRepository.update({ certificationCourse });
24+
25+
const certificationUncancelledEvent = new CertificationUncancelled({
26+
certificationCourseId: certificationCourse.getId(),
27+
juryId,
28+
});
29+
30+
return certificationRescoringRepository.execute({ event: certificationUncancelledEvent });
31+
};
32+
33+
export { uncancel };
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
/**
2-
* @typedef {import('../../../../../src/shared/domain/events/CertificationCancelled.js'} CertificationCancelled
32
* @typedef {import('./index.js'.LibServices} LibServices
43
*/
54

65
/**
76
* @param {Object} params
8-
* @param {CertificationCancelled} params.certificationCancelledEvent
7+
* @param {??} params.event
98
* @param {LibServices} params.libServices
109
*/
11-
export const execute = async ({ certificationCancelledEvent, libServices }) => {
10+
export const execute = async ({ event, libServices }) => {
1211
return libServices.handleCertificationRescoring({
13-
event: certificationCancelledEvent,
12+
event,
1413
});
1514
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { assertNotNullOrUndefined } from '../models/asserts.js';
2+
3+
export default class CertificationUncancelled {
4+
/**
5+
* @param {Object} params
6+
* @param {number} params.certificationCourseId - certification course that will be rescored
7+
* @param {number} params.juryId - Id of the jury member who uncancelled the certification
8+
*/
9+
constructor({ certificationCourseId, juryId }) {
10+
assertNotNullOrUndefined(certificationCourseId);
11+
this.certificationCourseId = certificationCourseId;
12+
assertNotNullOrUndefined(juryId);
13+
this.juryId = juryId;
14+
}
15+
}

api/src/shared/domain/events/handle-certification-rescoring.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { CertificationResult } from '../models/index.js';
1515
import CertificationCancelled from './CertificationCancelled.js';
1616
import { CertificationCourseUnrejected } from './CertificationCourseUnrejected.js';
1717
import { CertificationRescoringCompleted } from './CertificationRescoringCompleted.js';
18+
import CertificationUncancelled from './CertificationUncancelled.js';
1819
import { checkEventTypes } from './check-event-types.js';
1920

2021
const eventTypes = [
@@ -25,6 +26,7 @@ const eventTypes = [
2526
CertificationCourseUnrejected,
2627
CertificationCancelled,
2728
CertificationRescoredByScript,
29+
CertificationUncancelled,
2830
];
2931

3032
/**
@@ -190,7 +192,11 @@ function _getEmitterFromEvent(event) {
190192
emitter = CertificationResult.emitters.PIX_ALGO_NEUTRALIZATION;
191193
}
192194

193-
if (event instanceof CertificationJuryDone || event instanceof CertificationRescoredByScript) {
195+
if (
196+
event instanceof CertificationJuryDone ||
197+
event instanceof CertificationRescoredByScript ||
198+
event instanceof CertificationUncancelled
199+
) {
194200
emitter = CertificationResult.emitters.PIX_ALGO_AUTO_JURY;
195201
}
196202

api/tests/certification/session-management/integration/infrastructure/repositories/certification-rescoring-repository_test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ describe('Integration | Repository | certification-rescoring-repository', functi
1111

1212
// when
1313
const error = await catchErr(sessionRepositories.certificationRescoringRepository.execute)({
14-
certificationCancelledEvent,
14+
event: certificationCancelledEvent,
1515
});
1616

1717
// then

api/tests/certification/session-management/unit/application/cancellation-controller_test.js

+10-5
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,27 @@ describe('Certification | Session-management | Unit | Application | Controller |
3030
});
3131
});
3232

33-
describe('#uncancelCertificationCourse', function () {
34-
it('should call uncancel-certification-course usecase', async function () {
33+
describe('#uncancel', function () {
34+
it('should call uncancel usecase', async function () {
3535
// given
36-
sinon.stub(usecases, 'uncancelCertificationCourse');
36+
sinon.stub(usecases, 'uncancel');
3737
const request = {
38+
auth: {
39+
credentials: {
40+
userId: 345,
41+
},
42+
},
3843
params: {
3944
certificationCourseId: 123,
4045
},
4146
};
42-
usecases.uncancelCertificationCourse.resolves();
47+
usecases.uncancel.resolves();
4348

4449
// when
4550
await cancellationController.uncancel(request, hFake);
4651

4752
// then
48-
expect(usecases.uncancelCertificationCourse).to.have.been.calledWithExactly({ certificationCourseId: 123 });
53+
expect(usecases.uncancel).to.have.been.calledWithExactly({ certificationCourseId: 123, juryId: 345 });
4954
});
5055
});
5156
});

api/tests/certification/session-management/unit/domain/usecases/cancel_test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ describe('Certification | Session-management | Unit | Domain | UseCases | cancel
4141
expect(certificationCourse.cancel).to.have.been.calledOnce;
4242
expect(certificationCourseRepository.update).to.have.been.calledWithExactly({ certificationCourse });
4343
expect(certificationRescoringRepository.execute).to.have.been.calledWithExactly({
44-
certificationCancelledEvent: new CertificationCancelled({
44+
event: new CertificationCancelled({
4545
certificationCourseId: certificationCourse.getId(),
4646
juryId,
4747
}),
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,40 @@
1-
import { uncancelCertificationCourse } from '../../../../../../src/certification/session-management/domain/usecases/uncancel-certification-course.js';
1+
import { uncancel } from '../../../../../../src/certification/session-management/domain/usecases/uncancel.js';
2+
import CertificationUncancelled from '../../../../../../src/shared/domain/events/CertificationUncancelled.js';
23
import { domainBuilder, expect, sinon } from '../../../../../test-helper.js';
34

4-
describe('Certification | Session-management | Unit | Domain | UseCases | uncancel-certification-course', function () {
5+
describe('Certification | Session-management | Unit | Domain | UseCases | uncancel', function () {
56
it('should uncancel the certification course', async function () {
67
// given
8+
const juryId = 123;
79
const certificationCourse = domainBuilder.buildCertificationCourse({ id: 123 });
810
sinon.spy(certificationCourse, 'uncancel');
911
const certificationCourseRepository = {
1012
update: sinon.stub(),
1113
get: sinon.stub(),
1214
};
15+
const certificationRescoringRepository = {
16+
execute: sinon.stub(),
17+
};
1318
certificationCourseRepository.get.withArgs({ id: 123 }).resolves(certificationCourse);
1419
certificationCourseRepository.update.resolves();
20+
certificationRescoringRepository.execute.resolves();
1521

1622
// when
17-
await uncancelCertificationCourse({
23+
await uncancel({
1824
certificationCourseId: 123,
25+
juryId,
1926
certificationCourseRepository,
27+
certificationRescoringRepository,
2028
});
2129

2230
// then
2331
expect(certificationCourse.uncancel).to.have.been.calledOnce;
2432
expect(certificationCourseRepository.update).to.have.been.calledWithExactly({ certificationCourse });
33+
expect(certificationRescoringRepository.execute).to.have.been.calledWithExactly({
34+
event: new CertificationUncancelled({
35+
certificationCourseId: certificationCourse.getId(),
36+
juryId,
37+
}),
38+
});
2539
});
2640
});

0 commit comments

Comments
 (0)