From 0c9867d70616615c8f3c72bbec37a4441e4868ef Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 9 Feb 2021 18:18:00 +0100 Subject: [PATCH] Implemented /groups/permissions endpoint ref #143 --- src/controllers/UserGroupController.ts | 13 ++++++ .../responses/ResponseUserGroupPermissions.ts | 43 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/models/responses/ResponseUserGroupPermissions.ts diff --git a/src/controllers/UserGroupController.ts b/src/controllers/UserGroupController.ts index 18a901d..e2a849a 100644 --- a/src/controllers/UserGroupController.ts +++ b/src/controllers/UserGroupController.ts @@ -8,6 +8,7 @@ import { UpdateUserGroup } from '../models/actions/update/UpdateUserGroup'; import { UserGroup } from '../models/entities/UserGroup'; import { ResponseEmpty } from '../models/responses/ResponseEmpty'; import { ResponseUserGroup } from '../models/responses/ResponseUserGroup'; +import { ResponseUserGroupPermissions } from '../models/responses/ResponseUserGroupPermissions'; import { PermissionController } from './PermissionController'; @@ -41,6 +42,18 @@ export class UserGroupController { return this.userGroupsRepository.findOne({ id: id }, { relations: ["permissions"] }); } + @Get('/:id/permissions') + @Authorized("USERGROUP:GET") + @ResponseSchema(ResponseUserGroupPermissions) + @ResponseSchema(UserGroupNotFoundError, { statusCode: 404 }) + @OnUndefined(UserGroupNotFoundError) + @OpenAPI({ description: 'Lists all permissions granted to the group as permission response objects.' }) + async getPermissions(@Param('id') id: number) { + let group = await this.userGroupsRepository.findOne({ id: id }, { relations: ['permissions', 'permissions.principal'] }) + if (!group) { throw new UserGroupNotFoundError(); } + return new ResponseUserGroupPermissions(group); + } + @Post() @Authorized("USERGROUP:CREATE") @ResponseSchema(UserGroup) diff --git a/src/models/responses/ResponseUserGroupPermissions.ts b/src/models/responses/ResponseUserGroupPermissions.ts new file mode 100644 index 0000000..16726de --- /dev/null +++ b/src/models/responses/ResponseUserGroupPermissions.ts @@ -0,0 +1,43 @@ +import { + IsArray, + IsOptional +} from "class-validator"; +import { UserGroup } from '../entities/UserGroup'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; +import { ResponsePermission } from './ResponsePermission'; + +/** + * Defines the group permission response (get /api/groups/:id/permissions). +*/ +export class ResponseUserGroupPermissions implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.USERPERMISSIONS; + + /** + * The permissions directly granted to the group. + */ + @IsArray() + @IsOptional() + directlyGranted: ResponsePermission[] = new Array(); + + /** + * Is just here for compatability. + */ + @IsArray() + @IsOptional() + inherited: ResponsePermission[] = new Array(); + + /** + * Creates a ResponseUserPermissions object from a group. + * @param group The group the response shall be build for. + */ + public constructor(group: UserGroup) { + for (let permission of group.permissions) { + this.directlyGranted.push(permission.toResponse()); + } + } +}