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