improvements, fixes, etc...
This commit is contained in:
parent
f1e022523e
commit
5c1c721d2e
|
|
@ -15,13 +15,35 @@ public class AuctionBidDbTable : MgDbTableBase<AuctionBid>
|
|||
{
|
||||
}
|
||||
|
||||
public Task<AuctionBid> GetLastAuctionBidByProductToAuctionIdAsync(int prouctToAuctionId)
|
||||
public IQueryable<AuctionBid> GetLastAuctionBidByProductToAuctionId(int productToAuctionId)
|
||||
=> GetByProductToAuctionId(productToAuctionId).OrderByDescending(x => x.Id);
|
||||
|
||||
public IQueryable<AuctionBid> GetByProductToAuctionId(int productToAuctionId)
|
||||
=> Table.Where(x => x.ProductAuctionMappingId == productToAuctionId);
|
||||
|
||||
public Task<bool> HasBidByProductToAuctionIdAsync(int productToAuctionId)
|
||||
{
|
||||
return Table.Where(x => x.ProductAuctionMappingId == prouctToAuctionId).OrderByDescending(x => x.Id).FirstOrDefaultAsync();
|
||||
return Table.AnyAsync(x => x.ProductAuctionMappingId == productToAuctionId);
|
||||
}
|
||||
|
||||
public IQueryable<AuctionBid> GetByProductToAuctionIdAsync(int prouctToAuctionId)
|
||||
public async Task<AuctionBid> RevertByProductToAuctionIdAsync(int productToAuctionId)
|
||||
{
|
||||
return Table.Where(x => x.ProductAuctionMappingId == prouctToAuctionId);
|
||||
var lastBid = await GetLastAuctionBidByProductToAuctionId(productToAuctionId).FirstOrDefaultAsync();
|
||||
if (lastBid == null)
|
||||
{
|
||||
await Logger.InformationAsync($"AuctionBidDbTable.RevertByProductToAuctionIdAsync(); (lastBid == null); productToAuction.Id: {productToAuctionId}");
|
||||
return null;
|
||||
}
|
||||
|
||||
await DeleteAsync(lastBid);
|
||||
return await GetLastAuctionBidByProductToAuctionId(productToAuctionId).FirstOrDefaultAsync();
|
||||
}
|
||||
|
||||
public async Task<int> DeleteAllByProductToAuctionIdAsync(int productToAuctionId)
|
||||
{
|
||||
var deletedBids = await DeleteAsync(x => x.ProductAuctionMappingId == productToAuctionId);
|
||||
await Logger.InformationAsync($"AuctionBidDbTable.DeleteAllByProductToAuctionIdAsync(); productToAuction.Id: {productToAuctionId}; deletedBids: {deletedBids}");
|
||||
|
||||
return deletedBids;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,14 +1,19 @@
|
|||
using Mango.Nop.Core.Repositories;
|
||||
using Nop.Core;
|
||||
using Nop.Core.Caching;
|
||||
using Nop.Data;
|
||||
using Nop.Plugin.Misc.AuctionPlugin.Domains.DataLayer.Interfaces;
|
||||
using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities;
|
||||
using Nop.Services.Catalog;
|
||||
using System;
|
||||
using Nop.Services.Logging;
|
||||
|
||||
namespace Nop.Plugin.Misc.AuctionPlugin.Domains.DataLayer;
|
||||
|
||||
public class AuctionDbContext : MgDbContextBase, IAuctionDbSet<AuctionDbTable>, IProductToAuctionDbSet<ProductToAuctionDbTable>, IAuctionBidDbSet<AuctionBidDbTable>
|
||||
{
|
||||
private readonly IProductService _productService;
|
||||
|
||||
public AuctionDbTable Auctions { get; set; }
|
||||
public ProductToAuctionDbTable ProductToAuctions { get; set; }
|
||||
public AuctionBidDbTable AuctionBids { get; set; }
|
||||
|
|
@ -18,8 +23,10 @@ public class AuctionDbContext : MgDbContextBase, IAuctionDbSet<AuctionDbTable>,
|
|||
//public IRepository<AuctionBid> AuctionBids2 { get; set; }
|
||||
|
||||
|
||||
public AuctionDbContext(INopDataProvider dataProvider, AuctionDbTable auctionDbTable, ProductToAuctionDbTable productToAuctionDbTable, AuctionBidDbTable auctionBidDbTable) : base(dataProvider)
|
||||
public AuctionDbContext(INopDataProvider dataProvider, AuctionDbTable auctionDbTable, ProductToAuctionDbTable productToAuctionDbTable, AuctionBidDbTable auctionBidDbTable, IProductService productService, ILogger logger) : base(dataProvider, logger)
|
||||
{
|
||||
_productService = productService;
|
||||
|
||||
Auctions = auctionDbTable;
|
||||
ProductToAuctions = productToAuctionDbTable;
|
||||
AuctionBids = auctionBidDbTable;
|
||||
|
|
@ -44,4 +51,42 @@ public class AuctionDbContext : MgDbContextBase, IAuctionDbSet<AuctionDbTable>,
|
|||
return [..await ProductToAuctions.GetByAuctionAndProductId(auctionId, productId, activeProductOnly).ToListAsync()];
|
||||
}
|
||||
|
||||
public Task<bool> HasBidByProductToAuctionIdAsync(int productToAuctionId)
|
||||
=> AuctionBids.HasBidByProductToAuctionIdAsync(productToAuctionId);
|
||||
|
||||
public Task<AuctionBid> GetLastAuctionBidByProductToAuctionId(int productToAuctionId)
|
||||
=> AuctionBids.GetLastAuctionBidByProductToAuctionId(productToAuctionId).FirstOrDefaultAsync();
|
||||
|
||||
public Task<AuctionBid> RevertAuctionBidByProductToAuctionId(int productToAuctionId)
|
||||
=> AuctionBids.RevertByProductToAuctionIdAsync(productToAuctionId);
|
||||
|
||||
public async Task ResetProductToAuctionByProductId(int productId)
|
||||
=> await ResetProductToAuctionAsync(await ProductToAuctions.GetByProductId(productId).FirstOrDefaultAsync());
|
||||
|
||||
public async Task ResetProductToAuctionByIdAsync(int productToAuctionId, decimal basePrice = 0)
|
||||
=> await ResetProductToAuctionAsync(ProductToAuctions.GetById(productToAuctionId), basePrice);
|
||||
|
||||
public async Task ResetProductToAuctionAsync(ProductToAuctionMapping productToAuction, decimal basePrice = 0)
|
||||
{
|
||||
if (productToAuction == null)
|
||||
{
|
||||
Logger.Error($"AuctionDbContext.ResetProductToAuctionAsync(); productToAuction == null");
|
||||
return;
|
||||
}
|
||||
|
||||
await Logger.InformationAsync($"AuctionDbContext.ResetProductToAuctionAsync(); productToAuction.Id: {productToAuction.Id}; basePrice: {basePrice}");
|
||||
|
||||
var product = await _productService.GetProductByIdAsync(productToAuction.ProductId);
|
||||
if (product == null)
|
||||
{
|
||||
Logger.Error($"AuctionDbContext.ResetProductToAuctionAsync(); product == null");
|
||||
return;
|
||||
}
|
||||
|
||||
if (basePrice <= 0) basePrice = product.Price;
|
||||
else product.Price = basePrice;
|
||||
|
||||
await ProductToAuctions.ResetAsync(productToAuction, basePrice);
|
||||
await AuctionBids.DeleteAllByProductToAuctionIdAsync(productToAuction.Id);
|
||||
}
|
||||
}
|
||||
|
|
@ -44,16 +44,18 @@ public class ProductToAuctionDbTable : MgDbTableBase<ProductToAuctionMapping>
|
|||
(!activeProductOnly || x.AuctionStatus == AuctionStatus.Active || x.AuctionStatus == AuctionStatus.FirstWarning || x.AuctionStatus == AuctionStatus.SecondWarning /*HasActiveAuctionStatus(x.AuctionStatus)*/));
|
||||
}
|
||||
|
||||
public async Task DeactivateItemByProductId(int productId, decimal basePrice) => await DeactivateItem(await GetByProductId(productId).FirstOrDefaultAsync(), basePrice);
|
||||
public async Task DeactivateItemById(int productToAuctionId, decimal basePrice) => await DeactivateItem(await GetByIdAsync(productToAuctionId), basePrice);
|
||||
public async Task DeactivateItem(ProductToAuctionMapping productToAuction, decimal basePrice)
|
||||
public async Task ResetByProductIdAsync(int productId, decimal basePrice) => await ResetAsync(await GetByProductId(productId).FirstOrDefaultAsync(), basePrice);
|
||||
public async Task ResetByIdAsync(int productToAuctionId, decimal basePrice) => await ResetAsync(await GetByIdAsync(productToAuctionId), basePrice);
|
||||
public async Task ResetAsync(ProductToAuctionMapping productToAuction, decimal basePrice)
|
||||
{
|
||||
if (productToAuction == null)
|
||||
{
|
||||
Logger.Error($"ProductToAuctionDbTable.DeactivateItem(); productToAuction == null");
|
||||
Logger.Error($"ProductToAuctionDbTable.ResetAsync(); productToAuction == null");
|
||||
return;
|
||||
}
|
||||
|
||||
await Logger.InformationAsync($"ProductToAuctionDbTable.ResetAsync(); productToAuction.Id: {productToAuction.Id}; basePrice: {basePrice}");
|
||||
|
||||
//TODO: ezt kivegyem egyelőre? amíg a Product.Price-t használjuk, addig nem sok értelme
|
||||
productToAuction.StartingPrice = basePrice;
|
||||
productToAuction.CurrentPrice = basePrice;
|
||||
|
|
|
|||
|
|
@ -1,23 +1,31 @@
|
|||
using Mango.Nop.Services;
|
||||
using DocumentFormat.OpenXml.Office2010.Drawing;
|
||||
using Mango.Nop.Services;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Nop.Core.Domain.Catalog;
|
||||
using Nop.Core.Events;
|
||||
using Nop.Plugin.Misc.AuctionPlugin.Domains.DataLayer;
|
||||
using Nop.Plugin.Misc.AuctionPlugin.Domains.Enums;
|
||||
using Nop.Services.Logging;
|
||||
|
||||
namespace Nop.Plugin.Misc.AuctionPlugin.Domains.EventConsumers;
|
||||
|
||||
public class AuctionEventConsumer(IHttpContextAccessor httpContextAccessor, AuctionDbContext ctx) : MgEventConsumer(httpContextAccessor)
|
||||
public class AuctionEventConsumer(IHttpContextAccessor httpContextAccessor, ILogger logger, AuctionDbContext ctx) : MgEventConsumer(httpContextAccessor, logger)
|
||||
{
|
||||
public override async Task HandleEventAsync(EntityUpdatedEvent<Product> eventMessage)
|
||||
{
|
||||
//TODO: itt lehetne ciklussal az összes ProductToAuction-re! - J.
|
||||
var productToAuction = await ctx.ProductToAuctions.GetByProductId(eventMessage.Entity.Id).FirstOrDefaultAsync();
|
||||
await Logger.InformationAsync($"AuctionEventConsumer.HandleEventAsync<Product>();");
|
||||
|
||||
//foreach
|
||||
if (productToAuction is { AuctionStatus: AuctionStatus.None })
|
||||
var productToAuctions = await ctx.ProductToAuctions.GetByProductId(eventMessage.Entity.Id).Where(x => x.AuctionStatus == AuctionStatus.None).ToListAsync();
|
||||
|
||||
foreach (var productToAuction in productToAuctions)
|
||||
{
|
||||
await ctx.ProductToAuctions.DeactivateItem(productToAuction, eventMessage.Entity.Price);
|
||||
if (await ctx.HasBidByProductToAuctionIdAsync(productToAuction.Id))
|
||||
{
|
||||
await Logger.InformationAsync($"AuctionEventConsumer.HandleEventAsync<Product>(); HasAuctionBids->continue");
|
||||
continue;
|
||||
}
|
||||
|
||||
await ctx.ProductToAuctions.ResetAsync(productToAuction, eventMessage.Entity.Price);
|
||||
}
|
||||
|
||||
await base.HandleEventAsync(eventMessage);
|
||||
|
|
|
|||
|
|
@ -1,11 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos;
|
||||
using Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos;
|
||||
|
||||
namespace Nop.Plugin.Misc.AuctionPlugin.Models
|
||||
namespace Nop.Plugin.Misc.AuctionPlugin.Hubs.Messages
|
||||
{
|
||||
public class AuctionBidRequest : AuctionBidDto
|
||||
{
|
||||
|
|
|
|||
|
|
@ -0,0 +1,6 @@
|
|||
namespace Nop.Plugin.Misc.AuctionPlugin.Hubs.Messages;
|
||||
|
||||
public class RevertAuctionBidRequest
|
||||
{
|
||||
public int ProductToAuctionId { get; set; }
|
||||
}
|
||||
|
|
@ -7,7 +7,12 @@ using Nop.Services.Catalog;
|
|||
using Nop.Services.Logging;
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
using Nop.Core;
|
||||
using Nop.Core.Domain.Catalog;
|
||||
using Nop.Plugin.Misc.AuctionPlugin.Domains.Enums;
|
||||
using Nop.Core.Domain.Customers;
|
||||
using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities;
|
||||
using Nop.Services.Customers;
|
||||
using DocumentFormat.OpenXml.Wordprocessing;
|
||||
|
||||
namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
|
||||
{
|
||||
|
|
@ -23,23 +28,25 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
|
|||
//- ha bid-elt 1x is, kerüljön a watch-ba
|
||||
//- DbTransaction-t vhogy megcsinánli!
|
||||
|
||||
public class SignalRMessageHandler(ILogger logger, IProductService productService, AuctionService auctionService, IHubContext<AuctionHub> hubContext, IWorkContext workContext)
|
||||
public class SignalRMessageHandler(ILogger logger, IProductService productService, AuctionService auctionService, IHubContext<AuctionHub> hubContext, IWorkContext workContext, ICustomerService customerService)
|
||||
{
|
||||
private readonly Mutex _handleMessageMutex = new();
|
||||
|
||||
public async Task HandleMessage(MessageWrapper message)
|
||||
{
|
||||
var customer = await workContext.GetCurrentCustomerAsync();
|
||||
|
||||
if (message?.Data == null)
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleMessage(); message?.Data == null");
|
||||
logger.Error($"SignalRMessageHandler.HandleMessage(); message?.Data == null", null, customer);
|
||||
return;
|
||||
}
|
||||
|
||||
await logger.InformationAsync($"SignalRMessageHandler.HandleMessage(); jsonData: {message.Data}");
|
||||
await logger.InformationAsync($"SignalRMessageHandler.HandleMessage(); jsonData: {message.Data}", null, customer);
|
||||
|
||||
if (message.SenderId <= 0 || message.SenderId != (await workContext.GetCurrentCustomerAsync()).Id)
|
||||
if (customer == null || message.SenderId <= 0 || message.SenderId != customer.Id || await customerService.IsGuestAsync(customer))
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleMessage(); message.SenderId <= 0 || message.SenderId != (await _workContext.GetCurrentCustomerAsync()).Id; SenderId: {message.SenderId}");
|
||||
logger.Error($"SignalRMessageHandler.HandleMessage(); (customer == null || message.SenderId <= 0 || message.SenderId != customer.Id || IsGuestAsync() == true)", null, customer);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -47,74 +54,118 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
|
|||
{
|
||||
try
|
||||
{
|
||||
switch (message.MessageType)
|
||||
if (message.MessageType == "BidRequestMessage") await HandleBidRequest(customer, message.Data.JsonTo<AuctionBidRequest>());
|
||||
else
|
||||
{
|
||||
case "BidRequestMessage":
|
||||
await HandleBidRequest(message.SenderId, message.Data.JsonTo<AuctionBidRequest>());
|
||||
break;
|
||||
if (!await customerService.IsAdminAsync(customer))
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); IsAdminAsync() == false!", null, customer);
|
||||
return;
|
||||
}
|
||||
|
||||
case "AuctionProductStatusRequest":
|
||||
await HandleProductToAuctionStatusChangedRequest(message.SenderId, message.Data.JsonTo<AuctionProductStatusRequest>());
|
||||
break;
|
||||
switch (message.MessageType)
|
||||
{
|
||||
case nameof(AuctionProductStatusRequest):
|
||||
await HandleProductToAuctionStatusChangedRequest(customer, message.Data.JsonTo<AuctionProductStatusRequest>());
|
||||
break;
|
||||
|
||||
// Add other message types here
|
||||
default:
|
||||
await logger.ErrorAsync($"SignalRMessageHandler.HandleMessage(); Unknown message type; MessageType: {message.MessageType}");
|
||||
break;
|
||||
case nameof(RevertAuctionBidRequest):
|
||||
await HandleRevertAuctionBidRequest(customer, message.Data.JsonTo<RevertAuctionBidRequest>());
|
||||
break;
|
||||
|
||||
default:
|
||||
// Add other message types here
|
||||
await logger.ErrorAsync($"SignalRMessageHandler.HandleMessage(); Unknown message type; MessageType: {message.MessageType}", null, customer);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleMessage(); switch (message.MessageType); MessageType: {message.MessageType}; ex: {ex}");
|
||||
logger.Error($"SignalRMessageHandler.HandleMessage(); switch (message.MessageType); MessageType: {message.MessageType}; Exception: {ex.Message}", ex, customer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task HandleProductToAuctionStatusChangedRequest(int senderId, AuctionProductStatusRequest auctionProductStatusRequest)
|
||||
private async Task HandleRevertAuctionBidRequest(Customer customer, RevertAuctionBidRequest revertAuctionBidRequest)
|
||||
{
|
||||
if (auctionProductStatusRequest == null)
|
||||
if (revertAuctionBidRequest == null)
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); auctionProductStatusRequest == null");
|
||||
logger.Error($"SignalRMessageHandler.HanldeRevertAuctionBidRequest(); auctionProductStatusRequest == null", null, customer);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
await logger.InformationAsync($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); ProductToAuctionMappingId: {auctionProductStatusRequest.ProductToAuctionId}; Status: {auctionProductStatusRequest.AuctionStatus}({(int)auctionProductStatusRequest.AuctionStatus})");
|
||||
var productToAuction = (await auctionService.GetProductToAuctionMappingByIdAsync(revertAuctionBidRequest.ProductToAuctionId));
|
||||
if (productToAuction is not { AuctionStatus: AuctionStatus.Pause })
|
||||
{
|
||||
logger.Warning($"SignalRMessageHandler.HandleBidRequest(); (productToAuction is not {{ AuctionStatus: AuctionStatus.Pause }}); AuctionStatus: {productToAuction?.AuctionStatus}", null, customer);
|
||||
return; //TODO: - J.
|
||||
}
|
||||
|
||||
//TODO: if IsAdmin.. - J.
|
||||
//productBidBoxViewModel.IsAdmin = await _customerService.IsAdminAsync(customer);
|
||||
//productBidBoxViewModel.IsGuest = await _customerService.IsGuestAsync(customer);
|
||||
var product = await auctionService.GetProductById(productToAuction.ProductId);
|
||||
if (product == null) return;
|
||||
|
||||
//TODO: if nincs aktív item.. - J.
|
||||
var revertLastBid = await auctionService.RevertAuctionBidByProductToAuctionIdAsync(productToAuction.Id);
|
||||
if (revertLastBid == null)
|
||||
{
|
||||
//TODO: NA ILYENKOR VAN A CUMI... - J.
|
||||
return;
|
||||
}
|
||||
|
||||
await SetAuctionBidPrice(revertLastBid.BidPrice, productToAuction, product);
|
||||
await SendAuctionBidMessageAsync(revertLastBid, productToAuction, product, customer.Id);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HanldeRevertAuctionBidRequest(); Exception: {ex.Message}", ex, customer);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task HandleProductToAuctionStatusChangedRequest(Customer customer, AuctionProductStatusRequest auctionProductStatusRequest)
|
||||
{
|
||||
if (auctionProductStatusRequest == null)
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); auctionProductStatusRequest == null", null, customer);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
await logger.InformationAsync($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); ProductToAuctionMappingId: {auctionProductStatusRequest.ProductToAuctionId}; Status: {auctionProductStatusRequest.AuctionStatus}({(int)auctionProductStatusRequest.AuctionStatus})", null, customer);
|
||||
|
||||
var auction = await auctionService.GetAuctionDtoByProductToAuctionIdAsync(auctionProductStatusRequest.ProductToAuctionId, false);
|
||||
if (auction == null || auction.Closed)
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); (auction == null || auction.Closed); Closed: {auction?.Closed}");
|
||||
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); (auction == null || auction.Closed); Closed: {auction?.Closed}", null, customer);
|
||||
return;
|
||||
}
|
||||
|
||||
var productToAuction = await auctionService.GetProductToAuctionMappingByIdAsync(auctionProductStatusRequest.ProductToAuctionId);
|
||||
if (productToAuction == null)
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); (productToAuction == null)");
|
||||
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); (productToAuction == null)", null, customer);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IsValidRequestAuctionStatus(auctionProductStatusRequest.AuctionStatus, productToAuction.AuctionStatus))
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); RequestAuctionStatusIsValid() == false; newStatus: {auctionProductStatusRequest.AuctionStatus}; oldStatus: {productToAuction.AuctionStatus}", null, customer);
|
||||
return;
|
||||
}
|
||||
|
||||
//TODO: mi van ha már lezárt a productToAuction? - J.
|
||||
if (auctionProductStatusRequest.AuctionStatus == AuctionStatus.None)
|
||||
{
|
||||
//TODO: a ProductPrice-t ne változtassuk, mert emiatt nem jó a reset! - J.
|
||||
productToAuction.AuctionStatus = AuctionStatus.None;
|
||||
await auctionService.DeactivateProductToAuctionAsync(productToAuction); //TODO: Reset legyen és ne deactivate! - J.
|
||||
await auctionService.ResetProductToAuctionAsync(productToAuction, productToAuction.StartingPrice);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (auctionProductStatusRequest.AuctionStatus)
|
||||
{
|
||||
case AuctionStatus.Pause:
|
||||
//TODO: Pause - J.
|
||||
case AuctionStatus.Pause:
|
||||
productToAuction.AuctionStatus = AuctionStatus.Pause;
|
||||
break;
|
||||
|
||||
case AuctionStatus.Sold:
|
||||
|
|
@ -126,11 +177,12 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
|
|||
}
|
||||
|
||||
productToAuction.AuctionStatus = AuctionStatus.Sold;
|
||||
productToAuction.CurrentPrice = lastAuctionBid.BidPrice;
|
||||
productToAuction.WinnerCustomerId = lastAuctionBid.CustomerId;
|
||||
break;
|
||||
|
||||
case AuctionStatus.NotSold:
|
||||
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); (auctionProductStatusRequest.AuctionStatus == AuctionStatus.NotSold)");
|
||||
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); (auctionProductStatusRequest.AuctionStatus == AuctionStatus.NotSold)", null, customer);
|
||||
break;
|
||||
|
||||
case AuctionStatus.FirstWarning:
|
||||
|
|
@ -147,7 +199,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
|
|||
var productToauctionChangedNotification = new MessageWrapper
|
||||
{
|
||||
MessageType = nameof(ProductToAuctionStatusNotification),
|
||||
SenderId = senderId,
|
||||
SenderId = customer.Id,
|
||||
Data = new ProductToAuctionStatusNotification(await auctionService.GetAuctionDtoByProductToAuctionIdAsync(productToAuction.Id, true))
|
||||
{
|
||||
ToasterMessage = "EMPTY", //TODO: - J.
|
||||
|
|
@ -158,52 +210,38 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); Error {ex.Message}");
|
||||
logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); Exception: {ex.Message}", ex, customer);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private async Task HandleBidRequest(int senderId, AuctionBidRequest bidRequestMessage)
|
||||
private async Task HandleBidRequest(Customer customer, AuctionBidRequest bidRequestMessage)
|
||||
{
|
||||
if (bidRequestMessage == null)
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleBidRequest(); (bidRequestMessage == null)");
|
||||
logger.Error($"SignalRMessageHandler.HandleBidRequest(); (bidRequestMessage == null)", null, customer);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
await logger.InformationAsync($"SignalRMessageHandler.HandleBidRequest(); Bid received; Auction: {bidRequestMessage.AuctionId}; Product: {bidRequestMessage.ProductId}; Bid: {bidRequestMessage.BidPrice}; Customer: {bidRequestMessage.CustomerId}");
|
||||
|
||||
//CustomerService a = new CustomerService()a.IsGuestAsync() //TODO: IsGuestAsync??? - J.
|
||||
|
||||
var customer = await workContext.GetCurrentCustomerAsync();
|
||||
if (customer == null || bidRequestMessage.CustomerId != customer.Id) //|| !customer.Active)
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleBidRequest(); (customer == null || bidRequestMessage.CustomerId != customer.Id)");
|
||||
return;
|
||||
}
|
||||
await logger.InformationAsync($"SignalRMessageHandler.HandleBidRequest(); Bid received; Auction: {bidRequestMessage.AuctionId}; ProductToAuction: {bidRequestMessage.ProductAuctionMappingId}; Product: {bidRequestMessage.ProductId}; Bid: {bidRequestMessage.BidPrice}; Customer: {bidRequestMessage.CustomerId}", null, customer);
|
||||
|
||||
var auction = await auctionService.GetAuctionDtoByIdAsync(bidRequestMessage.AuctionId, false, false);
|
||||
if (auction == null || auction.Closed)
|
||||
{
|
||||
logger.Warning($"SignalRMessageHandler.HandleBidRequest(); (auction == null || auction.Closed); Closed: {auction?.Closed}");
|
||||
logger.Warning($"SignalRMessageHandler.HandleBidRequest(); (auction == null || auction.Closed); Closed: {auction?.Closed}", null, customer);
|
||||
return;
|
||||
}
|
||||
|
||||
var activeProductAuction = (await auctionService.GetProductToAuctionByAuctionIdAndProductIdAsync(bidRequestMessage.AuctionId, bidRequestMessage.ProductId, true)).FirstOrDefault();
|
||||
if (activeProductAuction is not { IsActiveItem: true } || activeProductAuction.WinnerCustomerId == customer.Id)
|
||||
{
|
||||
logger.Warning($"SignalRMessageHandler.HandleBidRequest(); (activeProductAuction is not {{ IsActiveItem: true }} || activeProductAuction.WinnerCustomerId == customer.Id); AuctionStatus: {activeProductAuction?.AuctionStatus}; WinnerCustomerId: {activeProductAuction?.WinnerCustomerId}");
|
||||
logger.Warning($"SignalRMessageHandler.HandleBidRequest(); (activeProductAuction is not {{ IsActiveItem: true }} || activeProductAuction.WinnerCustomerId == customer.Id); AuctionStatus: {activeProductAuction?.AuctionStatus}; WinnerCustomerId: {activeProductAuction?.WinnerCustomerId}", null, customer);
|
||||
return; //TODO: - J.
|
||||
}
|
||||
|
||||
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 product = await auctionService.GetProductById(bidRequestMessage.ProductId);
|
||||
if (product == null) return;
|
||||
|
||||
var auctionBid = bidRequestMessage.CreateMainEntity();
|
||||
auctionBid.ProductAuctionMappingId = activeProductAuction.Id;
|
||||
|
|
@ -211,45 +249,85 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs
|
|||
//TODO: validate the bidprice amount
|
||||
if (product.Price >= auctionBid.BidPrice || activeProductAuction.CurrentPrice >= auctionBid.BidPrice)
|
||||
{
|
||||
logger.Warning($"SignalRMessageHandler.HandleBidRequest(); (product.Price >= bidRequestMessage.BidPrice || activeProductAuction.CurrentPrice >= auctionBid.BidPrice); productPrice: {product.Price}; bidRequestPrice: {auctionBid.BidPrice}; activeProductAuctionPrice: {activeProductAuction.CurrentPrice}");
|
||||
logger.Warning($"SignalRMessageHandler.HandleBidRequest(); (product.Price >= bidRequestMessage.BidPrice || activeProductAuction.CurrentPrice >= auctionBid.BidPrice); productPrice: {product.Price}; bidRequestPrice: {auctionBid.BidPrice}; activeProductAuctionPrice: {activeProductAuction.CurrentPrice}", null, customer);
|
||||
return;
|
||||
}
|
||||
|
||||
//save bid
|
||||
await auctionService.InsertBidAsync(auctionBid);
|
||||
|
||||
//set new price
|
||||
product.Price = bidRequestMessage.BidPrice;
|
||||
await productService.UpdateProductAsync(product);
|
||||
|
||||
activeProductAuction.StartingPrice = product.OldPrice;
|
||||
activeProductAuction.CurrentPrice = product.Price;
|
||||
activeProductAuction.AuctionStatus = AuctionStatus.Active;
|
||||
|
||||
await auctionService.UpdateProductToAuctionMappingAsync(activeProductAuction);
|
||||
|
||||
var stepAmount = AuctionService.GetStepAmount(auctionBid.BidPrice);
|
||||
var nextBidPrice = auctionBid.BidPrice + stepAmount;
|
||||
|
||||
var bid = new MessageWrapper
|
||||
{
|
||||
MessageType = "bidNotification",
|
||||
SenderId = senderId,
|
||||
Data = new BidNotificationMessage(await auctionService.GetAuctionDtoByProductToAuctionIdAsync(activeProductAuction.Id, true))
|
||||
{
|
||||
ProductName = auctionBid.ProductId.ToString(),
|
||||
CurrentPrice = auctionBid.BidPrice,
|
||||
NextStepAmount = stepAmount,
|
||||
NextBidPrice = nextBidPrice,
|
||||
ToasterMessage = "EMPTY", //TODO: - J.
|
||||
}.ToJson()
|
||||
};
|
||||
|
||||
await hubContext.Clients.All.SendAsync("send", bid.ToJson());
|
||||
if (!await SetAuctionBidPrice(bidRequestMessage.BidPrice, activeProductAuction, product)) return;
|
||||
|
||||
await SendAuctionBidMessageAsync(auctionBid, activeProductAuction, product, customer.Id);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleBidRequest(); MessageHandling error: {ex}");
|
||||
logger.Error($"SignalRMessageHandler.HandleBidRequest(); Exception: {ex.Message}", ex, customer);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task SendAuctionBidMessageAsync(AuctionBid auctionBid, ProductToAuctionMapping productToAuction, Product product, int customerId)
|
||||
{
|
||||
var stepAmount = AuctionService.GetStepAmount(auctionBid.BidPrice);
|
||||
var nextBidPrice = auctionBid.BidPrice + stepAmount;
|
||||
|
||||
var bidMessage = new MessageWrapper
|
||||
{
|
||||
MessageType = "bidNotification",
|
||||
SenderId = customerId,
|
||||
Data = new BidNotificationMessage(await auctionService.GetAuctionDtoByProductToAuctionIdAsync(productToAuction.Id, true)) //TODO: NE KÉRJÜK LE DB-BŐL!!! - j.
|
||||
{
|
||||
ProductName = product.Name,
|
||||
CurrentPrice = auctionBid.BidPrice,
|
||||
NextStepAmount = stepAmount,
|
||||
NextBidPrice = nextBidPrice,
|
||||
ToasterMessage = "EMPTY", //TODO: - J.
|
||||
}.ToJson()
|
||||
};
|
||||
|
||||
await hubContext.Clients.All.SendAsync("send", bidMessage.ToJson());
|
||||
}
|
||||
|
||||
private async Task<bool> SetAuctionBidPrice(decimal bidPrice, ProductToAuctionMapping productToAuction, Product product)
|
||||
{
|
||||
try
|
||||
{
|
||||
product.Price = bidPrice;
|
||||
await productService.UpdateProductAsync(product);
|
||||
|
||||
//activeProductAuction.StartingPrice = product.OldPrice; //TODO: ez biztosan kezelve van mikor összerendeljük? - J.
|
||||
productToAuction.CurrentPrice = product.Price;
|
||||
await auctionService.UpdateProductToAuctionMappingAsync(productToAuction);
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.Error($"SignalRMessageHandler.HandleBidRequest(); SetAuctionBidPrice() == false", ex);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool IsValidRequestAuctionStatus(AuctionStatus newStatus, AuctionStatus oldStatus)
|
||||
{
|
||||
switch (oldStatus)
|
||||
{
|
||||
case AuctionStatus.None:
|
||||
return newStatus == AuctionStatus.Active;
|
||||
case AuctionStatus.Active:
|
||||
return newStatus is AuctionStatus.None or AuctionStatus.FirstWarning or AuctionStatus.Pause;
|
||||
case AuctionStatus.FirstWarning:
|
||||
return newStatus is AuctionStatus.None or AuctionStatus.SecondWarning or AuctionStatus.Pause;
|
||||
case AuctionStatus.SecondWarning:
|
||||
return newStatus is AuctionStatus.None or AuctionStatus.Sold or AuctionStatus.Pause;
|
||||
case AuctionStatus.Pause:
|
||||
return newStatus is AuctionStatus.None or AuctionStatus.Active;
|
||||
case AuctionStatus.Sold:
|
||||
case AuctionStatus.NotSold:
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
using Nop.Core;
|
||||
using Nop.Core.Caching;
|
||||
using Nop.Core.Domain.Catalog;
|
||||
using Nop.Core.Domain.Customers;
|
||||
using Nop.Plugin.Misc.AuctionPlugin.Domains.DataLayer;
|
||||
using Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos;
|
||||
using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities;
|
||||
using Nop.Plugin.Misc.AuctionPlugin.Domains.Enums;
|
||||
using Nop.Plugin.Misc.AuctionPlugin.Hubs.Messages;
|
||||
using Nop.Services.Catalog;
|
||||
using Nop.Services.Logging;
|
||||
using Org.BouncyCastle.Crypto;
|
||||
|
|
@ -52,6 +54,7 @@ public class AuctionService : IAuctionService
|
|||
public AuctionService(
|
||||
AuctionDbContext ctx,
|
||||
IProductService productService,
|
||||
|
||||
//IRepository<Auction> auctionRepository,
|
||||
//IRepository<ProductToAuctionMapping> productToAuctionRepository,
|
||||
IShortTermCacheManager shortTermCacheManager,
|
||||
|
|
@ -124,27 +127,31 @@ public class AuctionService : IAuctionService
|
|||
return true;
|
||||
}
|
||||
|
||||
public async Task DeactivateProductToAuctionByProductId(int productId)
|
||||
=> await DeactivateProductToAuctionAsync(await _ctx.ProductToAuctions.GetByProductId(productId).FirstOrDefaultAsync());
|
||||
public async Task ResetProductToAuctionByProductId(int productId)
|
||||
=> await ResetProductToAuctionAsync(await _ctx.ProductToAuctions.GetByProductId(productId).FirstOrDefaultAsync());
|
||||
|
||||
public async Task DeactivateProductToAuctionByIdAsync(int productToAuctionId, decimal basePrice = 0)
|
||||
=> await DeactivateProductToAuctionAsync(_ctx.ProductToAuctions.GetById(productToAuctionId), basePrice);
|
||||
public Task ResetProductToAuctionByIdAsync(int productToAuctionId, decimal basePrice = 0)
|
||||
=> ResetProductToAuctionAsync(_ctx.ProductToAuctions.GetById(productToAuctionId), basePrice);
|
||||
|
||||
public async Task DeactivateProductToAuctionAsync(ProductToAuctionMapping productToAuction, decimal basePrice = 0)
|
||||
public Task ResetProductToAuctionAsync(ProductToAuctionMapping productToAuction, decimal basePrice = 0)
|
||||
=> _ctx.ResetProductToAuctionAsync(productToAuction, basePrice);
|
||||
|
||||
public Task<AuctionBid> GetLastAuctionBidByProductToAuctionIdAsync(int productToAuctionId)
|
||||
=> _ctx.GetLastAuctionBidByProductToAuctionId(productToAuctionId);
|
||||
|
||||
public Task<AuctionBid> RevertAuctionBidByProductToAuctionIdAsync(int productToAuctionId)
|
||||
=> _ctx.RevertAuctionBidByProductToAuctionId(productToAuctionId);
|
||||
|
||||
public async Task<Product> GetProductById(int productId)
|
||||
{
|
||||
if (basePrice <= 0)
|
||||
{
|
||||
var product = await _productService.GetProductByIdAsync(productToAuction.ProductId);
|
||||
var product = await _productService.GetProductByIdAsync(productId);
|
||||
if (product != null) return product;
|
||||
|
||||
if (product == null) _logger.Error($"AuctionService.DeactivateProductToAuctionByIdAsync(); product == null");
|
||||
else basePrice = product.Price;
|
||||
}
|
||||
_logger.Error($"AuctionService.GetProductById(); (product == null)", null, await _workContext.GetCurrentCustomerAsync());
|
||||
return null;
|
||||
|
||||
await _ctx.ProductToAuctions.DeactivateItem(productToAuction, basePrice);
|
||||
}
|
||||
|
||||
public Task<AuctionBid> GetLastAuctionBidByProductToAuctionIdAsync(int productToAuctionId) => _ctx.AuctionBids.GetLastAuctionBidByProductToAuctionIdAsync(productToAuctionId);
|
||||
|
||||
/// <summary>
|
||||
/// Gets all bids
|
||||
/// </summary>
|
||||
|
|
@ -240,7 +247,7 @@ public class AuctionService : IAuctionService
|
|||
|
||||
foreach (var auctionDtoProductToAuctionDto in auctionDto.ProductToAuctionDtos)
|
||||
{
|
||||
auctionDtoProductToAuctionDto.AuctionBidDtos.AddRange(await _ctx.AuctionBids.GetByProductToAuctionIdAsync(auctionDtoProductToAuctionDto.Id).OrderByDescending(x => x.Id).Select(x => new AuctionBidDto(x)).ToListAsync());
|
||||
auctionDtoProductToAuctionDto.AuctionBidDtos.AddRange(await _ctx.AuctionBids.GetByProductToAuctionId(auctionDtoProductToAuctionDto.Id).OrderByDescending(x => x.Id).Select(x => new AuctionBidDto(x)).ToListAsync());
|
||||
}
|
||||
|
||||
return auctionDto;
|
||||
|
|
|
|||
|
|
@ -148,7 +148,7 @@
|
|||
document.getElementById("signalRCloseItemButton").disabled = true;
|
||||
event.preventDefault();
|
||||
|
||||
handleAuctionStatusChange(AuctionStatus.Sold); //Itt SoldOut volt, átírtam Sold-ra! - J.
|
||||
handleAuctionStatusChange(AuctionStatus.None); //Itt SoldOut volt, átírtam Sold-ra! - J.
|
||||
|
||||
return false;
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in New Issue