From 5748ed4a09d99a458f018410f1901c4f86b14dee Mon Sep 17 00:00:00 2001 From: sysadmin Date: Wed, 27 Aug 2025 23:35:30 +0100 Subject: [PATCH] "Fix-order-details-for-customers" --- LittleShop.Client/Services/IOrderService.cs | 1 + LittleShop.Client/Services/OrderService.cs | 25 +++++++++++ LittleShop/Controllers/OrdersController.cs | 13 ++++++ LittleShop/Program.cs | 3 +- LittleShop/littleshop.db-shm | Bin 32768 -> 32768 bytes LittleShop/littleshop.db-wal | Bin 453232 -> 828152 bytes TeleBot/TeleBot/Handlers/CallbackHandler.cs | 37 ++++++++------- TeleBot/TeleBot/Services/LittleShopService.cs | 42 ++++++++++++++++++ 8 files changed, 103 insertions(+), 18 deletions(-) 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 f15ac3c07062184826f37e80fec6601d902e4a29..78eec8df44afcf8419121e0e5e8d820d7828024e 100644 GIT binary patch delta 735 zcmb7>OGuPa6vuz}-pNr~SbP>mi>RTEOs;~E9yBS4(ITQCXwgOr6v>{`%jPqCKg@5w zO0%?lRBD!E*WQ-d!uT54iFsd^GIG=xdUV_7i9%D=KVC7ufrW#q)^(BO|K=xqXZrs94Caom6s!Yxgf`D zcYIexmuMkIut>025D`q%yswV;BiE1Wf>kp6bYHZ!g3LZsdu6mKk1i|zTj-xO8N`bb&FyT=_SMR!d$^Oe FegUD1x6l9p delta 364 zcmZo@U}|V!s+V}A%K!qxK+MR%Adm;79f3GzHS7MuPtP^An6uZvNO=*E9bR^~@dbZ2 zsp^47fdRmn^!nrVFWT7m>C(e zHg9CU$T<0eJIm%x%xa9xObpqRH!?5Zyu?$F5h!wjaq}XdG}g(Rn5S)?7o-DH1QePT z0h62&t;G%&n>;B+1jrC$WM*N=1)I5fLOM)UUltQHQ1TZOvoM1rQ1Ukuvj~F|kfF}V sEXm*wR?aNS;0zX-yrCRo4YL@73q*}HgC~T+!C(zmym?J6*laaM0Odk@`Tzg` diff --git a/LittleShop/littleshop.db-wal b/LittleShop/littleshop.db-wal index df04f2369a47d09462e38d538b31f513f24ddfa2..de2c1acb6e90a7367e48666521d7679e89ddf57c 100644 GIT binary patch delta 18911 zcmeHP33yXg+D@7@O_$u$N^1u}2&H9Dx%cMg=B5gAv(eIh1$2bDZPPZ;Jt?JiiDeNS zH?TT!aA05*mmd^xi+~#gC?hi?=!oDlDl%?>A`XuKqvHRan}wup(zGLw{?B6}X_9+# z&iR(}e&>GQdwS*{qrTZs-?T!yB4&kbg?vTqlZw{QdhabsR<3{GtG4k6r)7H9+#@@R zR1A}&<+5pmK~HKax9Z85smg_8wl#A?&Yhk$_r`vOG$Ab{5{UvHk}0yq+dirNq=ePl zufJkZ%NP}W7DFUUJ>&y1{~@F|_HJJ|TE?5=d-q(I>E7**y(fv$<&bPPsbdU!L+^~k zqjVH}B{jIO@89d1x@K=?5AG`=?h6TuQJqt%lgx?p6CRHLIzCUiA?}MOdepDS8G5EA zTvAynQO1oJnKmLNMIteoBoed1!m?&gudz}TsbMSzlZH2$j2enFv$S5Tr%VPGrjzCV zZksI8+E5GsX4lu$RMphXt})fnB(2ksoQBq`X)4D*S(el5b>S}=Jl4l#?Qxl!dy3AQ z>sMAM;F%Nk5_A-8BaWk+iJj&nMg^`(*O0Xl9z=fu=V}k@2NBvah%?0)f+8F4Z~Ws@TApgc$Q~1CSIqv z7-`R@sAy(Dc;5L?mKl@mc=?S{av2{#u(Gk!V1LPhN5J>0 zt5U96zu@=l0u$VZj)JCV`lfg@ah#}!iSAULQtbtO{n0nkXw)DYYLbVM%fFMVpSpUp zbKM_L-gaReVkePC99Nyfqp9|KiWKrK-p)aNnX$wqS*6tNdQFz;DM*D5GG}fcvEY9{ zeM*NrNFeq|&Olh9gm^R#Nr?}LJx}bIwVCM6`|=VZ#P z2QCx4K%*q+JM7ECVUisT=`zy51`GD<6J%0Dpi%0%DgzG(k3xUOgfU`IG#0VOlA|OVYCKL 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 W{-?UVT?I5MN;S6cpTY?pkNQ8il})1n delta 21 ccmexy)ab(%>4p}@7N!>F7M2#)Eo=p^0B({A1^@s6 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) {