Skip to content

Commit eb8f5da

Browse files
[FEATURE] Implémenter la double écriture des CGU dans l'API acceptLegalDocumenByUserId (PIX-22581). #16386
2 parents 3a3d119 + 0212c06 commit eb8f5da

16 files changed

Lines changed: 150 additions & 90 deletions

File tree

api/src/identity-access-management/application/user/user.controller.js

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,21 @@ const acceptPixCertifTermsOfService = async function (request, h) {
2323
/**
2424
* @param request
2525
* @param h
26-
* @param {{
27-
* userSerializer: UserSerializer
28-
* }} dependencies
2926
* @return {Promise<*>}
3027
*/
31-
const acceptPixLastTermsOfService = async function (request, h, dependencies = { userSerializer }) {
28+
const acceptPixAppTermsOfService = async function (request, h) {
3229
const authenticatedUserId = request.auth.credentials.userId;
3330

34-
const updatedUser = await usecases.acceptPixLastTermsOfService({
31+
await usecases.acceptPixAppTermsOfService({
3532
userId: authenticatedUserId,
3633
});
3734

38-
return dependencies.userSerializer.serialize(updatedUser);
35+
return h.response().code(204);
3936
};
4037

4138
/**
4239
* @param request
4340
* @param h
44-
* @param {{
45-
* userSerializer: UserSerializer
46-
* }} dependencies
4741
* @return {Promise<*>}
4842
*/
4943
const acceptPixOrgaTermsOfService = async function (request, h) {
@@ -289,7 +283,7 @@ const upgradeToRealUser = async function (request, h, dependencies = { userSeria
289283

290284
export const userController = {
291285
acceptPixCertifTermsOfService,
292-
acceptPixLastTermsOfService,
286+
acceptPixAppTermsOfService,
293287
acceptPixOrgaTermsOfService,
294288
changeUserLocale,
295289
getCertificationPointOfContact,

api/src/identity-access-management/application/user/user.route.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ export const userRoutes = [
258258
id: identifiersType.userId,
259259
}),
260260
},
261-
handler: (request, h) => userController.acceptPixLastTermsOfService(request, h),
261+
handler: (request, h) => userController.acceptPixAppTermsOfService(request, h),
262262
notes: [
263263
'- **Cette route est restreinte aux utilisateurs authentifiés**\n' +
264264
"- Sauvegarde le fait que l'utilisateur a accepté les dernières Conditions Générales d'Utilisation de Pix App\n" +
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* @param {{
3+
* userId: string,
4+
* userRepository: UserRepository
5+
* }} params
6+
* @return {Promise<void>}
7+
*/
8+
export const acceptPixAppTermsOfService = async function ({ userId, legalDocumentApiRepository }) {
9+
await legalDocumentApiRepository.acceptPixAppTos({ userId });
10+
};

api/src/identity-access-management/domain/usecases/accept-pix-last-terms-of-service.usecase.js

Lines changed: 0 additions & 10 deletions
This file was deleted.

api/src/identity-access-management/domain/usecases/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ const utils = {
110110

111111
const dependencies = Object.assign({ config, codeUtils }, repositories, services, validators, utils);
112112

113+
import { acceptPixAppTermsOfService } from './accept-pix-app-terms-of-service.usecase.js';
113114
import { acceptPixCertifTermsOfService } from './accept-pix-certif-terms-of-service.usecase.js';
114-
import { acceptPixLastTermsOfService } from './accept-pix-last-terms-of-service.usecase.js';
115115
import { acceptPixOrgaTermsOfService } from './accept-pix-orga-terms-of-service.usecase.js';
116116
import { addOidcProvider } from './add-oidc-provider.js';
117117
import { addPixAuthenticationMethod } from './add-pix-authentication-method.usecase.js';
@@ -173,7 +173,7 @@ import { validateUserAccountEmail } from './validate-user-account-email.usecase.
173173

174174
const usecasesWithoutInjectedDependencies = {
175175
acceptPixCertifTermsOfService,
176-
acceptPixLastTermsOfService,
176+
acceptPixAppTermsOfService,
177177
acceptPixOrgaTermsOfService,
178178
addOidcProvider,
179179
addPixAuthenticationMethod,

api/src/identity-access-management/infrastructure/repositories/legal-document-api.repository.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ const acceptPixOrgaTos = async ({ userId, dependencies = { legalDocumentApi } })
44
return dependencies.legalDocumentApi.acceptLegalDocumentByUserId({ userId, service: 'pix-orga', type: 'TOS' });
55
};
66

7-
const legalDocumentApiRepository = { acceptPixOrgaTos };
7+
const acceptPixAppTos = async ({ userId, dependencies = { legalDocumentApi } }) => {
8+
return dependencies.legalDocumentApi.acceptLegalDocumentByUserId({ userId, service: 'pix-app', type: 'TOS' });
9+
};
10+
11+
const legalDocumentApiRepository = { acceptPixAppTos, acceptPixOrgaTos };
812

913
export { legalDocumentApiRepository };

api/src/identity-access-management/infrastructure/repositories/user.repository.js

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -342,16 +342,6 @@ const updateHasSeenChallengeTooltip = async function ({ userId, challengeType })
342342
return new User(user);
343343
};
344344

345-
const acceptPixLastTermsOfService = async function (id) {
346-
const knexConn = DomainTransaction.getConnection();
347-
const [user] = await knexConn('users')
348-
.where({ id })
349-
.update({ lastTermsOfServiceValidatedAt: new Date(), mustValidateTermsOfService: false, updatedAt: new Date() })
350-
.returning('*');
351-
352-
return new User(user);
353-
};
354-
355345
const updatePixCertifTermsOfServiceAcceptedToTrue = async function (id) {
356346
const knexConn = DomainTransaction.getConnection();
357347
const now = new Date();
@@ -443,7 +433,6 @@ const updateLastDataProtectionPolicySeenAt = async function ({ userId }) {
443433

444434
/**
445435
* @typedef {Object} UserRepository
446-
* @property {function} acceptPixLastTermsOfService
447436
* @property {function} checkIfEmailIsAvailable
448437
* @property {function} findAnotherUserByEmail
449438
* @property {function} findAnotherUserByUsername
@@ -476,7 +465,6 @@ const updateLastDataProtectionPolicySeenAt = async function ({ userId }) {
476465
*/
477466

478467
export {
479-
acceptPixLastTermsOfService,
480468
checkIfEmailIsAvailable,
481469
findAnotherUserByEmail,
482470
findAnotherUserByUsername,

api/src/legal-documents/domain/usecases/accept-legal-document-by-user-id.usecase.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ import { withTransaction } from '../../../shared/domain/DomainTransaction.js';
22
import { LegalDocumentService } from '../models/LegalDocumentService.js';
33
import { LegalDocumentType } from '../models/LegalDocumentType.js';
44

5+
const { TOS } = LegalDocumentType.VALUES;
6+
const { PIX_APP } = LegalDocumentService.VALUES;
7+
58
/**
69
* Accepts a legal document by user ID.
710
*
@@ -12,10 +15,15 @@ import { LegalDocumentType } from '../models/LegalDocumentType.js';
1215
* @returns {Promise<void>} A promise that resolves when the operation is complete.
1316
*/
1417
const acceptLegalDocumentByUserId = withTransaction(
15-
async ({ userId, service, type, legalDocumentRepository, userAcceptanceRepository, logger }) => {
18+
async ({ userId, service, type, legalDocumentRepository, userAcceptanceRepository, userRepository, logger }) => {
1619
LegalDocumentType.assert(type);
1720
LegalDocumentService.assert(service);
1821

22+
// legacy document acceptance
23+
if (type === TOS && service === PIX_APP) {
24+
await userRepository.acceptLegacyPixAppTermsOfService(userId);
25+
}
26+
1927
const legalDocument = await legalDocumentRepository.findLastVersionByTypeAndService({ service, type });
2028
if (!legalDocument) {
2129
logger.warn(`No legal document found for service: ${service} and type: ${type}`);

api/src/legal-documents/infrastructure/repositories/user.repository.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,14 @@ const getPixAppLegacyCguByUserId = async (userId) => {
1111
return user;
1212
};
1313

14-
export { getPixAppLegacyCguByUserId };
14+
const acceptLegacyPixAppTermsOfService = async function (id) {
15+
const knexConn = DomainTransaction.getConnection();
16+
await knexConn('users').where({ id }).update({
17+
lastTermsOfServiceValidatedAt: new Date(),
18+
mustValidateTermsOfService: false,
19+
updatedAt: new Date(),
20+
cgu: true,
21+
});
22+
};
23+
24+
export { acceptLegacyPixAppTermsOfService, getPixAppLegacyCguByUserId };

api/tests/identity-access-management/acceptance/application/user/user.route.test.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import * as authenticationMethodRepository from '../../../../../src/identity-acc
77
import { emailValidationDemandRepository } from '../../../../../src/identity-access-management/infrastructure/repositories/email-validation-demand.repository.js';
88
import * as userRepository from '../../../../../src/identity-access-management/infrastructure/repositories/user.repository.js';
99
import { userEmailRepository } from '../../../../../src/identity-access-management/infrastructure/repositories/user-email.repository.js';
10+
import { LegalDocumentService } from '../../../../../src/legal-documents/domain/models/LegalDocumentService.js';
11+
import { LegalDocumentType } from '../../../../../src/legal-documents/domain/models/LegalDocumentType.js';
1012
import { constants } from '../../../../../src/shared/domain/constants.js';
1113
import { Assessment } from '../../../../../src/shared/domain/models/Assessment.js';
1214
import { featureToggles } from '../../../../../src/shared/infrastructure/feature-toggles/index.js';
@@ -19,6 +21,8 @@ import {
1921
} from '../../../../tooling/test-utils/http-server.js';
2022

2123
const { pick } = lodash;
24+
const { PIX_APP } = LegalDocumentService.VALUES;
25+
const { TOS } = LegalDocumentType.VALUES;
2226

2327
describe('Acceptance | Identity Access Management | Application | Route | User', function () {
2428
let server;
@@ -492,14 +496,16 @@ describe('Acceptance | Identity Access Management | Application | Route | User',
492496
});
493497

494498
describe('Success case', function () {
495-
it('returns the user with pixTermsOfServiceAccepted', async function () {
499+
it('replies with 204 status code', async function () {
500+
// given
501+
databaseBuilder.factory.buildLegalDocumentVersion({ service: PIX_APP, type: TOS });
502+
databaseBuilder.commit();
503+
496504
// when
497505
const response = await server.inject(options);
498506

499507
// then
500-
expect(response.statusCode).to.equal(200);
501-
expect(response.result.data.attributes['must-validate-terms-of-service']).to.be.false;
502-
expect(response.result.data.attributes['last-terms-of-service-validated-at']).to.exist;
508+
expect(response.statusCode).to.equal(204);
503509
});
504510
});
505511
});

0 commit comments

Comments
 (0)