fix: role assignments

This commit is contained in:
2025-11-27 08:25:08 +02:00
parent df29d3ad2b
commit b849c4781a
3 changed files with 31 additions and 14 deletions

View File

@@ -33,21 +33,38 @@ class UserRoleController extends OCSController {
}
/**
* Get roles for a user
* Get user role assignments for a user
*
* Returns Role objects enriched with userRoleId for managing role assignments.
*
* @param string $userId Nextcloud user ID
* @return DataResponse<Http::STATUS_OK, list<array<string, mixed>>, array{}>
*
* 200: User roles returned
* 200: User role assignments returned
*/
#[NoAdminRequired]
#[RequirePermission('canAccessAdminTools')]
#[ApiRoute(verb: 'GET', url: '/api/users/{userId}/roles')]
public function byUser(string $userId): DataResponse {
try {
// Return full Role objects with roleType, not just UserRole entities
$roles = $this->roleMapper->findByUserId($userId);
return new DataResponse(array_map(fn ($role) => $role->jsonSerialize(), $roles));
// Get UserRole entities to get the userRoleId for delete operations
$userRoles = $this->userRoleMapper->findByUserId($userId);
// Build response with full Role info + userRoleId
$result = [];
foreach ($userRoles as $userRole) {
try {
$role = $this->roleMapper->find($userRole->getRoleId());
$roleData = $role->jsonSerialize();
$roleData['userRoleId'] = $userRole->getId();
$result[] = $roleData;
} catch (DoesNotExistException $e) {
// Role was deleted, skip this user role
continue;
}
}
return new DataResponse($result);
} catch (\Exception $e) {
$this->logger->error('Error fetching user roles: ' . $e->getMessage());
return new DataResponse(['error' => 'Failed to fetch user roles'], Http::STATUS_INTERNAL_SERVER_ERROR);

View File

@@ -8289,7 +8289,8 @@
"/ocs/v2.php/apps/forum/api/users/{userId}/roles": {
"get": {
"operationId": "user_role-by-user",
"summary": "Get roles for a user",
"summary": "Get user role assignments for a user",
"description": "Returns Role objects enriched with userRoleId for managing role assignments.",
"tags": [
"user_role"
],
@@ -8324,7 +8325,7 @@
],
"responses": {
"200": {
"description": "User roles returned",
"description": "User role assignments returned",
"content": {
"application/json": {
"schema": {

View File

@@ -296,18 +296,17 @@ export default defineComponent({
const addedRoles = newRoleIds.filter((id) => !this.originalRoles.includes(id))
// Get existing user role assignments for this user
const userRolesResponse = await ocs.get<
Array<{ id: number; roleId: number; userId: string }>
>(`/users/${userId}/roles`)
// Response includes Role objects with userRoleId for deletion
const userRolesResponse = await ocs.get<Array<Role & { userRoleId: number }>>(
`/users/${userId}/roles`,
)
const existingUserRoles = userRolesResponse.data || []
// Remove roles
for (const roleId of removedRoles) {
const userRole = existingUserRoles.find(
(ur) => ur.roleId === roleId && ur.userId === userId,
)
const userRole = existingUserRoles.find((ur) => ur.id === roleId)
if (userRole) {
await ocs.delete(`/user-roles/${userRole.id}`)
await ocs.delete(`/user-roles/${userRole.userRoleId}`)
}
}