using BlackRock.Reporting.API.Controllers.Model; using BlackRock.Reporting.API.Mediator.UserMediator.Commands; using BlackRock.Reporting.API.Mediator.UserMediator.Queries; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace BlackRock.Reporting.API.Controllers { [Authorize] [Route("api/users")] public class UsersController : Controller { private readonly IMediator mediator; public UsersController(IMediator mediator) { this.mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); } // GET: api/users/1 [HttpGet] [Route("{id}")] public async Task GetUser(int id) { var result = await mediator.Send(new GetUserQuery { Id = id }); if (!result.IsSuccess) return BadRequest(result.Error); if (result.Data == null) return NotFound("Id is not valid"); return Ok(result.Data); } // GET: api/users?Page=2&PageSize=25 [HttpGet] public async Task GetAllUsers(GetAllUsersQuery query) { var result = await mediator.Send(query); if (!result.IsSuccess) return BadRequest(result.Error); if (result.Data == null) return NotFound(); return Ok(result.Data); } // POST: api/users [HttpPost] public async Task CreateUser([FromBody] CreateUserCommand user) { if (!ModelState.IsValid) return BadRequest(ModelState); var result = await mediator.Send(user); if (!result.IsSuccess) return BadRequest(result.Error); // return Created(Url.Action(nameof(Get), result.Data), result.Data); return Ok(result.Data); } // PUT: api/users/1 [HttpPut] [Route("{id}")] public async Task UpdateUser(int id, [FromBody] UpdateUserCommand user) { if (!ModelState.IsValid) return BadRequest(ErrorResponse.Validation(ModelState)); user.Id = id; var result = await mediator.Send(user); if (!result.IsSuccess) return BadRequest(result.Error); return Accepted(); } // PATCH: api/users/1/email [HttpPatch] [Route("{id}/email")] public async Task UpdateUserEmail(int id, [FromBody] UpdateUserEmailCommand user) { if (!ModelState.IsValid) return BadRequest(ErrorResponse.Validation(ModelState)); user.Id = id; var result = await mediator.Send(user); if (!result.IsSuccess) return BadRequest(result.Error); return Accepted(); } // DELETE: api/users/1 [HttpDelete] [Route("{id}")] public async Task DeleteUser(int id) { if (!ModelState.IsValid) return BadRequest(ErrorResponse.Validation(ModelState)); var result = await mediator.Send(new DeleteUsersCommand { Id = id }); if (!result.IsSuccess) return BadRequest(result.Error); return NoContent(); } } // I/O // Output: DTO : Entity wraper, Agregations // Input: Query / Form }