using BlackRock.Reporting.API.Mediator; using BlackRock.Reporting.API.Models; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding; namespace BlackRock.Reporting.API.Controllers { [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("api/users/{id}")] public async Task Get(Guid id) { var result = await mediator.Send(new GetUsersQuery(id)); if (!result.IsSuccess) return BadRequest(result.Error); if (result.Data == null) return NoContent(); return Ok(result.Data); } // GET: api/users?Page=2&PageSize=25 [HttpGet] [Route("api/users")] public async Task GetAll(UserQuery filter) { var result = await mediator.Send(new GetAllUsersQuery(filter)); if (!result.IsSuccess) return BadRequest(result.Error); if (result.Data == null) return NoContent(); return Ok(result.Data); } // POST: api/users [HttpPost] [Route("api/users")] public async Task Post([FromBody] UserForm form) { if (!ModelState.IsValid) return BadRequest(ModelState); var result = await mediator.Send(new CreateUsersCommand(form)); 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("api/users/{id}")] public async Task Put(Guid id, [FromBody] UserForm form) { if (!ModelState.IsValid) return BadRequest(ErrorResponse.Validation(ModelState)); var result = await mediator.Send(new UpdateAllUsersCommand(id, form)); if (!result.IsSuccess) return BadRequest(result.Error); return Accepted(); } // PATCH: api/users/1/email [HttpPatch] [Route("api/users/{id}/email")] public async Task UpdateEmail(Guid id, [FromBody] UserForm form) { if (!ModelState.IsValid) return BadRequest(ErrorResponse.Validation(ModelState)); var result = await mediator.Send(new UpdateEmailUsersCommand(id, form)); if (!result.IsSuccess) return BadRequest(result.Error); return Accepted(); } // DELETE: api/users/1 [HttpDelete] [Route("api/users/{id}")] public async Task Delete(Guid id) { if (!ModelState.IsValid) return BadRequest(ErrorResponse.Validation(ModelState)); var result = await mediator.Send(new DeleteUsersCommand(id)); if (!result.IsSuccess) return BadRequest(result.Error); return NoContent(); } } public class ErrorResponse { public IEnumerable Errors { get; set; } public Enum StatusCode { get; set; } public ModelStateDictionary Validations { get; set; } public static ErrorResponse Validation(ModelStateDictionary validations) { return new ErrorResponse { Validations = validations }; } } // I/O // Output: DTO : Entity wraper, Agregations // Input: Query / Form }