using GameIdeas.Shared.Constants; using GameIdeas.Shared.Dto; using GameIdeas.WebAPI.Exceptions; using GameIdeas.WebAPI.Services.Users; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace GameIdeas.WebAPI.Controllers; [ApiController] [Route("api/[controller]")] public class UserController( IUserReadService userReadService, IUserWriteService userWriteService, ILoggerFactory loggerFactory) : Controller { private readonly ILogger logger = loggerFactory.CreateLogger(); [HttpPost("Login")] public async Task> Login([FromBody] UserDto model) { try { return Ok(await userReadService.Login(model)); } catch (UserInvalidException e) { logger.LogInformation(e, "Missing informations for authentication"); return StatusCode(406, e.Message); } catch (UserUnauthorizedException e) { logger.LogWarning(e, "Authentication invalid with there informations"); return Unauthorized(e.Message); } catch (Exception e) { logger.LogError(e, "Internal error while search games"); return StatusCode(500, e.Message); } } [Authorize(Roles = GlobalConstants.ADMINISTRATOR)] [HttpGet("Roles")] public async Task>> GetRoles() { try { return Ok(await userReadService.GetRoles()); } catch (Exception e) { logger.LogError(e, "Internal error while get roles"); return StatusCode(500, e.Message); } } [Authorize(Roles = GlobalConstants.ADMINISTRATOR)] [HttpGet] public async Task> GetUsers([FromQuery] UserFilterDto filter) { try { return Ok(await userReadService.GetUsers(filter)); } catch (Exception e) { logger.LogError(e, "Internal error while get users"); return StatusCode(500, e.Message); } } [Authorize(Roles = GlobalConstants.ADMINISTRATOR)] [HttpPost("Create")] public async Task> CreateUser([FromBody] UserDto user) { try { var id = new IdDto() { Id = await userWriteService.CreateUser(user) }; return Created("/Create", id); } catch (Exception e) { logger.LogError(e, "Internal error while create user"); return StatusCode(500, e.Message); } } [Authorize(Roles = GlobalConstants.ADMINISTRATOR)] [HttpPut("Update/{userId}")] public async Task> UpdateUser(string userId, [FromBody] UserDto user) { try { var id = new IdDto() { Id = await userWriteService.UpdateUser(userId, user) }; return Created("/Update", id); } catch (Exception e) { logger.LogError(e, "Internal error while update user"); return StatusCode(500, e.Message); } } [Authorize(Roles = GlobalConstants.ADMINISTRATOR)] [HttpDelete("Delete/{userId}")] public async Task> DeleteUser(string userId) { try { var id = new IdDto() { Id = await userWriteService.DeleteUser(userId) }; return Created("/Delete", id); } catch (Exception e) { logger.LogError(e, "Internal error while delete user"); return StatusCode(500, e.Message); } } }