using Netina.Domain.Enums; namespace Netina.Api.Controllers; public class OrderController : ICarterModule { public void AddRoutes(IEndpointRouteBuilder app) { var group = app.NewVersionedApi("Order") .MapGroup("api/order") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser()); group.MapGet("", GetAllAsync) .WithDisplayName("Get Orders") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewAllOrders , ApplicationPermission.ManageOrders)) .HasApiVersion(1.0); group.MapGet("{id}", GetAsync) .WithDisplayName("Get Order") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewAllOrders, ApplicationPermission.ManageOrders, ApplicationPermission.ViewMineOrders)) .HasApiVersion(1.0); group.MapPost("{id}/confirm", ConfirmOrderStepAsync) .WithDisplayName("Confirm OrderStep") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageOrders)) .HasApiVersion(1.0); group.MapPost("{id}/cancel", CancelOrderStepAsync) .WithDisplayName("Cancel Order") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageOrders)) .HasApiVersion(1.0); group.MapDelete("{id}", DeleteAsync) .WithDisplayName("Delete Order") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageOrders)) .HasApiVersion(1.0); group.MapGet("{id}/invoice", GetOrderInvoiceAsync) .WithDisplayName("Get Order Invoice") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageOrders)) .AllowAnonymous() .HasApiVersion(1.0); } private async Task ConfirmOrderStepAsync(Guid id, [FromQuery] OrderStatus nextOrderStatus, [FromQuery]string? trackingCode, [FromServices] IMediator mediator, CancellationToken cancellationToken) => TypedResults.Ok(await mediator.Send(new ConfirmOrderStepCommand(id, nextOrderStatus,TrackingCode:trackingCode), cancellationToken)); private async Task CancelOrderStepAsync(Guid id, [FromServices] IMediator mediator, CancellationToken cancellationToken) => TypedResults.Ok(await mediator.Send(new CancelOrderStepCommand(id), cancellationToken)); public async Task GetAllAsync(IMediator mediator, [FromQuery]string? factorCode, [FromQuery]long? selectedDate, [FromQuery]OrderStatus? orderStatus, [FromQuery]OrderQueryDateFilter? dateFilter, [FromQuery]bool? orderBags, [FromQuery]int page = 0, CancellationToken cancellationToken = default) => TypedResults.Ok(await mediator.Send(new GetOrdersQuery(Page:page, FactorCode:factorCode ,OrderBags:orderBags??false , SelectedDate: selectedDate, OrderStatus:orderStatus, DateFilter:dateFilter), cancellationToken)); public async Task GetAsync(IMediator mediator, Guid id, CancellationToken cancellationToken = default) { var order = await mediator.Send(new GetOrderLDtoQuery(id), cancellationToken); return TypedResults.Ok(order); } public async Task DeleteAsync(IMediator mediator, Guid id, CancellationToken cancellationToken = default) => TypedResults.Ok(await mediator.Send(new DeleteOrderCommand(id), cancellationToken)); private async Task GetOrderInvoiceAsync([FromRoute] Guid id, [FromServices] IMediator mediator, CancellationToken cancellationToken) { var file = await mediator.Send(new GetOrderInvoiceCommand(id), cancellationToken); string fileName = $"Invoice_{id}.pdf"; return TypedResults.File(file, "application/pdf", fileName); } }