diff --git a/Nop.Plugin.Misc.AuctionPlugin/Domains/DataLayer/ProductToAuctionDbTable.cs b/Nop.Plugin.Misc.AuctionPlugin/Domains/DataLayer/ProductToAuctionDbTable.cs index 0b6f864..2355dad 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Domains/DataLayer/ProductToAuctionDbTable.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Domains/DataLayer/ProductToAuctionDbTable.cs @@ -4,22 +4,33 @@ using Nop.Core.Configuration; using Nop.Core.Events; using Nop.Data; using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities; +using Nop.Plugin.Misc.AuctionPlugin.Domains.Enums; namespace Nop.Plugin.Misc.AuctionPlugin.Domains.DataLayer; -public class ProductToAuctionDbTable: MgDbTableBase +public class ProductToAuctionDbTable : MgDbTableBase { public ProductToAuctionDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings) : base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings) { } - public IQueryable GetByAuctionAndProductId(int auctionId, int productId) + private bool HasActiveAuctionStatus(AuctionStatus auctionStatus) { - return Table.Where(x => x.AuctionId == auctionId && x.ProductId == productId); + return auctionStatus.HasFlag(AuctionStatus.Active) || auctionStatus.HasFlag(AuctionStatus.FirstWarning) || auctionStatus.HasFlag(AuctionStatus.SecondWarning); } - public IQueryable GetByProductId(int productId) + public IQueryable GetByAuctionAndProductId(int auctionId, int productId, bool activeProductOnly = false) { - return Table.Where(x => x.ProductId == productId); + return GetProductToAuctionsByAuctionId(auctionId, activeProductOnly).Where(x => x.ProductId == productId); + } + + public IQueryable GetByProductId(int productId, bool activeProductOnly = false) + { + return Table.Where(x => x.ProductId == productId && (!activeProductOnly || HasActiveAuctionStatus(x.AuctionStatus))); + } + + public IQueryable GetProductToAuctionsByAuctionId(int auctionId, bool activeProductOnly = false) + { + return Table.Where(x => x.AuctionId == auctionId && (!activeProductOnly || HasActiveAuctionStatus(x.AuctionStatus))); } } \ No newline at end of file diff --git a/Nop.Plugin.Misc.AuctionPlugin/Hubs/Messages/AuctionProductStatusRequest.cs b/Nop.Plugin.Misc.AuctionPlugin/Hubs/Messages/AuctionProductStatusRequest.cs new file mode 100644 index 0000000..fd4c9b5 --- /dev/null +++ b/Nop.Plugin.Misc.AuctionPlugin/Hubs/Messages/AuctionProductStatusRequest.cs @@ -0,0 +1,11 @@ +using Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos; +using Nop.Plugin.Misc.AuctionPlugin.Domains.Enums; + +namespace Nop.Plugin.Misc.AuctionPlugin.Hubs.Messages +{ + public class AuctionProductStatusRequest// : AuctionBidDto + { + public int ProductToAuctionId { get; set; } + public AuctionStatus AuctionStatus { get; set; } + } +} diff --git a/Nop.Plugin.Misc.AuctionPlugin/Hubs/Messages/OpenItemRequest.cs b/Nop.Plugin.Misc.AuctionPlugin/Hubs/Messages/OpenItemRequest.cs deleted file mode 100644 index d62e82d..0000000 --- a/Nop.Plugin.Misc.AuctionPlugin/Hubs/Messages/OpenItemRequest.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -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 OpenItemRequest : AuctionBidDto - { - - } -} diff --git a/Nop.Plugin.Misc.AuctionPlugin/Hubs/SignalRMessageHandler.cs b/Nop.Plugin.Misc.AuctionPlugin/Hubs/SignalRMessageHandler.cs index faf8f2f..e21ace4 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Hubs/SignalRMessageHandler.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Hubs/SignalRMessageHandler.cs @@ -56,7 +56,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs break; case "OpenItemRequestMessage": - await HandleOpenItemMessageRequest(message.SenderId, message.Data.JsonTo()); + await HandleProductToAuctionStatusChangedRequest(message.SenderId, message.Data.JsonTo()); break; // Add other message types here @@ -66,28 +66,53 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Hubs } } - private async Task HandleOpenItemMessageRequest(int SenderId, OpenItemRequest openItemMessage) + private async Task HandleProductToAuctionStatusChangedRequest(int senderId, AuctionProductStatusRequest auctionProductStatusRequest) { - if (openItemMessage == null) + if (auctionProductStatusRequest == null) { - _logger.Error($"SignalRMessageHandler.HandleOpenItemMessageRequest(); openItemRequestMessage == null"); + _logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); auctionProductStatusRequest == null"); return; } try { - await _logger.InformationAsync($"SignalRMessageHandler.HandleOpenItemMessageRequest(); Item to open: - ProductToAuctionMappingId: {openItemMessage.ProductAuctionMappingId}"); - - //get auction - var auction = await _auctionService.GetAuctionDtoByProductToAuctionIdAsync(openItemMessage.ProductAuctionMappingId); - //get productToAuction - var productToAuction = await _auctionService.GetProductToAuctionDtoByIdAsync(openItemMessage.ProductAuctionMappingId); - - auction.Closed = false; + await _logger.InformationAsync($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); ProductToAuctionMappingId: {auctionProductStatusRequest.ProductToAuctionId}; Status: {auctionProductStatusRequest.AuctionStatus}({(int)auctionProductStatusRequest.AuctionStatus})"); - await _logger.InformationAsync($"SignalRMessageHandler.HandleOpenItemMessageRequest(); Auction {auction.Id}, ProducToAuction {productToAuction.Id}"); - //_auctionService.UpdateAuctionAsync(auction); + //TODO: if IsAdmin.. - J. + //TODO: if nincs aktív item.. - J. + var auction = await _auctionService.GetAuctionDtoByProductToAuctionIdAsync(auctionProductStatusRequest.ProductToAuctionId); + if (auction == null || auction.Closed) + { + _logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); auction == null || auction.Closed"); + return; + } + + var productToAuction = await _auctionService.GetProductToAuctionMappingByIdAsync(auctionProductStatusRequest.ProductToAuctionId); + if (productToAuction == null) + { + _logger.Error($"SignalRMessageHandler.HandleProductToAuctionStatusChangedRequest(); productToAuction == null"); + return; + } + + switch (auctionProductStatusRequest.AuctionStatus) + { + case AuctionStatus.FirstWarning: + productToAuction.AuctionStatus = AuctionStatus.Active | AuctionStatus.FirstWarning; + break; + case AuctionStatus.SecondWarning: + productToAuction.AuctionStatus = AuctionStatus.Active | AuctionStatus.SecondWarning; + break; + case AuctionStatus.None: + case AuctionStatus.Active: + case AuctionStatus.SoldOut: + case AuctionStatus.NotSold: + default: + auctionProductStatusRequest.AuctionStatus = auctionProductStatusRequest.AuctionStatus; + break; + } + + await _auctionService.UpdateProductToAuctionMappingAsync(productToAuction); } catch (Exception ex) { diff --git a/Nop.Plugin.Misc.AuctionPlugin/Services/AuctionService.cs b/Nop.Plugin.Misc.AuctionPlugin/Services/AuctionService.cs index 6528580..4995de8 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Services/AuctionService.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Services/AuctionService.cs @@ -91,7 +91,7 @@ public class AuctionService : IAuctionService /// A task that represents the asynchronous operation /// The task result contains the bids /// - public virtual async Task> GetAllBidsAsync(int customerId = 0, int pageIndex = 0, int pageSize = int.MaxValue) + public async Task> GetAllBidsAsync(int customerId = 0, int pageIndex = 0, int pageSize = int.MaxValue) { var rez = new List(); //var rez = await _shortTermCacheManager.GetAsync(async () => await _customerBidRepository.GetAllAsync(query => @@ -106,12 +106,12 @@ public class AuctionService : IAuctionService return new PagedList(rez, pageIndex, pageSize); } - public virtual async Task GetBidByIdAsync(int bidId) + public async Task GetBidByIdAsync(int bidId) { return await _ctx.AuctionBids.GetByIdAsync(bidId); } - public virtual async Task InsertBidAsync(AuctionBid auctionBid) + public async Task InsertBidAsync(AuctionBid auctionBid) { if (await ValidateAuctionBid(auctionBid)) { @@ -120,7 +120,7 @@ public class AuctionService : IAuctionService } } - public virtual async Task UpdateBidAsync(AuctionBid auctionBid) + public async Task UpdateBidAsync(AuctionBid auctionBid) { if (await ValidateAuctionBid(auctionBid)) { @@ -134,20 +134,20 @@ public class AuctionService : IAuctionService /// /// Pickup point /// A task that represents the asynchronous operation - public virtual async Task DeleteBidAsync(AuctionBid pickupPoint) + public async Task DeleteBidAsync(AuctionBid pickupPoint) { await _ctx.AuctionBids.DeleteAsync(pickupPoint, false); await _staticCacheManager.RemoveByPrefixAsync(AUCTION_PATTERN_KEY); } #region auctions - public virtual async Task InsertAuctionAsync(Auction auction) + public async Task InsertAuctionAsync(Auction auction) { await _ctx.Auctions.InsertAsync(auction, false); await _staticCacheManager.RemoveByPrefixAsync(AUCTION_PATTERN_KEY); } - public virtual async Task UpdateAuctionAsync(Auction auction) + public async Task UpdateAuctionAsync(Auction auction) { await _ctx.Auctions.UpdateAsync(auction); await _staticCacheManager.RemoveByPrefixAsync(AUCTION_PATTERN_KEY); @@ -160,8 +160,7 @@ public class AuctionService : IAuctionService public async Task> GetProductToAuctionsByAuctionIdAsync(int auctionId, bool onlyActiveItems = false) { - //return (await _ctx.Auctions.GetAllAsync(auctions => auctions.OrderByDescending(x => x.StartDateUtc), _ => default)).ToList(); - return []; + return await _ctx.ProductToAuctions.GetProductToAuctionsByAuctionId(auctionId, onlyActiveItems).ToListAsync(); } #endregion #endregion @@ -215,9 +214,7 @@ public class AuctionService : IAuctionService public async Task> GetProductToAuctionByAuctionIdAndProductIdAsync(int auctionId, int productId, bool activeProductOnly = false) { - return new List(await _ctx.ProductToAuctions.GetByAuctionAndProductId(auctionId, productId) - .Where(x => !activeProductOnly || (x.AuctionStatus == AuctionStatus.Active || x.AuctionStatus == AuctionStatus.FirstWarning || x.AuctionStatus == AuctionStatus.SecondWarning)) - .ToListAsync()); + return new List(await _ctx.ProductToAuctions.GetByAuctionAndProductId(auctionId, productId, activeProductOnly).ToListAsync()); } public async Task AssignProductToAuctionAsync(int productId, decimal startingPrice, decimal bidPrice, int auctionId) @@ -235,7 +232,7 @@ public class AuctionService : IAuctionService StartingPrice = startingPrice, BidPrice = bidPrice, ProductAmount = 0, - AuctionStatus = Domains.Enums.AuctionStatus.Active, //Ez miért Active alapból? - J. + AuctionStatus = AuctionStatus.Active, //TODO: Ez miért Active alapból? - J. AuctionId = auctionId }; @@ -251,7 +248,12 @@ public class AuctionService : IAuctionService return mapping; } - public virtual async Task UpdateProductToAuctionMappingAsync(ProductToAuctionMapping productToAuctionMapping) + public async Task GetProductToAuctionMappingByIdAsync(int productToAuctionMappingId) + { + return await _ctx.ProductToAuctions.GetByIdAsync(productToAuctionMappingId); + } + + public async Task UpdateProductToAuctionMappingAsync(ProductToAuctionMapping productToAuctionMapping) { await _ctx.ProductToAuctions.UpdateAsync(productToAuctionMapping); await _staticCacheManager.RemoveByPrefixAsync(AUCTION_PATTERN_KEY); diff --git a/Nop.Plugin.Misc.AuctionPlugin/Services/IAuctionService.cs b/Nop.Plugin.Misc.AuctionPlugin/Services/IAuctionService.cs index fe1a310..7aa2160 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Services/IAuctionService.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Services/IAuctionService.cs @@ -32,6 +32,7 @@ public interface IAuctionService Task DeleteBidAsync(AuctionBid pickupPoint); Task InsertAuctionAsync(Auction auction); + Task UpdateAuctionAsync(Auction auction); Task> GetAllAuctionsAsync(); @@ -50,4 +51,6 @@ public interface IAuctionService Task> GetProductToAuctionsByProductIdAsync(int productId); Task> GetProductToAuctionByAuctionIdAndProductIdAsync(int auctionId, int productId, bool activeProductOnly); + Task GetProductToAuctionMappingByIdAsync(int productToAuctionMappingId); + Task UpdateProductToAuctionMappingAsync(ProductToAuctionMapping productToAuctionMapping); } \ No newline at end of file