Spaces:
Running
Running
File size: 4,999 Bytes
4e645a3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using TaskTrackingSystem.Shared;
using TaskTrackingSystem.Shared.Models.User;
using TaskTrackingSystem.WebApi.Features.User;
using TaskTrackingSystem.WebApi.Infrastructure;
namespace TaskTrackingSystem.WebApi.Features.User
{
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class UserController : ControllerBase
{
private readonly UserService _userService;
private readonly PermissionAuthorizationService _permissionAuthorizationService;
public UserController(UserService userService, PermissionAuthorizationService permissionAuthorizationService)
{
_userService = userService;
_permissionAuthorizationService = permissionAuthorizationService;
}
[HttpGet]
[ProducesResponseType(typeof(PagedResult<UserDto>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public async Task<ActionResult> GetUsers(
[FromQuery] string? search,
[FromQuery] long? roleId,
[FromQuery] string? status,
[FromQuery] PaginationQuery? paging = null)
{
if (paging == null || (!paging.Page.HasValue && !paging.Limit.HasValue))
{
var users = await _userService.GetAllUsersAsync();
return Ok(users);
}
var page = PaginationExtensions.NormalizePage(paging.Page);
var limit = PaginationExtensions.NormalizePageSize(paging.Limit ?? 0);
var paged = await _userService.GetPagedUsersAsync(search, roleId, status, page, limit);
return Ok(paged);
}
/// <summary>Returns the user IDs of all colleagues who share any project with the current user.</summary>
[HttpGet("my-team-user-ids")]
public async Task<ActionResult<List<long>>> GetMyTeamUserIds()
{
var currentUserId = User.GetUserId();
var myProjectIds = await _userService.GetMyProjectIdsAsync(currentUserId);
var teamUserIds = await _userService.GetTeamUserIdsAsync(myProjectIds, currentUserId);
return Ok(teamUserIds);
}
/// <summary>Returns all project IDs the current user is a member of.</summary>
[HttpGet("my-project-ids")]
public async Task<ActionResult<List<long>>> GetMyProjectIds()
{
var currentUserId = User.GetUserId();
var projectIds = await _userService.GetMyProjectIdsAsync(currentUserId);
return Ok(projectIds);
}
[HttpGet("{id}")]
public async Task<ActionResult<UserDto>> GetUser(long id)
{
var user = await _userService.GetUserByIdAsync(id);
if (user == null)
{
return NotFound(new { message = $"User with ID {id} not found." });
}
return Ok(user);
}
[HttpPost]
public async Task<ActionResult<Result<UserDto>>> CreateUser([FromBody] CreateUserDto createUserDto)
{
if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/User", "Create"))
{
return StatusCode(403, Result<UserDto>.Failure("You do not have permission to create users.", 403));
}
long? currentUserId = null;
var result = await _userService.CreateUserAsync(createUserDto, currentUserId);
return StatusCode(result.StatusCode, result);
}
[HttpPut("{id}")]
public async Task<ActionResult<Result>> UpdateUser(long id, [FromBody] UpdateUserDto updateUserDto)
{
if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/User", "Update"))
{
return StatusCode(403, Result.Failure("You do not have permission to update users.", 403));
}
long? currentUserId = null;
var result = await _userService.UpdateUserAsync(id, updateUserDto, currentUserId);
return StatusCode(result.StatusCode, result);
}
[HttpDelete("{id}")]
public async Task<ActionResult<Result>> DeleteUser(long id)
{
if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/User", "Delete"))
{
return StatusCode(403, Result.Failure("You do not have permission to delete users.", 403));
}
long? loggedInUserId = null;
var nameIdentifier = User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value;
if (nameIdentifier != null && long.TryParse(nameIdentifier, out var parsedId))
{
loggedInUserId = parsedId;
}
var result = await _userService.SoftDeleteUserAsync(id, loggedInUserId);
return StatusCode(result.StatusCode, result);
}
}
}
|