diff --git a/CHANGELOG.md b/CHANGELOG.md index 73cf614..ce402a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,13 +2,28 @@ All notable changes to this project will be documented in this file. Dates are displayed in UTC. +#### [v0.4.5](https://git.odit.services/lfk/backend/compare/v0.4.4...v0.4.5) + +- 🚀Bumped version to v0.4.5 [`cc869f6`](https://git.odit.services/lfk/backend/commit/cc869f69add1f1a175ff94510d52888f81bccb69) +- Implemented /groups/permissions endpoint [`0c9867d`](https://git.odit.services/lfk/backend/commit/0c9867d70616615c8f3c72bbec37a4441e4868ef) +- 🧾New changelog file version [CI SKIP] [skip ci] [`b9aac71`](https://git.odit.services/lfk/backend/commit/b9aac7167681ff0945e538dd177abd6f97771bf2) +- Merge pull request 'usergroups/permissions endpoint feature/143-usergroup_permissions_endpoint' (#144) from feature/143-usergroup_permissions_endpoint into dev [`a30a342`](https://git.odit.services/lfk/backend/commit/a30a342e00ba944f8014044bba28141c0657a17f) +- Now all /usergroups endpoints return ResponseUserGroup [`bdcfce8`](https://git.odit.services/lfk/backend/commit/bdcfce88cbe069f9ba1925fcaac06367a109d2b7) +- The ResponseUserGroup now returns their permisssions as a string array [`416f2a1`](https://git.odit.services/lfk/backend/commit/416f2a1366c570998011d022ebd7f5f44276b2c9) +- The ResponseUserGroup now returns their permisssions as a string array [`5e353db`](https://git.odit.services/lfk/backend/commit/5e353db2061c30b4d10965c47f0dcbecb7f59fc5) +- 🧾New changelog file version [CI SKIP] [skip ci] [`8379c3e`](https://git.odit.services/lfk/backend/commit/8379c3e29c45f0d7c4c84bce1f3abc718158fa84) + #### [v0.4.4](https://git.odit.services/lfk/backend/compare/v0.4.3...v0.4.4) +> 9 February 2021 + +- Merge pull request 'Alpha release 0.4.4' (#142) from dev into main [`c4edcca`](https://git.odit.services/lfk/backend/commit/c4edccace78765dd5caa0f0e79c52f07c8a3568e) - 🧾New changelog file version [CI SKIP] [skip ci] [`ca3d093`](https://git.odit.services/lfk/backend/commit/ca3d093e54bfaaa77c97e96738a74eeb25aee440) - Now loading runner's group's parentgroup with every runner controller request [`701706c`](https://git.odit.services/lfk/backend/commit/701706c0289b357439608b4e2eaa66c617d16e9d) +- 🧾New changelog file version [CI SKIP] [skip ci] [`74de655`](https://git.odit.services/lfk/backend/commit/74de6559d7c5e8c6d257d41dc91396b53bf0c071) +- The group/runners endpoints now also deliver the runner's group's parentGroup [`906a1dc`](https://git.odit.services/lfk/backend/commit/906a1dc9e79ea4eb298a561cf98e6ae42b3ae4ec) - 🚀Bumped version to v0.4.4 [`a6f73c7`](https://git.odit.services/lfk/backend/commit/a6f73c733c8cfc8d84beb7e0bbd5bcd1313df9d0) - Merge pull request 'Expanded runner response feature/140-runner_group_parent' (#141) from feature/140-runner_group_parent into dev [`28cfbaa`](https://git.odit.services/lfk/backend/commit/28cfbaa6624d0bc65e2a9b72ffed17060e828735) -- The group/runners endpoints now also deliver the runner's group's parentGroup [`906a1dc`](https://git.odit.services/lfk/backend/commit/906a1dc9e79ea4eb298a561cf98e6ae42b3ae4ec) - 🧾New changelog file version [CI SKIP] [skip ci] [`09bbc70`](https://git.odit.services/lfk/backend/commit/09bbc70f5fd1f026148be07fe889a6907bc3f75a) - Adjusted test for the new response depth [`90e1ad7`](https://git.odit.services/lfk/backend/commit/90e1ad7db72732d13002c87461c33560b74befa6) - Adjusted test for the new response depth [`5872c63`](https://git.odit.services/lfk/backend/commit/5872c6335be573d849cdc3746b261c6cf476c3de) diff --git a/package.json b/package.json index f0037a1..bac45ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@odit/lfk-backend", - "version": "0.4.4", + "version": "0.4.5", "main": "src/app.ts", "repository": "https://git.odit.services/lfk/backend", "author": { diff --git a/src/controllers/UserGroupController.ts b/src/controllers/UserGroupController.ts index 18a901d..c68baff 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'; @@ -25,20 +26,37 @@ export class UserGroupController { @Get() @Authorized("USERGROUP:GET") - @ResponseSchema(UserGroup, { isArray: true }) + @ResponseSchema(ResponseUserGroup, { isArray: true }) @OpenAPI({ description: 'Lists all groups.
The information provided might change while the project continues to evolve.' }) - getAll() { - return this.userGroupsRepository.find({ relations: ["permissions"] }); + async getAll() { + let responseGroups: ResponseUserGroup[] = new Array(); + const groups = await this.userGroupsRepository.find({ relations: ['permissions'] }); + groups.forEach(group => { + responseGroups.push(group.toResponse()); + }); + return responseGroups; } @Get('/:id') @Authorized("USERGROUP:GET") - @ResponseSchema(UserGroup) + @ResponseSchema(ResponseUserGroup) @ResponseSchema(UserGroupNotFoundError, { statusCode: 404 }) @OnUndefined(UserGroupNotFoundError) @OpenAPI({ description: 'Lists all information about the group whose id got provided.
The information provided might change while the project continues to evolve.' }) - getOne(@Param('id') id: number) { - return this.userGroupsRepository.findOne({ id: id }, { relations: ["permissions"] }); + async getOne(@Param('id') id: number) { + return await (await (this.userGroupsRepository.findOne({ id: id }, { relations: ["permissions"] }))).toResponse(); + } + + @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() @@ -54,7 +72,8 @@ export class UserGroupController { throw error; } - return this.userGroupsRepository.save(userGroup); + userGroup = await this.userGroupsRepository.save(userGroup); + return (await (this.userGroupsRepository.findOne({ id: userGroup.id }, { relations: ["permissions"] }))).toResponse(); } @Put('/:id') diff --git a/src/models/responses/ResponseUserGroup.ts b/src/models/responses/ResponseUserGroup.ts index e6f00bb..a0a8350 100644 --- a/src/models/responses/ResponseUserGroup.ts +++ b/src/models/responses/ResponseUserGroup.ts @@ -2,7 +2,6 @@ import { IsArray, IsNotEmpty, IsOptional, IsString } from "class-validator"; import { UserGroup } from '../entities/UserGroup'; import { ResponseObjectType } from '../enums/ResponseObjectType'; import { IResponse } from './IResponse'; -import { ResponsePermission } from './ResponsePermission'; import { ResponsePrincipal } from './ResponsePrincipal'; /** @@ -34,7 +33,7 @@ export class ResponseUserGroup extends ResponsePrincipal implements IResponse { */ @IsArray() @IsOptional() - permissions: ResponsePermission[]; + permissions: string[] = new Array(); /** * Creates a ResponseUserGroup object from a userGroup. @@ -46,7 +45,7 @@ export class ResponseUserGroup extends ResponsePrincipal implements IResponse { this.description = group.description; if (group.permissions) { for (let permission of group.permissions) { - this.permissions.push(permission.toResponse()); + this.permissions.push(permission.toString()); } } } diff --git a/src/models/responses/ResponseUserGroupPermissions.ts b/src/models/responses/ResponseUserGroupPermissions.ts new file mode 100644 index 0000000..36c4fb0 --- /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()); + } + } +}