using LiteCharms.Features; using LiteCharms.Features.Hasher; using LiteCharms.Features.MidrandBooks.Customers; using LiteCharms.Features.MidrandBooks.Orders; using LiteCharms.Features.MidrandBooks.Payments; using LiteCharms.Features.MidrandBooks.Payments.Models; namespace MidrandBookshop.Components.Pages; public partial class PaymentFailed { [Inject] public CartService CartService { get; set; } = default!; [Inject] public OrderService OrderService { get; set; } = default!; [Inject] private CustomerService CustomerService { get; set; } = default!; [Inject] public PaymentService PaymentService { get; set; } = default!; [Inject] public HashService HashService { get; set; } = default!; [Inject] private AuthenticationStateProvider AuthStateProvider { get; set; } = default!; [Inject] private CancellationToken CancellationToken { get; set; } = default!; private ClaimsPrincipal? User { get; set; } [Parameter] [SupplyParameterFromQuery(Name = "reference")] public string? PaymentReference { get; set; } protected override async Task OnInitializedAsync() { var authState = await AuthStateProvider.GetAuthenticationStateAsync(); User = authState!.User; if (User?.Identity?.IsAuthenticated == false) Navigation.NavigateTo("/login"); } protected override async Task OnAfterRenderAsync(bool firstRender) { if (!firstRender) return; long orderId = HashService.DecodeLongIdHash(PaymentReference!).Value; var customerEmail = User!.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email)!.Value!; var customerFetch = await CustomerService.GetCustomerAsync(customerEmail, CancellationToken); if (customerFetch.IsFailed) return; long customerId = customerFetch.Value.Id; var orderUpdateResult = await OrderService.UpdateOrderStatusAsync(orderId, OrderStatus.Cancelled, CancellationToken); if (orderUpdateResult.IsFailed) return; var paymentIdFetch = await PaymentService.GetOrderPaymentAsync(orderId, CancellationToken); if (paymentIdFetch.IsFailed) return; await PaymentService.WriteLedgerEntryAsync(new CreateLedgerEntry { CustomerId = customerId, OrderId = orderId, PaymentGatewayId = 1, PaymentGatewayReference = PaymentReference, PaymentId = paymentIdFetch.Value.Id, Status = LedgerStatuses.Cancelled }, CancellationToken); CartService.Clear(); CartService.ShoppingCart.OrderId = null; await CartService.SaveCartToStorageAsync(); CartService.NotifyStateChanged(); } }