This commit is contained in:
Loretta 2024-11-19 17:32:54 +01:00
parent 992e4a6c40
commit 0f6d7006a7
3 changed files with 66 additions and 81 deletions

View File

@ -17,6 +17,7 @@ using Nop.Web.Framework.Mvc;
using Nop.Web.Framework.Mvc.Filters; using Nop.Web.Framework.Mvc.Filters;
using System; using System;
using System.Linq; using System.Linq;
using AyCode.Core.Extensions;
namespace Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Controllers namespace Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Controllers
{ {

View File

@ -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 Newtonsoft.Json.Linq;
using Nop.Plugin.Misc.AuctionPlugin.Models; using Nop.Plugin.Misc.AuctionPlugin.Models;
using Nop.Plugin.Misc.AuctionPlugin.Services; using Nop.Plugin.Misc.AuctionPlugin.Services;
@ -28,105 +30,86 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
public async Task HandleMessage(MessageWrapper message) public async Task HandleMessage(MessageWrapper message)
{ {
if (message?.Data == null)
{
_logger.Error($"SignalRMessageHandler.HandleMessage(); message?.Data == null");
return;
}
switch (message.MessageType) switch (message.MessageType)
{ {
//nameof(IAuctionHubClient.SendPrice) //nameof(IAuctionHubClient.SendPrice)
case "BidRequestMessage": case "BidRequestMessage":
await HandleBidRequest(message.Data); await HandleBidRequest(message.Data.ToString()?.JsonTo<AuctionBidRequest>());
break; break;
// Add other message types here // Add other message types here
default: default:
await _logger.ErrorAsync("Unknown message type"); await _logger.ErrorAsync("SignalRMessageHandler.HandleMessage(); Unknown message type");
break; break;
} }
} }
private async Task HandleBidRequest(object data) private async Task HandleBidRequest(AuctionBidRequest bidRequestMessage)
{ {
AuctionBidRequest bidRequestMessage = new AuctionBidRequest(); if (bidRequestMessage == null)
try
{ {
var a = JsonConvert.DeserializeObject<AuctionBidRequest>(data.ToString()); _logger.Error($"SignalRMessageHandler.HandleBidRequest(); bidRequestMessage == null");
//var b = (message.Data as JObject)?.ToObject<AuctionBidRequest>(); return;
if (a == null)
{
await _logger.InformationAsync("Deserialization returned null. Message data might not match the expected structure.");
}
bidRequestMessage = a;
} }
catch (Exception ex)
{
await _logger.ErrorAsync("Error during deserialization of AuctionBidRequest", ex);
}
//AuctionBidRequest bidRequestMessage = new AuctionBidRequest();
try 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}"); _logger.Error($"SignalRMessageHandler.HandleBidRequest(); product == null");
//get product return; //ha nincs product vagy exception van, akkor ne broadcast-eljük ki az invalid Bid-et! - J.
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<ProductToAuctionMapping> 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);
} }
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) catch (Exception ex)
{ {
_logger.Error($"MessageHandling error: {ex.ToString()}"); _logger.Error($"SignalRMessageHandler.HandleBidRequest(); MessageHandling error: {ex}");
} }
} }
} }

View File

@ -3,15 +3,16 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos;
namespace Nop.Plugin.Misc.AuctionPlugin.Models namespace Nop.Plugin.Misc.AuctionPlugin.Models
{ {
public class AuctionBidRequest public class AuctionBidRequest : AuctionBidDto
{ {
public string AuctionId { get; set; } public int AuctionId { get; set; }
public string BidPrice { get; set; } //public string BidPrice { get; set; }
public string ProductId { get; set; } //public int ProductId { get; set; }
public string CustomerId { get; set; } //public int CustomerId { get; set; }
} }
} }