using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Swashbuckle.AspNetCore.Annotations; using UserManagement.Application.Dtos.Incomming; using UserManagement.Application.Interfaces; namespace UserManagement.API.Controllers { [Route("api/[controller]")] [ApiController] //[Authorize(Roles = "Admin")] public class UserController : Controller { // CTOR private readonly IUserService _userService; private readonly ILogger _logger; public UserController(IUserService userService, ILogger logger) { _userService = userService; _logger = logger; } // CREATE [HttpPost] [SwaggerOperation(Summary = "Create User")] [ProducesResponseType(StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [Authorize(Roles = "Admin")] public async Task CreateUser([FromBody] CreatingUserDto creatingUserDto) { if (!ModelState.IsValid) { return BadRequest(ModelState); } try { var createdUser = await _userService.AddUserAsync(creatingUserDto); if (createdUser is not null) { return CreatedAtAction(nameof(GetUserById), new { id = createdUser.Id }, createdUser); } else { return BadRequest("Erstellung des Benutzers fehlgeschlagen!"); } } catch (Exception ex) { return StatusCode(StatusCodes.Status500InternalServerError, ex.Message); } } // READ ALL [HttpGet] [SwaggerOperation(Summary = "Get all Users")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetAllUsers([FromQuery] bool includeRoles = true) { try { var users = await _userService.GetUsersAsync(includeRoles); return Ok(users); } catch (KeyNotFoundException ex) { return NotFound(ex.Message); } } // READ BY ID [HttpGet("id/{id}", Name = "GetUserById")] [SwaggerOperation(Summary = "Get User by Id")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetUserById(int id, [FromQuery] bool includeRoles = true) { try { var user = await _userService.GetByIdAsync(id, includeRoles); return Ok(user); } catch (ArgumentException ex) { return BadRequest(ex.Message); } catch (KeyNotFoundException ex) { return NotFound(ex.Message); } } // READ BY USERNAME [HttpGet("username/{username}", Name = "GetUserByUsername")] [SwaggerOperation(Summary = "Get User by Username")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetUserByUsername(string username, [FromQuery] bool includeRoles = true) { try { var user = await _userService.GetByUsernameAsync(username, includeRoles); return Ok(user); } catch (ArgumentException ex) { return BadRequest(ex.Message); } catch (KeyNotFoundException ex) { return NotFound(ex.Message); } } // READ BY ROLE [HttpGet("role/{role}", Name = "GetUsersByRole")] [SwaggerOperation(Summary = "Get Users by Role")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetUsersByRole(string role) { try { var users = await _userService.GetByRoleAsync(role); return Ok(users); } catch (ArgumentException ex) { return BadRequest(ex.Message); } catch (KeyNotFoundException ex) { return NotFound(ex.Message); } } // UPDATE [HttpPut("id/{id}", Name = "UpdateUser")] [SwaggerOperation(Summary = "Update User")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task UpdateUser(int id, UpdatingUserDto updatingUserDto) { try { var updated = await _userService.UpdateUserAsync(updatingUserDto); return Ok(updated); } catch (ArgumentException ex) { return BadRequest(ex.Message); } catch (KeyNotFoundException ex) { return NotFound(ex.Message); } catch (Exception ex) { _logger.LogError(ex, ex.Message); return StatusCode(StatusCodes.Status500InternalServerError); } } // DELETE [HttpDelete("id/{id}", Name = "DeleteUser")] [SwaggerOperation(Summary = "Delete User")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task DeleteUser([FromBody] int id) { try { var deleted = await _userService.DeleteUserAsync(id); return Ok(deleted); } catch (ArgumentException ex) { return BadRequest(ex.Message); } catch (KeyNotFoundException ex) { return NotFound(ex.Message); } } } }