File size: 4,515 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
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;
using TaskTrackingSystem.Shared;
using TaskTrackingSystem.Shared.Enums;
using TaskTrackingSystem.Shared.Models.Issue;
using TaskTrackingSystem.WebApi.Infrastructure;

namespace TaskTrackingSystem.WebApi.Features.Issue
{
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class IssueController : ControllerBase
    {
        private readonly IssueService _issueService;
        private readonly PermissionAuthorizationService _permissionAuthorizationService;

        public IssueController(IssueService issueService, PermissionAuthorizationService permissionAuthorizationService)
        {
            _issueService = issueService;
            _permissionAuthorizationService = permissionAuthorizationService;
        }

        [HttpGet]
        [ProducesResponseType(typeof(PagedResult<IssueDto>), StatusCodes.Status200OK)]
        public async Task<ActionResult> GetIssues(
            [FromQuery] string? search,
            [FromQuery] long? taskId,
            [FromQuery] long? projectId,
            [FromQuery] AppTaskStatus? statusId,
            [FromQuery] TaskPriority? priorityId,
            [FromQuery] bool assignedOnly = false,
            [FromQuery] PaginationQuery? paging = null)
        {
            if (paging == null || (!paging.Page.HasValue && !paging.Limit.HasValue))
            {
                var issues = await _issueService.GetAllIssuesAsync(User.GetRoleId(), User.GetUserId());
                return Ok(issues);
            }

            var page = PaginationExtensions.NormalizePage(paging.Page);
            var limit = PaginationExtensions.NormalizePageSize(paging.Limit ?? 0);
            var paged = await _issueService.GetPagedIssuesAsync(
                User.GetRoleId(),
                User.GetUserId(),
                search,
                taskId,
                projectId,
                statusId,
                priorityId,
                assignedOnly,
                page,
                limit);

            return Ok(paged);
        }

        [HttpGet("{id}")]
        public async Task<ActionResult<IssueDto>> GetIssue(long id)
        {
            var issue = await _issueService.GetIssueByIdAsync(id, User.GetRoleId(), User.GetUserId());
            if (issue == null)
            {
                return NotFound(new { message = $"Issue with ID {id} not found." });
            }

            return Ok(issue);
        }

        [HttpGet("task/{taskId}")]
        public async Task<ActionResult<IEnumerable<IssueDto>>> GetIssuesByTask(long taskId)
        {
            var issues = await _issueService.GetIssuesByTaskIdAsync(taskId, User.GetRoleId(), User.GetUserId());
            return Ok(issues);
        }

        [HttpPost]
        public async Task<ActionResult<Result<IssueDto>>> CreateIssue([FromBody] CreateIssueDto dto)
        {
            if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/Issue", "Create"))
            {
                return StatusCode(403, Result<IssueDto>.Failure("You do not have permission to create issues.", 403));
            }

            var result = await _issueService.CreateIssueAsync(dto, User.GetRoleId(), User.GetUserId());
            return StatusCode(result.StatusCode, result);
        }

        [HttpPut("{id}")]
        public async Task<ActionResult<Result>> UpdateIssue(long id, [FromBody] UpdateIssueDto dto)
        {
            if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/Issue", "Update"))
            {
                return StatusCode(403, Result.Failure("You do not have permission to update issues.", 403));
            }

            var result = await _issueService.UpdateIssueAsync(id, dto, User.GetRoleId(), User.GetUserId());
            return StatusCode(result.StatusCode, result);
        }

        [HttpDelete("{id}")]
        public async Task<ActionResult<Result>> DeleteIssue(long id)
        {
            if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/Issue", "Delete"))
            {
                return StatusCode(403, Result.Failure("You do not have permission to delete issues.", 403));
            }

            var result = await _issueService.SoftDeleteIssueAsync(id, User.GetRoleId(), User.GetUserId());
            return StatusCode(result.StatusCode, result);
        }
    }
}