Skip to content

Commit

Permalink
refactor(api): move and rename get-user-details-for-admin controller
Browse files Browse the repository at this point in the history
  • Loading branch information
er-lim authored Nov 6, 2024
1 parent 2245114 commit 19d2e78
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 41 deletions.
10 changes: 2 additions & 8 deletions api/lib/application/users/user-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { usecases as devcompUsecases } from '../../../src/devcomp/domain/usecase
import * as trainingSerializer from '../../../src/devcomp/infrastructure/serializers/jsonapi/training-serializer.js';
import { evaluationUsecases } from '../../../src/evaluation/domain/usecases/index.js';
import * as scorecardSerializer from '../../../src/evaluation/infrastructure/serializers/jsonapi/scorecard-serializer.js';
import { usecases as identityAccessManagementUsecases } from '../../../src/identity-access-management/domain/usecases/index.js';
import * as userDetailsForAdminSerializer from '../../../src/identity-access-management/infrastructure/serializers/jsonapi/user-details-for-admin.serializer.js';
import * as campaignParticipationSerializer from '../../../src/prescription/campaign-participation/infrastructure/serializers/jsonapi/campaign-participation-serializer.js';
import * as userSerializer from '../../../src/shared/infrastructure/serializers/jsonapi/user-serializer.js';
Expand All @@ -14,12 +15,6 @@ import * as participantResultSerializer from '../../infrastructure/serializers/j
import * as userAnonymizedDetailsForAdminSerializer from '../../infrastructure/serializers/jsonapi/user-anonymized-details-for-admin-serializer.js';
import * as userOrganizationForAdminSerializer from '../../infrastructure/serializers/jsonapi/user-organization-for-admin-serializer.js';

const getUserDetailsForAdmin = async function (request, h, dependencies = { userDetailsForAdminSerializer }) {
const userId = request.params.id;
const userDetailsForAdmin = await usecases.getUserDetailsForAdmin({ userId });
return dependencies.userDetailsForAdminSerializer.serialize(userDetailsForAdmin);
};

const rememberUserHasSeenAssessmentInstructions = async function (request, h, dependencies = { userSerializer }) {
const authenticatedUserId = request.auth.credentials.userId;

Expand Down Expand Up @@ -143,7 +138,7 @@ const anonymizeUser = async function (request, h, dependencies = { userAnonymize
});
});

const anonymizedUser = await usecases.getUserDetailsForAdmin({ userId: userToAnonymizeId });
const anonymizedUser = await identityAccessManagementUsecases.getUserDetailsForAdmin({ userId: userToAnonymizeId });

return h.response(dependencies.userAnonymizedDetailsForAdminSerializer.serialize(anonymizedUser)).code(200);
};
Expand Down Expand Up @@ -219,7 +214,6 @@ const userController = {
getCampaignParticipations,
getUserCampaignAssessmentResult,
getUserCampaignParticipationToCampaign,
getUserDetailsForAdmin,
reassignAuthenticationMethods,
rememberUserHasSeenAssessmentInstructions,
rememberUserHasSeenChallengeTooltip,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { usecases as libUsecases } from '../../../../lib/domain/usecases/index.js';
import { usecases } from '../../domain/usecases/index.js';
import * as userDetailsForAdminSerializer from '../../infrastructure/serializers/jsonapi/user-details-for-admin.serializer.js';
import * as userForAdminSerializer from '../../infrastructure/serializers/jsonapi/user-for-admin.serializer.js';
Expand Down Expand Up @@ -48,12 +49,32 @@ const updateUserDetailsByAdmin = async function (request, h, dependencies = { us
return dependencies.userDetailsForAdminSerializer.serializeForUpdate(updatedUser);
};

/**
*
* @param request
* @param h
* @param dependencies
* @param {UserDetailsForAdminSerializer} dependencies.userDetailsForAdminSerializer
* @returns {Promise<*>}
*/
const getUserDetails = async function (request, h, dependencies = { userDetailsForAdminSerializer }) {
const userId = request.params.id;
const userDetailsForAdmin = await libUsecases.getUserDetailsForAdmin({ userId });
return dependencies.userDetailsForAdminSerializer.serialize(userDetailsForAdmin);
};

/**
* @typedef {object} UserAdminController
* @property {function} findPaginatedFilteredUsers
* @property {function} getUserDetails
* @property {function} unblockUserAccount
* @property {function} updateUserDetailsByAdmin
*/
const userAdminController = { findPaginatedFilteredUsers, unblockUserAccount, updateUserDetailsByAdmin };
const userAdminController = {
findPaginatedFilteredUsers,
getUserDetails,
unblockUserAccount,
updateUserDetailsByAdmin,
};

export { userAdminController };
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import Joi from 'joi';

import { userController } from '../../../../lib/application/users/user-controller.js';
import { BadRequestError, sendJsonApiError } from '../../../shared/application/http-errors.js';
import { securityPreHandlers } from '../../../shared/application/security-pre-handlers.js';
import { SUPPORTED_LOCALES } from '../../../shared/domain/constants.js';
Expand Down Expand Up @@ -145,7 +144,7 @@ export const userAdminRoutes = [
])(request, h),
},
],
handler: (request, h) => userController.getUserDetailsForAdmin(request, h),
handler: (request, h) => userAdminController.getUserDetails(request, h),
notes: [
'- **Cette route est restreinte aux utilisateurs administrateurs**\n' +
"- Elle permet de récupérer le détail d'un utilisateur dans un contexte d'administration",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { userController } from '../../../../../lib/application/users/user-controller.js';
import { identityAccessManagementRoutes } from '../../../../../src/identity-access-management/application/routes.js';
import { userAdminController } from '../../../../../src/identity-access-management/application/user/user.admin.controller.js';
import { securityPreHandlers } from '../../../../../src/shared/application/security-pre-handlers.js';
Expand Down Expand Up @@ -147,15 +146,15 @@ describe('Integration | Identity Access Management | Application | Route | Admin
it('returns an HTTP status code 200', async function () {
// given
sinon.stub(securityPreHandlers, 'hasAtLeastOneAccessOf').returns(() => true);
sinon.stub(userController, 'getUserDetailsForAdmin').resolves('ok');
sinon.stub(userAdminController, 'getUserDetails').resolves('ok');

// when
const response = await httpTestServer.request('GET', '/api/admin/users/8');

// then
expect(response.statusCode).to.equal(200);
sinon.assert.calledOnce(securityPreHandlers.hasAtLeastOneAccessOf);
sinon.assert.calledOnce(userController.getUserDetailsForAdmin);
sinon.assert.calledOnce(userAdminController.getUserDetails);
});

it('returns an HTTP status code 403', async function () {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { usecases as libUsecases } from '../../../../../lib/domain/usecases/index.js';
import { userAdminController } from '../../../../../src/identity-access-management/application/user/user.admin.controller.js';
import { User } from '../../../../../src/identity-access-management/domain/models/User.js';
import { usecases } from '../../../../../src/identity-access-management/domain/usecases/index.js';
Expand Down Expand Up @@ -159,4 +160,29 @@ describe('Unit | Identity Access Management | Application | Controller | Admin |
expect(response).to.be.equal(newEmail);
});
});

describe('#getUserDetails', function () {
let request;
let dependencies;

beforeEach(function () {
request = { params: { id: 123 } };

sinon.stub(libUsecases, 'getUserDetailsForAdmin');
const userDetailsForAdminSerializer = { serialize: sinon.stub() };
dependencies = { userDetailsForAdminSerializer };
});

it('gets the specified user', async function () {
// given
libUsecases.getUserDetailsForAdmin.withArgs({ userId: 123 }).resolves('userDetail');
dependencies.userDetailsForAdminSerializer.serialize.withArgs('userDetail').returns('ok');

// when
const response = await userAdminController.getUserDetails(request, hFake, dependencies);

// then
expect(response).to.be.equal('ok');
});
});
});
30 changes: 3 additions & 27 deletions api/tests/unit/application/users/user-controller_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { DomainTransaction } from '../../../../lib/infrastructure/DomainTransact
import { usecases as devcompUsecases } from '../../../../src/devcomp/domain/usecases/index.js';
import { evaluationUsecases } from '../../../../src/evaluation/domain/usecases/index.js';
import { NON_OIDC_IDENTITY_PROVIDERS } from '../../../../src/identity-access-management/domain/constants/identity-providers.js';
import { usecases as identityAccessManagementUsecases } from '../../../../src/identity-access-management/domain/usecases/index.js';
import { UserOrganizationForAdmin } from '../../../../src/shared/domain/read-models/UserOrganizationForAdmin.js';
import * as requestResponseUtils from '../../../../src/shared/infrastructure/utils/request-response-utils.js';
import { domainBuilder, expect, hFake, sinon } from '../../../test-helper.js';
Expand Down Expand Up @@ -92,31 +93,6 @@ describe('Unit | Controller | user-controller', function () {
});
});

describe('#getUserDetailsForAdmin', function () {
let request;
let dependencies;

beforeEach(function () {
request = { params: { id: 123 } };

sinon.stub(usecases, 'getUserDetailsForAdmin');
const userDetailsForAdminSerializer = { serialize: sinon.stub() };
dependencies = { userDetailsForAdminSerializer };
});

it('should get the specified user for admin context', async function () {
// given
usecases.getUserDetailsForAdmin.withArgs({ userId: 123 }).resolves('userDetail');
dependencies.userDetailsForAdminSerializer.serialize.withArgs('userDetail').returns('ok');

// when
const response = await userController.getUserDetailsForAdmin(request, hFake, dependencies);

// then
expect(response).to.be.equal('ok');
});
});

describe('#findPaginatedUserRecommendedTrainings', function () {
it('should call the appropriate use-case', async function () {
// given
Expand Down Expand Up @@ -363,7 +339,7 @@ describe('Unit | Controller | user-controller', function () {
knexTransaction: Symbol('transaction'),
};
sinon.stub(usecases, 'anonymizeUser');
sinon.stub(usecases, 'getUserDetailsForAdmin').resolves(userDetailsForAdmin);
sinon.stub(identityAccessManagementUsecases, 'getUserDetailsForAdmin').resolves(userDetailsForAdmin);
sinon.stub(DomainTransaction, 'execute').callsFake((callback) => {
return callback(domainTransaction);
});
Expand All @@ -383,7 +359,7 @@ describe('Unit | Controller | user-controller', function () {
// then
expect(DomainTransaction.execute).to.have.been.called;
expect(usecases.anonymizeUser).to.have.been.calledWithExactly({ userId, updatedByUserId, domainTransaction });
expect(usecases.getUserDetailsForAdmin).to.have.been.calledWithExactly({ userId });
expect(identityAccessManagementUsecases.getUserDetailsForAdmin).to.have.been.calledWithExactly({ userId });
expect(userAnonymizedDetailsForAdminSerializer.serialize).to.have.been.calledWithExactly(userDetailsForAdmin);
expect(response.statusCode).to.equal(200);
expect(response.source).to.deep.equal(anonymizedUserSerialized);
Expand Down

0 comments on commit 19d2e78

Please sign in to comment.