From 8ef5f90abda97a73d5c5a7767a144ac3fb5288c1 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Fri, 15 Jan 2021 22:28:18 +0100 Subject: [PATCH] Implemented the /me controller that allows a user to get and update themselves ref #100 --- src/controllers/MeController.ts | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/controllers/MeController.ts diff --git a/src/controllers/MeController.ts b/src/controllers/MeController.ts new file mode 100644 index 0000000..8895073 --- /dev/null +++ b/src/controllers/MeController.ts @@ -0,0 +1,54 @@ +import { Body, CurrentUser, Get, JsonController, OnUndefined, Put } from 'routing-controllers'; +import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; +import { getConnectionManager, Repository } from 'typeorm'; +import { UserIdsNotMatchingError, UsernameContainsIllegalCharacterError, UserNotFoundError } from '../errors/UserErrors'; +import { UpdateUser } from '../models/actions/update/UpdateUser'; +import { User } from '../models/entities/User'; +import { ResponseUser } from '../models/responses/ResponseUser'; + + +@JsonController('/me') +@OpenAPI({ security: [{ "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) +export class MeController { + private userRepository: Repository; + + /** + * Gets the repository of this controller's model/entity. + */ + constructor() { + this.userRepository = getConnectionManager().get().getRepository(User); + } + + @Get('/') + @ResponseSchema(ResponseUser) + @ResponseSchema(UserNotFoundError, { statusCode: 404 }) + @OnUndefined(UserNotFoundError) + @OpenAPI({ description: 'Lists all permissions granted to the user sorted into directly granted and inherited as permission response objects.' }) + async get(@CurrentUser() currentUser: User) { + let user = await this.userRepository.findOne({ id: currentUser.id }, { relations: ['permissions', 'groups', 'groups.permissions', 'permissions.principal', 'groups.permissions.principal'] }) + if (!user) { throw new UserNotFoundError(); } + return new ResponseUser(user); + } + + @Put('/') + @ResponseSchema(ResponseUser) + @ResponseSchema(UserNotFoundError, { statusCode: 404 }) + @ResponseSchema(UserIdsNotMatchingError, { statusCode: 406 }) + @ResponseSchema(UsernameContainsIllegalCharacterError, { statusCode: 406 }) + @OpenAPI({ description: "Update the yourself.
You can't edit your own permissions or group memberships here - Please use the /api/users/:id enpoint instead.
Please remember that ids can't be changed." }) + async put(@CurrentUser() currentUser: User, @Body({ validate: true }) updateUser: UpdateUser) { + let oldUser = await this.userRepository.findOne({ id: currentUser.id }, { relations: ['groups'] }); + updateUser.groups = oldUser.groups.map(g => g.id); + + if (!oldUser) { + throw new UserNotFoundError(); + } + + if (oldUser.id != updateUser.id) { + throw new UserIdsNotMatchingError(); + } + await this.userRepository.save(await updateUser.update(oldUser)); + + return new ResponseUser(await this.userRepository.findOne({ id: currentUser.id }, { relations: ['permissions', 'groups', 'groups.permissions'] })); + } +}