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());
+ }
+ }
+}