diff --git a/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Controllers/AnnouncementController.cs b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Controllers/AnnouncementController.cs index 07400ef..0baf97b 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Controllers/AnnouncementController.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Controllers/AnnouncementController.cs @@ -17,6 +17,7 @@ using Nop.Web.Framework.Mvc; using Nop.Web.Framework.Mvc.Filters; using System; using System.Linq; +using AyCode.Core.Extensions; namespace Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Controllers { diff --git a/Nop.Plugin.Misc.AuctionPlugin/Hubs/SignalRMessageHandler.cs b/Nop.Plugin.Misc.AuctionPlugin/Hubs/SignalRMessageHandler.cs index d76f3b9..f539544 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Hubs/SignalRMessageHandler.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Hubs/SignalRMessageHandler.cs @@ -1,4 +1,6 @@ -using Nop.Plugin.Misc.AuctionPlugin.Hubs.Messages; +using System.Globalization; +using AyCode.Core.Extensions; +using Nop.Plugin.Misc.AuctionPlugin.Hubs.Messages; using Newtonsoft.Json.Linq; using Nop.Plugin.Misc.AuctionPlugin.Models; using Nop.Plugin.Misc.AuctionPlugin.Services; @@ -28,105 +30,86 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs public async Task HandleMessage(MessageWrapper message) { + if (message?.Data == null) + { + _logger.Error($"SignalRMessageHandler.HandleMessage(); message?.Data == null"); + return; + } + switch (message.MessageType) { //nameof(IAuctionHubClient.SendPrice) case "BidRequestMessage": - await HandleBidRequest(message.Data); + await HandleBidRequest(message.Data.ToString()?.JsonTo()); break; // Add other message types here default: - await _logger.ErrorAsync("Unknown message type"); + await _logger.ErrorAsync("SignalRMessageHandler.HandleMessage(); Unknown message type"); break; } } - private async Task HandleBidRequest(object data) + private async Task HandleBidRequest(AuctionBidRequest bidRequestMessage) { - AuctionBidRequest bidRequestMessage = new AuctionBidRequest(); - try + if (bidRequestMessage == null) { - var a = JsonConvert.DeserializeObject(data.ToString()); - //var b = (message.Data as JObject)?.ToObject(); - if (a == null) - { - await _logger.InformationAsync("Deserialization returned null. Message data might not match the expected structure."); - } - - bidRequestMessage = a; + _logger.Error($"SignalRMessageHandler.HandleBidRequest(); bidRequestMessage == null"); + return; } - catch (Exception ex) - { - await _logger.ErrorAsync("Error during deserialization of AuctionBidRequest", ex); - } - //AuctionBidRequest bidRequestMessage = new AuctionBidRequest(); try { + await _logger.InformationAsync($"SignalRMessageHandler.HandleBidRequest(); Bid received: - Auction: {bidRequestMessage.AuctionId} Product: {bidRequestMessage.ProductId} - Bid: {bidRequestMessage.BidPrice} - Customer: {bidRequestMessage.CustomerId}"); - if (bidRequestMessage != null) + var product = await _productService.GetProductByIdAsync(bidRequestMessage.ProductId); + if (product == null) { - await _logger.InformationAsync($"Bid received: - Auction:{bidRequestMessage.AuctionId} Product: {bidRequestMessage.ProductId} - Bid: {bidRequestMessage.BidPrice} - Customer: {bidRequestMessage.CustomerId}"); - //get product - - var product = await _productService.GetProductByIdAsync(Convert.ToInt32(bidRequestMessage.ProductId)); - - if (product != null) - { - //validate the bidprice amount - - - //set new price - product.Price = Convert.ToDecimal(bidRequestMessage.BidPrice); - - } - - List mapping = await _auctionService.GetProductToAuctionByAuctionIdAndProductIdAsync(Convert.ToInt32(bidRequestMessage.AuctionId), Convert.ToInt32(bidRequestMessage.ProductId)); - - - AuctionBid auctionBid = new AuctionBid(); - - auctionBid.ProductId = Convert.ToInt32(bidRequestMessage.ProductId); - auctionBid.CustomerId = Convert.ToInt32(bidRequestMessage.CustomerId); - auctionBid.BidPrice = Convert.ToDecimal(bidRequestMessage.BidPrice); - auctionBid.ProductAuctionMappingId = mapping.FirstOrDefault().Id; - - //save bid - try - { - await _auctionService.InsertBidAsync(auctionBid); - } - catch (Exception e) - { - _logger.Error($"MessageHandling InsertBidAsync error: {e.ToString()}"); - } - - //update product - - await _productService.UpdateProductAsync(product); - - // Optionally broadcast to all clients - var bid = new MessageWrapper - { - MessageType = "bidNotification", - Data = new BidNotificationMessage - { - ProductName = bidRequestMessage.ProductId, - BidPrice = bidRequestMessage.BidPrice, - NextStepAmount = "50000" - } - }; - var jsonMessage = JsonConvert.SerializeObject(bid, Formatting.Indented, - new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() } - ); - - await _hubContext.Clients.All.SendAsync("send", jsonMessage); + _logger.Error($"SignalRMessageHandler.HandleBidRequest(); product == null"); + return; //ha nincs product vagy exception van, akkor ne broadcast-eljük ki az invalid Bid-et! - J. } + + var mapping = await _auctionService.GetProductToAuctionByAuctionIdAndProductIdAsync(bidRequestMessage.AuctionId, bidRequestMessage.ProductId); + if (mapping == null || mapping.Count == 0) + { + _logger.Error($"SignalRMessageHandler.HandleBidRequest(); mapping == null || mapping.Count == 0"); + return; //ha nincs ProductToAuction, akkor ne broadcast-eljük ki az invalid Bid-et! - J. + } + + var auctionBid = bidRequestMessage.CreateMainEntity(); + auctionBid.ProductAuctionMappingId = mapping.FirstOrDefault()!.Id; + + //TODO: validate the bidprice amount + if (product.Price >= bidRequestMessage.BidPrice) + { + _logger.Warning($"SignalRMessageHandler.HandleBidRequest(); product.Price >= bidRequestMessage.BidPrice; productPrice: {product.Price}; bidRequestPrice: {bidRequestMessage.BidPrice}"); + return; + } + + //save bid + await _auctionService.InsertBidAsync(auctionBid); + + //set new price + product.Price = bidRequestMessage.BidPrice; + await _productService.UpdateProductAsync(product); + + // Optionally broadcast to all clients + var bid = new MessageWrapper + { + MessageType = "bidNotification", + Data = new BidNotificationMessage + { + ProductName = bidRequestMessage.ProductId.ToString(), + BidPrice = bidRequestMessage.BidPrice.ToString(CultureInfo.InvariantCulture), + NextStepAmount = "50000" + } + }; + + await _hubContext.Clients.All.SendAsync("send", bid.ToJson()); } catch (Exception ex) { - _logger.Error($"MessageHandling error: {ex.ToString()}"); + _logger.Error($"SignalRMessageHandler.HandleBidRequest(); MessageHandling error: {ex}"); } } } diff --git a/Nop.Plugin.Misc.AuctionPlugin/Models/AuctionBidRequest.cs b/Nop.Plugin.Misc.AuctionPlugin/Models/AuctionBidRequest.cs index 3c77d48..2bf41e8 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Models/AuctionBidRequest.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Models/AuctionBidRequest.cs @@ -3,15 +3,16 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos; namespace Nop.Plugin.Misc.AuctionPlugin.Models { - public class AuctionBidRequest + public class AuctionBidRequest : AuctionBidDto { - public string AuctionId { get; set; } - public string BidPrice { get; set; } - public string ProductId { get; set; } - public string CustomerId { get; set; } + public int AuctionId { get; set; } + //public string BidPrice { get; set; } + //public int ProductId { get; set; } + //public int CustomerId { get; set; } } }