mirror of
https://github.com/chenasraf/nextcloud-forum.git
synced 2026-05-17 17:28:02 +00:00
fix: role assignments
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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}`)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user