using MikrocopApi.Dtos; using MikrocopApi.Mappers; using MikrocopApi.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace MikrocopApi.Controllers; [ApiController] [Authorize] [Route("api/users")] public sealed class UsersController : ControllerBase { private readonly IUserService _userService; public UsersController(IUserService userService) { _userService = userService; } [HttpPost] [ProducesResponseType(StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status409Conflict)] public async Task Create([FromBody] CreateUserDto request, CancellationToken cancellationToken) { var user = await _userService.CreateAsync(request, cancellationToken); return CreatedAtAction(nameof(GetById), new { id = user.Id }, user); } [HttpGet("{id:guid}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetById([FromRoute] Guid id, CancellationToken cancellationToken) { var user = await _userService.GetByIdAsync(id, cancellationToken); return Ok(user); } [HttpPut("{id:guid}")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status409Conflict)] public async Task Update([FromRoute] Guid id, [FromBody] UpdateUserDto request, CancellationToken cancellationToken) { await _userService.UpdateAsync(id, request, cancellationToken); return NoContent(); } [HttpDelete("{id:guid}")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task Delete([FromRoute] Guid id, CancellationToken cancellationToken) { await _userService.DeleteAsync(id, cancellationToken); return NoContent(); } [HttpPost("{id:guid}/validate-password")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task ValidatePassword([FromRoute] Guid id, [FromBody] ValidatePasswordRequestDto request, CancellationToken cancellationToken) { var isValid = await _userService.ValidatePasswordAsync(id, request.Password, cancellationToken); return Ok(isValid.ToDto()); } }