diff --git a/src/app/api/admin/UsersController.ts b/src/app/api/admin/UsersController.ts index 365e05f8..2d6d3465 100644 --- a/src/app/api/admin/UsersController.ts +++ b/src/app/api/admin/UsersController.ts @@ -1,5 +1,5 @@ import { Response, Request } from "express"; -import { Controller, Get } from "@ControllerPattern/index"; +import { Controller, Get, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import UsersService from "@Services/admin/UsersService/UsersService"; import { Service } from "typedi"; @@ -8,6 +8,7 @@ import { Prisma } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import userHandler from "@App/middlewares/OfficeMembershipHandlers/UserHandler"; +import { validateOrReject } from "class-validator"; @Controller() @Service() @@ -61,6 +62,47 @@ export default class UsersController extends ApiController { } } + /** + * @description Modify a specific user by uid + */ + @Put("/api/v1/admin/users/:uid", [authHandler, ruleHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const userFound = await this.usersService.getByUid(uid); + + if (!userFound) { + this.httpNotFoundRequest(response, "user not found"); + return; + } + + //init IUser resource with request body values + const userEntity = User.hydrate(req.body); + + //validate user + await validateOrReject(userEntity, { groups: ["updateUser"] }); + + //call service to get prisma entity + const userEntityUpdated = await this.usersService.update(uid, userEntity); + + //Hydrate ressource with prisma entity + const user = User.hydrate(userEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, user); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + /** * @description Get a specific user by uid */ diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index 695725dd..a96b3f5a 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -106,7 +106,7 @@ export default class UsersController extends ApiController { const userEntity = User.hydrate(req.body); //validate user - await validateOrReject(userEntity, { groups: ["update"] }); + await validateOrReject(userEntity, { groups: ["updateUser"] }); //call service to get prisma entity const userEntityUpdated = await this.usersService.update(uid, userEntity); diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index 99d36eb1..b472a8ec 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -94,30 +94,11 @@ export default class UsersRepository extends BaseRepository { }, data: { idNot: user.idNot, - office_membership: { - connectOrCreate: { - where: { - idNot: user.office_membership!.idNot, - }, - create: { - idNot: user.office_membership!.idNot, - name: user.office_membership!.name, - crpcen: user.office_membership!.crpcen, - address: { - create: { - address: user.office_membership!.address!.address, - zip_code: user.office_membership!.address!.zip_code, - city: user.office_membership!.address!.city, - }, - }, - }, - }, - }, contact: { update: { - first_name: user.contact!.first_name, - last_name: user.contact!.last_name, - email: user.contact!.email, + first_name: user.contact?.first_name, + last_name: user.contact?.last_name, + email: user.contact?.email, phone_number: user.contact?.phone_number, cell_phone_number: user.contact?.cell_phone_number, civility: ECivility[user.contact?.civility as keyof typeof ECivility], @@ -125,6 +106,15 @@ export default class UsersRepository extends BaseRepository { }, }, }; + + if(user.office_membership) { + updateArgs.data.office_membership = { + connect: { + idNot: user.office_membership?.idNot, + }, + }; + } + if (user.contact?.address) { updateArgs.data.contact!.update!.address!.update = { address: user.contact?.address?.address, @@ -132,13 +122,53 @@ export default class UsersRepository extends BaseRepository { city: user.contact?.address?.city, }; } - if (user.office_role) { + + if(user.office_role) { updateArgs.data.office_role = { connect: { uid: user.office_role.uid, }, }; } + + if(user.role) { + updateArgs.data.role = { + connect: { + uid: user.role.uid, + }, + }; + } + + return this.model.update({ ...updateArgs, include: { contact: true, office_membership: { include: { address: true } } } }); + } + + /** + * @description : Update role from a user + */ + public async updateRole(uid: string, user: User): Promise { + const updateArgs: Prisma.UsersUpdateArgs = { + where: { + uid: uid, + }, + data: {} + }; + + if(user.office_role) { + updateArgs.data.office_role = { + connect: { + uid: user.office_role.uid, + }, + }; + } + + if(user.role) { + updateArgs.data.role = { + connect: { + uid: user.role.uid, + }, + }; + } + return this.model.update({ ...updateArgs, include: { contact: true, office_membership: { include: { address: true } } } }); } diff --git a/src/services/admin/UsersService/UsersService.ts b/src/services/admin/UsersService/UsersService.ts index d2216c3b..f23c09d7 100644 --- a/src/services/admin/UsersService/UsersService.ts +++ b/src/services/admin/UsersService/UsersService.ts @@ -32,7 +32,7 @@ export default class UsersService extends BaseService { * @throws {Error} If user modification failed */ public update(uid: string, userEntity: User): Promise { - return this.userRepository.update(uid, userEntity); + return this.userRepository.updateRole(uid, userEntity); } /**