using Distribution.Infra.Authorization; using Distribution.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Distribution.Features.Stock; [ApiController] [Route("api/stock")] [Authorize] public class StockController(StockService service, ICurrentUserService currentUser) : ControllerBase { // ── Query ────────────────────────────────────────────────────────────── [HttpGet("balances")] public async Task GetBalances( [FromQuery] Guid? locationId, [FromQuery] LocationType? locationType, [FromQuery] Guid? itemId, [FromQuery] int page = 1, [FromQuery] int pageSize = 20) { var result = await service.GetBalancesAsync(locationId, locationType, itemId, page, pageSize); return Ok(result); } [HttpGet("balances/{itemId}/total")] public async Task GetItemTotal(Guid itemId) { var result = await service.GetItemTotalAsync(itemId); if (result is null) return NotFound(); return Ok(result); } [HttpGet("movements")] public async Task GetMovements( [FromQuery] Guid? locationId, [FromQuery] Guid? itemId, [FromQuery] MovementType? type, [FromQuery] DateTime? from, [FromQuery] DateTime? to, [FromQuery] int page = 1, [FromQuery] int pageSize = 20) { var result = await service.GetMovementsAsync(locationId, itemId, type, from, to, page, pageSize); return Ok(result); } // ── Write ────────────────────────────────────────────────────────────── [HttpPost("transfer")] public async Task Transfer(TransferRequest request, CancellationToken ct) { if (currentUser.UserId is null) return Unauthorized(); try { var result = await service.TransferAsync(request, currentUser.UserId.Value, ct); return Ok(result); } catch (InvalidOperationException ex) { return BadRequest(ex.Message); } } [HttpPost("damage")] public async Task RecordDamage(DamageRequest request, CancellationToken ct) { if (currentUser.UserId is null) return Unauthorized(); try { var result = await service.RecordDamageAsync(request, currentUser.UserId.Value, ct); return Ok(result); } catch (InvalidOperationException ex) { return BadRequest(ex.Message); } } [HttpPost("customer-return")] public async Task RecordCustomerReturn(CustomerReturnRequest request, CancellationToken ct) { if (currentUser.UserId is null) return Unauthorized(); try { var result = await service.RecordCustomerReturnAsync(request, currentUser.UserId.Value, ct); return Ok(result); } catch (InvalidOperationException ex) { return BadRequest(ex.Message); } } [HttpPost("adjustment")] public async Task Adjust(AdjustmentRequest request, CancellationToken ct) { if (currentUser.UserId is null) return Unauthorized(); try { var result = await service.AdjustAsync(request, currentUser.UserId.Value, ct); return Ok(result); } catch (InvalidOperationException ex) { return BadRequest(ex.Message); } } }