diff --git a/services/nginx/app/objects/groups_o.php b/services/nginx/app/objects/groups_o.php index e283e7c1..a3d9bd31 100644 --- a/services/nginx/app/objects/groups_o.php +++ b/services/nginx/app/objects/groups_o.php @@ -66,19 +66,37 @@ class groups_o extends db } /** - * Add a permission to a group + * Remove a permission from a group * * @param string $permission_id * @return self $this - * @throws Exception If the permission was not added successfully + * @throws Exception If the permission was not removed successfully */ - public function addPermission(string $permission_id): self + public function removePermission(string $permission_id): self { self::requireSelected(); - (new groups_permissions_o())->add($this->id, $permission_id); + (new groups_permissions_o())->remove($this->id, $permission_id); return $this; } + /** + * Clone a group with all its permissions + * @param string $name + * @param string $description + * @return void + * @throws Exception + */ + public function clone(string $name, string $description): void + { + self::requireSelected(); + $group = new groups_o(); + $group->add($name, $description); + $permissions = (new groups_permissions_o())->getGroupPermissions($this->id); + foreach ( $permissions as $permission ) { + $group->addPermission($permission['permission']); + } + } + /** * Add a group * @param string $name @@ -114,16 +132,16 @@ class groups_o extends db } /** - * Remove a permission from a group + * Add a permission to a group * * @param string $permission_id * @return self $this - * @throws Exception If the permission was not removed successfully + * @throws Exception If the permission was not added successfully */ - public function removePermission(string $permission_id): self + public function addPermission(string $permission_id): self { self::requireSelected(); - (new groups_permissions_o())->remove($this->id, $permission_id); + (new groups_permissions_o())->add($this->id, $permission_id); return $this; } } \ No newline at end of file diff --git a/services/nginx/app/objects/groups_permissions_o.php b/services/nginx/app/objects/groups_permissions_o.php index 4760adcc..42cd540f 100644 --- a/services/nginx/app/objects/groups_permissions_o.php +++ b/services/nginx/app/objects/groups_permissions_o.php @@ -114,9 +114,14 @@ class groups_permissions_o extends db */ public function getGroupPermissions(int $group_id): array { - return self::getFieldsWhere([ + $raw_permissions = self::getFieldsWhere([ 'group_id' => $group_id ], ['permission']); + $permissions = []; + foreach ( $raw_permissions as $permission ) { + $permissions[] = $permission['permission']; + } + return $permissions; } /** diff --git a/services/nginx/app/routes/rolesRoute.php b/services/nginx/app/routes/rolesRoute.php index 25a4b43b..220464b2 100644 --- a/services/nginx/app/routes/rolesRoute.php +++ b/services/nginx/app/routes/rolesRoute.php @@ -157,5 +157,29 @@ class rolesRoute 'delete_role_permission' => 'Remove a permission from a role' ] ); + + self::post('/roles/clone', function () { + // Require the user to be logged in + global $response; + self::requirePermission('clone_role'); + $user = (new authentication())->get_user(); + if ($user) { + self::requireParameters(['id']); + self::requireType((int)self::getParameter('id'), self::type_int()); + $group = new groups_o(); + $group->select((int)self::getParameter('id')); + $group->requireSelected(); + $group->clone($group->name->value() . ' - Klon', (string)$group->description->value()); + (new logs_o())->add('roles', 'global', 1, $user->id, 'ROLES', 'User cloned a role'); + $response->success($group->asArray()); + } else { + (new logs_o())->add('roles', 'global', 0, 0, 'ROLES', 'User tried to clone a role without a valid session'); + $response->error('Invalid session', 400); + } + }, + [ + 'clone_role' => 'Clone a role' + ] + ); } } \ No newline at end of file