117 lines
4.8 KiB
C#
117 lines
4.8 KiB
C#
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;
|
|
using Nop.Services.Catalog;
|
|
using Newtonsoft.Json;
|
|
using Nop.Services.Logging;
|
|
using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities;
|
|
using Newtonsoft.Json.Serialization;
|
|
using Microsoft.AspNetCore.SignalR;
|
|
|
|
namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
|
|
{
|
|
public class SignalRMessageHandler
|
|
{
|
|
protected readonly ILogger _logger;
|
|
protected readonly IProductService _productService;
|
|
protected readonly AuctionService _auctionService;
|
|
private IHubContext<AuctionHub> _hubContext;
|
|
|
|
public SignalRMessageHandler(ILogger logger, IProductService productService, AuctionService auctionService, IHubContext<AuctionHub> hubContext)
|
|
{
|
|
_logger = logger;
|
|
_productService = productService;
|
|
_auctionService = auctionService;
|
|
_hubContext = hubContext;
|
|
}
|
|
|
|
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.ToString()?.JsonTo<AuctionBidRequest>());
|
|
break;
|
|
|
|
// Add other message types here
|
|
default:
|
|
await _logger.ErrorAsync("SignalRMessageHandler.HandleMessage(); Unknown message type");
|
|
break;
|
|
}
|
|
}
|
|
|
|
private async Task HandleBidRequest(AuctionBidRequest bidRequestMessage)
|
|
{
|
|
if (bidRequestMessage == null)
|
|
{
|
|
_logger.Error($"SignalRMessageHandler.HandleBidRequest(); bidRequestMessage == null");
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
await _logger.InformationAsync($"SignalRMessageHandler.HandleBidRequest(); Bid received: - Auction: {bidRequestMessage.AuctionId} Product: {bidRequestMessage.ProductId} - Bid: {bidRequestMessage.BidPrice} - Customer: {bidRequestMessage.CustomerId}");
|
|
|
|
var product = await _productService.GetProductByIdAsync(bidRequestMessage.ProductId);
|
|
if (product == null)
|
|
{
|
|
_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($"SignalRMessageHandler.HandleBidRequest(); MessageHandling error: {ex}");
|
|
}
|
|
}
|
|
}
|
|
}
|