using AutoMapper; using Diligent.WebAPI.Business.Services; using Diligent.WebAPI.Data.Entities; using Diligent.WebAPI.Host.DTOs.Customer; using Diligent.WebAPI.Host.DTOs.Request; using Diligent.WebAPI.Host.Exceptions; using Diligent.WebAPI.Host.Mediator.Request.Commands; using Diligent.WebAPI.Host.Mediator.Request.Queries; using MediatR; using Microsoft.AspNetCore.Mvc; namespace Diligent.WebAPI.Host.Controllers { [ApiVersion("1.0")] [ApiController] [Route("v{version:apiVersion}/[controller]")] public class RequestController:ControllerBase { private readonly RequestService _requestService; private readonly IMapper _mapper; private readonly IMediator _mediator; public RequestController(RequestService requestService,IMapper mapper,IMediator mediator) { _requestService = requestService; _mapper = mapper; _mediator = mediator; } [HttpGet] public async Task GetRequests() { return Ok(await _requestService.GetRequestsAsync()); } [HttpGet("{id}")] public async Task GetRequestById(string id) { if (id == null) { throw new BadHttpRequestException("Id cannot be null"); } var request = await _requestService.GetRequestAsync(id); if (request == null) { throw new NotFoundException("Request not found"); } return Ok(request); } // get all rooms for which exist at least one request from customer [HttpGet("request-rooms")] public async Task>> GetRoomsForWhichRequestExist() => await _mediator.Send(new GetRoomsForWhichRequestExistQuery()); [HttpGet("room-customers")] public async Task>> GetCustomersForSpecificRequestRoom(string id) => await _mediator.Send(new GetSendersForSpecificRequestRoomQuery(id)); [HttpPost("accept-request")] public async Task AcceptCustomerRequest(AcceptCustomerDTO acceptCustomerDTO) { var id = await _mediator.Send(new AcceptCustomerRequestCommand(acceptCustomerDTO.customerId, acceptCustomerDTO.roomId)); return Ok(id); } [HttpPost("reject-request")] public async Task RejectCustomerRequest(AcceptCustomerDTO acceptCustomerDTO) { var id = await _mediator.Send(new RejectCustomerRequestCommand(acceptCustomerDTO.customerId, acceptCustomerDTO.roomId)); return Ok(id); } [HttpPost("join-request")] public async Task CreateRequest(RequestCreateDTO resource) { if (resource == null) throw new BadHttpRequestException("Resource object cannot be null."); var room = _mapper.Map(resource); await _requestService.CreateRequestAsync(room); return CreatedAtAction(nameof(RequestController.CreateRequest), new { id = room.Id }, room); } } }