using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using TaskTrackingSystem.Shared; using TaskTrackingSystem.Shared.Models.User; using TaskTrackingSystem.Shared.Models.Task; using TaskTrackingSystem.Shared.Models.Project; using TaskTrackingSystem.WebApi.Infrastructure; namespace TaskTrackingSystem.WebApi.Features.Project { [Route("api/[controller]")] [ApiController] [Authorize] public class ProjectController : ControllerBase { private readonly ProjectService _projectService; private readonly PermissionAuthorizationService _permissionAuthorizationService; public ProjectController(ProjectService projectService, PermissionAuthorizationService permissionAuthorizationService) { _projectService = projectService; _permissionAuthorizationService = permissionAuthorizationService; } [HttpGet] [ProducesResponseType(typeof(PagedResult), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task GetProjects( [FromQuery] string? search, [FromQuery] PaginationQuery? paging = null) { if (paging == null || (!paging.Page.HasValue && !paging.Limit.HasValue)) { var projects = await _projectService.GetAllProjectsAsync(User.GetRoleId(), User.GetUserId()); return Ok(projects); } var page = PaginationExtensions.NormalizePage(paging.Page); var limit = PaginationExtensions.NormalizePageSize(paging.Limit ?? 0); var paged = await _projectService.GetPagedProjectsAsync(User.GetRoleId(), User.GetUserId(), search, page, limit); return Ok(paged); } [HttpGet("{id}")] public async Task> GetProject(long id) { var project = await _projectService.GetProjectByIdAsync(id, User.GetRoleId(), User.GetUserId()); if (project == null) { return NotFound(new { message = $"Project with ID {id} not found." }); } return Ok(project); } [HttpPost] public async Task>> CreateProject([FromBody] CreateProjectDto createProjectDto) { if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/Project", "Create")) { return Forbid(); } long? currentUserId = User.GetUserId(); var result = await _projectService.CreateProjectAsync(createProjectDto, currentUserId); return StatusCode(result.StatusCode, result); } [HttpPut("{id}")] public async Task> UpdateProject(long id, [FromBody] UpdateProjectDto updateProjectDto) { if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/Project", "Update")) { return Forbid(); } var currentUserId = User.GetUserId(); var result = await _projectService.UpdateProjectAsync(id, updateProjectDto, User.GetRoleId(), currentUserId); return StatusCode(result.StatusCode, result); } [HttpDelete("{id}")] public async Task> DeleteProject(long id) { if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/Project", "Delete")) { return Forbid(); } var result = await _projectService.SoftDeleteProjectAsync(id, User.GetRoleId(), User.GetUserId()); return StatusCode(result.StatusCode, result); } [HttpGet("{id}/members")] public async Task>>> GetProjectMembers(long id) { var result = await _projectService.GetProjectMembersAsync(id, User.GetRoleId(), User.GetUserId()); return StatusCode(result.StatusCode, result); } [HttpPost("{id}/members")] public async Task AssignProjectMembers(long id, [FromBody] AssignMembersDto dto) { if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/Project", "Update")) { return Forbid(); } var result = await _projectService.AssignMembersToProjectAsync(id, dto, User.GetRoleId(), User.GetUserId()); if (!result.IsSuccess) { return StatusCode(result.StatusCode, new { message = result.ErrorMessage }); } return Ok(); } [HttpDelete("{id}/members/{userId}")] public async Task RemoveProjectMember(long id, long userId) { if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/Project", "Update")) { return Forbid(); } var result = await _projectService.RemoveMemberFromProjectAsync(id, userId, User.GetRoleId(), User.GetUserId()); if (!result.IsSuccess) { return StatusCode(result.StatusCode, new { message = result.ErrorMessage }); } return NoContent(); } [HttpGet("{id}/tasks")] public async Task>>> GetProjectTasks(long id) { var result = await _projectService.GetProjectTasksAsync(id, User.GetRoleId(), User.GetUserId()); return StatusCode(result.StatusCode, result); } } }