using eprintServer.Entities; using eprintServer.Requests; using eprintServer.Responses; using eprintServer.Services; using eprintServer.Enums; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; namespace eprintServer.Controllers; [ApiController] [Route("api/[controller]")] [Authorize(Roles = "ADMIN,SUB_ADMIN,USER")] public class OrderController : ControllerBase { private readonly OrderService _orderService; public OrderController(OrderService orderService) { _orderService = orderService; } [HttpPost] public async Task> Create(OrderRequest request) { var order = await _orderService.CreateOrderAsync(request); return CreatedAtAction(nameof(GetById), new { id = order.Id }, order); } [HttpGet("{id}")] public async Task> GetById(long id) { var order = await _orderService.GetByIdAsync(id); if (order == null) return NotFound(); return Ok(order); } [HttpGet("get-all-orders-pg")] public async Task>> GetAll( [FromQuery] int page = 0, [FromQuery] int size = 5, [FromQuery] long? userId = null, [FromQuery] OrderStatus? status = null) { var result = await _orderService.GetPagedOrdersAsync(page, size, userId, status); return Ok(result); } [HttpPut("{id}")] public async Task> Update(long id, OrderUpdateRequest request) { var updatedOrder = await _orderService.UpdateOrderAsync(id, request); if (updatedOrder == null) return NotFound(); return Ok(updatedOrder); } [HttpDelete("{id}")] public async Task Delete(long id) { var result = await _orderService.DeleteOrderAsync(id); if (!result) return NotFound(); return NoContent(); } [HttpPut("status/{id}")] public async Task UpdateStatus(long id, [FromQuery] OrderStatus status) { var success = await _orderService.UpdateStatusAsync(id, status); if (!success) return NotFound($"Order with ID {id} not found."); return Ok(new { message = "Order status updated successfully", newStatus = status }); } [HttpPatch("update-shipping-address/{orderId}")] public async Task UpdateShippingAddress(long orderId, [FromBody] UpdateOrderAddressRequest request) { try { var order = await _orderService.UpdateOrderAddressAsync(orderId, request); if (order == null) return NotFound("Order not found"); return Ok(order); } catch (Exception ex) { return StatusCode(500, ex.Message); } } }