using Microsoft.AspNetCore.Mvc; using StoreService.Models; using StoreService.Services; namespace StoreService.Controllers; /// /// Endpoints for order lifecycle: create, query, pay and redeem. /// [ApiController] [Route("api/[controller]")] public class OrdersController : ControllerBase { #region Fields private readonly IOrderService _orderService; #endregion #region Ctor public OrdersController(IOrderService orderService) { _orderService = orderService; } #endregion #region Endpoints /// /// Creates a new order for specified user and store items. Prices are calculated with active discounts. /// [HttpPost] [ProducesResponseType(typeof(OrderDto), StatusCodes.Status201Created)] public async Task Create([FromBody] CreateOrderRequest request, CancellationToken ct) { var order = await _orderService.CreateOrderAsync(request, ct); return CreatedAtAction(nameof(Get), new { id = order.Id }, order); } /// /// Retrieves an order by id. /// [HttpGet("{id:long}")] [ProducesResponseType(typeof(OrderDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task Get([FromRoute] long id, CancellationToken ct) { var order = await _orderService.GetOrderAsync(id, ct); return order == null ? NotFound() : Ok(order); } /// /// Pays (confirms) an order. Sets the paid date. Idempotent except it fails if already paid. /// [HttpPost("{id:long}/pay")] [ProducesResponseType(typeof(OrderDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status409Conflict)] public async Task Pay([FromRoute] long id, CancellationToken ct) { var order = await _orderService.PayOrderAsync(id, ct); return Ok(order); } /// /// Marks items as redeemed (granted to user inventory) after payment. /// [HttpPost("{id:long}/redeem")] [ProducesResponseType(typeof(OrderDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status409Conflict)] public async Task Redeem([FromRoute] long id, CancellationToken ct) { var order = await _orderService.RedeemOrderItemsAsync(id, ct); return Ok(order); } #endregion }