using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.eShopOnContainers.Services.Basket.API.Model; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; using Basket.API.IntegrationEvents.Events; using Microsoft.eShopOnContainers.Services.Basket.API.Services; using Basket.API.Model; namespace Microsoft.eShopOnContainers.Services.Basket.API.Controllers { [Route("/")] [Authorize] public class BasketController : Controller { private readonly IBasketRepository _repository; private readonly IIdentityService _identitySvc; private readonly IEventBus _eventBus; public BasketController(IBasketRepository repository, IIdentityService identityService, IEventBus eventBus) { _repository = repository; _identitySvc = identityService; _eventBus = eventBus; } // GET /id [HttpGet("{id}")] public async Task Get(string id) { var basket = await _repository.GetBasketAsync(id); return Ok(basket); } // POST /value [HttpPost] public async Task Post([FromBody]CustomerBasket value) { var basket = await _repository.UpdateBasketAsync(value); return Ok(basket); } [Route("checkout")] [HttpPost] public async Task Checkout([FromBody]BasketCheckout basketCheckout, [FromHeader(Name = "x-requestid")] string requestId) { var userId = _identitySvc.GetUserIdentity(); basketCheckout.RequestId = (Guid.TryParse(requestId, out Guid guid) && guid != Guid.Empty) ? guid : basketCheckout.RequestId; var basket = await _repository.GetBasketAsync(userId); var eventMessage = new UserCheckoutAcceptedIntegrationEvent(userId, basketCheckout.City, basketCheckout.Street, basketCheckout.State, basketCheckout.Country, basketCheckout.ZipCode, basketCheckout.CardNumber, basketCheckout.CardHolderName, basketCheckout.CardExpiration, basketCheckout.CardSecurityNumber, basketCheckout.CardTypeId, basketCheckout.Buyer, basketCheckout.RequestId, basket); // Once basket is checkout, sends an integration event to // ordering.api to convert basket to order and proceeds with // order creation process _eventBus.Publish(eventMessage); if (basket == null) { return BadRequest(); } return Accepted(); } // DELETE api/values/5 [HttpDelete("{id}")] public void Delete(string id) { _repository.DeleteBasketAsync(id); } } }