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
}