diff --git a/LittleShop.Client/Services/IOrderService.cs b/LittleShop.Client/Services/IOrderService.cs index 5d416c1..04200e8 100644 --- a/LittleShop.Client/Services/IOrderService.cs +++ b/LittleShop.Client/Services/IOrderService.cs @@ -8,6 +8,7 @@ public interface IOrderService Task>> GetOrdersByIdentityAsync(string identityReference); Task>> GetOrdersByCustomerIdAsync(Guid customerId); Task> GetOrderByIdAsync(Guid id); + Task> GetOrderByCustomerIdAsync(Guid customerId, Guid orderId); Task> CreatePaymentAsync(Guid orderId, int currency); Task>> GetOrderPaymentsAsync(Guid orderId); } \ No newline at end of file diff --git a/LittleShop.Client/Services/OrderService.cs b/LittleShop.Client/Services/OrderService.cs index 9a012b2..0328bd8 100644 --- a/LittleShop.Client/Services/OrderService.cs +++ b/LittleShop.Client/Services/OrderService.cs @@ -113,6 +113,31 @@ public class OrderService : IOrderService System.Net.HttpStatusCode.InternalServerError); } } + + public async Task> GetOrderByCustomerIdAsync(Guid customerId, Guid orderId) + { + try + { + var response = await _httpClient.GetAsync($"api/orders/by-customer/{customerId}/{orderId}"); + + if (response.IsSuccessStatusCode) + { + var order = await response.Content.ReadFromJsonAsync(); + if (order != null) + return ApiResponse.Success(order); + } + + var error = await response.Content.ReadAsStringAsync(); + return ApiResponse.Failure(error, response.StatusCode); + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to get order {OrderId} for customer {CustomerId}", orderId, customerId); + return ApiResponse.Failure( + ex.Message, + System.Net.HttpStatusCode.InternalServerError); + } + } public async Task> CreatePaymentAsync(Guid orderId, int currency) { diff --git a/LittleShop/Controllers/OrdersController.cs b/LittleShop/Controllers/OrdersController.cs index 198dfd4..8c0462b 100644 --- a/LittleShop/Controllers/OrdersController.cs +++ b/LittleShop/Controllers/OrdersController.cs @@ -72,6 +72,19 @@ public class OrdersController : ControllerBase return Ok(orders); } + [HttpGet("by-customer/{customerId}/{id}")] + [AllowAnonymous] + public async Task> GetOrderByCustomerId(Guid customerId, Guid id) + { + var order = await _orderService.GetOrderByIdAsync(id); + if (order == null || order.CustomerId != customerId) + { + return NotFound(); + } + + return Ok(order); + } + [HttpGet("by-identity/{identityReference}/{id}")] [AllowAnonymous] public async Task> GetOrderByIdentity(string identityReference, Guid id) diff --git a/LittleShop/Program.cs b/LittleShop/Program.cs index 180e9f5..6a75088 100644 --- a/LittleShop/Program.cs +++ b/LittleShop/Program.cs @@ -73,7 +73,8 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(); -builder.Services.AddHostedService(); +// Temporarily disabled to use standalone TeleBot with customer orders fix +// builder.Services.AddHostedService(); // AutoMapper builder.Services.AddAutoMapper(typeof(Program)); diff --git a/LittleShop/littleshop.db-shm b/LittleShop/littleshop.db-shm index f15ac3c..78eec8d 100644 Binary files a/LittleShop/littleshop.db-shm and b/LittleShop/littleshop.db-shm differ diff --git a/LittleShop/littleshop.db-wal b/LittleShop/littleshop.db-wal index df04f23..de2c1ac 100644 Binary files a/LittleShop/littleshop.db-wal and b/LittleShop/littleshop.db-wal differ diff --git a/TeleBot/TeleBot/Handlers/CallbackHandler.cs b/TeleBot/TeleBot/Handlers/CallbackHandler.cs index 03e7af3..43ba7e1 100644 --- a/TeleBot/TeleBot/Handlers/CallbackHandler.cs +++ b/TeleBot/TeleBot/Handlers/CallbackHandler.cs @@ -109,11 +109,11 @@ namespace TeleBot.Handlers break; case "orders": - await HandleViewOrders(bot, callbackQuery.Message, session); + await HandleViewOrders(bot, callbackQuery.Message, session, callbackQuery.From); break; case "order": - await HandleViewOrder(bot, callbackQuery.Message, session, Guid.Parse(data[1])); + await HandleViewOrder(bot, callbackQuery.Message, session, Guid.Parse(data[1]), callbackQuery.From); break; case "privacy": @@ -480,20 +480,16 @@ namespace TeleBot.Handlers } } - private async Task HandleViewOrders(ITelegramBotClient bot, Message message, UserSession session) + private async Task HandleViewOrders(ITelegramBotClient bot, Message message, UserSession session, User telegramUser) { - var identityRef = session.OrderFlow?.IdentityReference; - if (string.IsNullOrEmpty(identityRef)) - { - identityRef = _privacyService.GenerateAnonymousReference(); - if (session.OrderFlow == null) - { - session.OrderFlow = new OrderFlowData(); - } - session.OrderFlow.IdentityReference = identityRef; - } - - var orders = await _shopService.GetOrdersAsync(identityRef); + // Use new customer-based order lookup + var orders = await _shopService.GetCustomerOrdersAsync( + telegramUser.Id, + telegramUser.Username ?? "", + $"{telegramUser.FirstName} {telegramUser.LastName}".Trim(), + telegramUser.FirstName ?? "", + telegramUser.LastName ?? "" + ); if (!orders.Any()) { @@ -519,9 +515,16 @@ namespace TeleBot.Handlers session.State = SessionState.ViewingOrders; } - private async Task HandleViewOrder(ITelegramBotClient bot, Message message, UserSession session, Guid orderId) + private async Task HandleViewOrder(ITelegramBotClient bot, Message message, UserSession session, Guid orderId, User telegramUser) { - var order = await _shopService.GetOrderAsync(orderId); + var order = await _shopService.GetCustomerOrderAsync( + orderId, + telegramUser.Id, + telegramUser.Username ?? "", + $"{telegramUser.FirstName} {telegramUser.LastName}".Trim(), + telegramUser.FirstName ?? "", + telegramUser.LastName ?? "" + ); if (order == null) { diff --git a/TeleBot/TeleBot/Services/LittleShopService.cs b/TeleBot/TeleBot/Services/LittleShopService.cs index ac3c1c6..155a30b 100644 --- a/TeleBot/TeleBot/Services/LittleShopService.cs +++ b/TeleBot/TeleBot/Services/LittleShopService.cs @@ -20,6 +20,7 @@ namespace TeleBot.Services Task> GetOrdersAsync(string identityReference); Task> GetCustomerOrdersAsync(long telegramUserId, string telegramUsername, string displayName, string firstName, string lastName); Task GetOrderAsync(Guid orderId); + Task GetCustomerOrderAsync(Guid orderId, long telegramUserId, string telegramUsername, string displayName, string firstName, string lastName); Task CreatePaymentAsync(Guid orderId, string currency); Task?> GetPendingMessagesAsync(); Task MarkMessageAsSentAsync(Guid messageId, string? platformMessageId = null); @@ -298,6 +299,47 @@ namespace TeleBot.Services return null; } } + + public async Task GetCustomerOrderAsync(Guid orderId, long telegramUserId, string telegramUsername, string displayName, string firstName, string lastName) + { + try + { + if (!await AuthenticateAsync()) + return null; + + // Get or create the customer to get customer ID + var customer = await _client.Customers.GetOrCreateCustomerAsync(new CreateCustomerRequest + { + TelegramUserId = telegramUserId, + TelegramUsername = telegramUsername, + TelegramDisplayName = displayName, + TelegramFirstName = firstName, + TelegramLastName = lastName, + AllowOrderUpdates = true, + AllowMarketing = false + }); + + if (!customer.IsSuccess || customer.Data == null) + { + return null; + } + + // Get the specific order using customer validation + var result = await _client.Orders.GetOrderByCustomerIdAsync(customer.Data.Id, orderId); + + if (result.IsSuccess && result.Data != null) + { + return result.Data; + } + + return null; + } + catch (Exception ex) + { + _logger.LogError(ex, "Error fetching customer order {OrderId}", orderId); + return null; + } + } public async Task CreatePaymentAsync(Guid orderId, string currency) {