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 System;
using System.Linq;
using AyCode.Core.Extensions;
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 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<AuctionBidRequest>());
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<AuctionBidRequest>(data.ToString());
//var b = (message.Data as JObject)?.ToObject<AuctionBidRequest>();
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<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);
_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}");
}
}
}

View File

@ -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; }
}
}