diff --git a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs new file mode 100644 index 0000000..4235e88 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs @@ -0,0 +1,26 @@ +using AyCode.Core.Loggers; +using AyCode.Services.SignalRs; +using FruitBank.Common.Interfaces; +using FruitBank.Common.Loggers; +using FruitBank.Common.Models; +using FruitBank.Common.SignalRs; +using Microsoft.AspNetCore.Mvc; +using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers +{ + public class FruitBankDataController(FruitBankDbContext ctx, IEnumerable logWriters): Controller, IFruitBankDataControllerServer + { + private readonly ILogger _logger = new Logger(logWriters.ToArray()); + + + [SignalR(SignalRTags.GetMeasuringModel)] + public async Task GetMeasuringModel() + { + _logger.Detail($"GetMeasuringModel invoked"); + + var partner = await ctx.Partners.Table.FirstOrDefaultAsync(); + return new MeasuringModel($"GetMeasuringModel invoked [{DateTime.Now}] [{partner?.Name}]"); + } + } +} diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs new file mode 100644 index 0000000..d1cb3a8 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs @@ -0,0 +1,101 @@ +using Mango.Nop.Core.Repositories; +using Nop.Core.Caching; +using Nop.Data; +using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer.Interfaces; +using Nop.Services.Catalog; +using Nop.Services.Logging; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; + +public class FruitBankDbContext : MgDbContextBase, IPartnerDbSet +{ + private readonly IProductService _productService; + private readonly IStaticCacheManager _staticCacheManager; + + public PartnerDbTable Partners { get; set; } + //public EntityRepository Auctions2 { get; set; } + //public IRepository AuctionBids2 { get; set; } + + + public FruitBankDbContext(INopDataProvider dataProvider, PartnerDbTable partnerDbTable, IProductService productService, IStaticCacheManager staticCacheManager, ILogger logger) : base(dataProvider, logger) + { + _productService = productService; + _staticCacheManager = staticCacheManager; + + Partners = partnerDbTable; + + //Auctions.Table + //var auctions = DataProvider.GetTable().Where(x => x.Closed); + } + + ////public AuctionDbContext(IRepository _auctionRepository, IRepository _auctionBidRepository) + ////{ + //// Auctions2 = _auctionRepository as EntityRepository; + //// AuctionBids2 = _auctionBidRepository; + ////} + + //public Task> GetAllLastBidByAuctionIdAsync(int auctionId) => AuctionBids.GetAllLastBidByAuctionId(auctionId).ToListAsync(); + + //public Task> GetAllLastBidDictionaryByAuctionIdAsync(int auctionId) + // => AuctionBids.GetAllLastBidByAuctionId(auctionId).ToDictionaryAsync(x => x.ProductAuctionMappingId); + + //public async Task> GetProductToAuctionsByProductIdAsync(int productId) + //{ + // return [..await ProductToAuctions.GetByProductId(productId).ToListAsync()]; + //} + + //public async Task> GetProductToAuctionByAuctionIdAndProductIdAsync(int auctionId, int productId, bool activeProductOnly) + //{ + // return [..await ProductToAuctions.GetByAuctionAndProductId(auctionId, productId, activeProductOnly).ToListAsync()]; + //} + + //public Task HasBidByProductToAuctionIdAsync(int productToAuctionId) + // => AuctionBids.HasBidByProductToAuctionIdAsync(productToAuctionId); + + //public Task GetLastAuctionBidByProductToAuctionId(int productToAuctionId) + // => AuctionBids.GetLastAuctionBidByProductToAuctionId(productToAuctionId).FirstOrDefaultAsync(); + + //public Task GetBidsCountByProductToAuctionIdAsync(int productToAuctionId) + // => AuctionBids.GetBidsCountByProductToAuctionIdAsync(productToAuctionId); + + + //public Task 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 _productService.UpdateProductAsync(product); + // } + + // await ProductToAuctions.ResetAsync(productToAuction, basePrice); + // await AuctionBids.DeleteAllByProductToAuctionIdAsync(productToAuction.Id); + + // await _staticCacheManager.ClearAsync(); + // //await _staticCacheManager.RemoveByPrefixAsync(AUCTION_PATTERN_KEY); + //} +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/Interfaces/IPartnerDbSet.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/Interfaces/IPartnerDbSet.cs new file mode 100644 index 0000000..263a4bf --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/Interfaces/IPartnerDbSet.cs @@ -0,0 +1,10 @@ +using Mango.Nop.Core.Interfaces; +using Nop.Data; +using Nop.Plugin.Misc.FruitBankPlugin.Domains.Entities; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer.Interfaces; + +public interface IPartnerDbSet : IMgDbTableBase where TDbTable : IRepository +{ + public TDbTable Partners { get; set; } +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/PartnerDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/PartnerDbTable.cs new file mode 100644 index 0000000..229415d --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/PartnerDbTable.cs @@ -0,0 +1,63 @@ +using Mango.Nop.Core.Repositories; +using Nop.Core.Caching; +using Nop.Core.Configuration; +using Nop.Core.Events; +using Nop.Data; +using Nop.Plugin.Misc.FruitBankPlugin.Domains.Entities; +using Nop.Services.Logging; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; + +public class PartnerDbTable : MgDbTableBase +{ + public PartnerDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger) + : base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger) + { + } + + //public IOrderedQueryable GetAllLastBidByAuctionId(int auctionId) + //{ + // return GetAllByAuctionId(auctionId) + // .OrderByDescending(x => x.Id) + // .GroupBy(x => x.AuctionId, (_, bids) => bids.FirstOrDefault()) + // .OrderByDescending(percentGroup => percentGroup.Id); + //} + + //public IOrderedQueryable GetLastAuctionBidByProductToAuctionId(int productToAuctionId) + // => GetAllByProductToAuctionId(productToAuctionId).OrderByDescending(x => x.Id); + + //public Task GetBidsCountByProductToAuctionIdAsync(int productToAuctionId) + // => Table.CountAsync(x => x.ProductAuctionMappingId == productToAuctionId); + + //public IQueryable GetAllByAuctionId(int auctionId) + // => Table.Where(x => x.AuctionId == auctionId); + + //public IQueryable GetAllByProductToAuctionId(int productToAuctionId) + // => Table.Where(x => x.ProductAuctionMappingId == productToAuctionId); + + //public Task HasBidByProductToAuctionIdAsync(int productToAuctionId) + //{ + // return Table.AnyAsync(x => x.ProductAuctionMappingId == productToAuctionId); + //} + + //public async Task RevertByProductToAuctionIdAsync(int productToAuctionId) + //{ + // 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 DeleteAllByProductToAuctionIdAsync(int productToAuctionId) + //{ + // var deletedBids = await DeleteAsync(x => x.ProductAuctionMappingId == productToAuctionId); + // await Logger.InformationAsync($"AuctionBidDbTable.DeleteAllByProductToAuctionIdAsync(); productToAuction.Id: {productToAuctionId}; deletedBids: {deletedBids}"); + + // return deletedBids; + //} +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/Partner.cs b/Nop.Plugin.Misc.AIPlugin/Domains/Entities/Partner.cs similarity index 78% rename from Nop.Plugin.Misc.AIPlugin/Domains/Partner.cs rename to Nop.Plugin.Misc.AIPlugin/Domains/Entities/Partner.cs index c314a07..637f194 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/Partner.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/Entities/Partner.cs @@ -1,8 +1,10 @@ using FruitBank.Common.Entities; +using LinqToDB.Mapping; using Mango.Nop.Core.Entities; -namespace Nop.Plugin.Misc.FruitBankPlugin.Domains; +namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.Entities; +[Table(Name = "fbPartner")] public class Partner : MgEntityBase, IPartner { public int Id { get; set; } @@ -14,6 +16,7 @@ public class Partner : MgEntityBase, IPartner public string City { get; set; } public string Street { get; set; } + [SkipValuesOnUpdate] public DateTime Created { get; set; } public DateTime Modified { get; set; } } \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/Shipping.cs b/Nop.Plugin.Misc.AIPlugin/Domains/Entities/Shipping.cs similarity index 72% rename from Nop.Plugin.Misc.AIPlugin/Domains/Shipping.cs rename to Nop.Plugin.Misc.AIPlugin/Domains/Entities/Shipping.cs index e29b8eb..579efe8 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/Shipping.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/Entities/Shipping.cs @@ -1,8 +1,10 @@ using FruitBank.Common.Entities; +using LinqToDB.Mapping; using Mango.Nop.Core.Entities; -namespace Nop.Plugin.Misc.FruitBankPlugin.Domains; +namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.Entities; +[Table(Name = "fbShipping")] public class Shipping : MgEntityBase, IShipping { public int Id { get; set; } @@ -10,6 +12,7 @@ public class Shipping : MgEntityBase, IShipping public DateTime ShippingDate { get; set; } public string LicencePlate { get; set; } + [SkipValuesOnUpdate] public DateTime Created { get; set; } public DateTime Modified { get; set; } } \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/SippingDocument.cs b/Nop.Plugin.Misc.AIPlugin/Domains/Entities/ShippingDocument.cs similarity index 65% rename from Nop.Plugin.Misc.AIPlugin/Domains/SippingDocument.cs rename to Nop.Plugin.Misc.AIPlugin/Domains/Entities/ShippingDocument.cs index ae925fe..ec2f612 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/SippingDocument.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/Entities/ShippingDocument.cs @@ -1,9 +1,11 @@ using FruitBank.Common.Entities; +using LinqToDB.Mapping; using Mango.Nop.Core.Entities; -namespace Nop.Plugin.Misc.FruitBankPlugin.Domains; +namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.Entities; -public class SippingDocument : MgEntityBase, ISippingDocument +[Table(Name = "fbShippingDocument")] +public class ShippingDocument : MgEntityBase, ISippingDocument { public int Id { get; set; } public int PartnerId { get; set; } @@ -12,6 +14,7 @@ public class SippingDocument : MgEntityBase, ISippingDocument public DateTime ShippingDate { get; set; } public string Country { get; set; } + [SkipValuesOnUpdate] public DateTime Created { get; set; } public DateTime Modified { get; set; } } \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/ShippingItem.cs b/Nop.Plugin.Misc.AIPlugin/Domains/Entities/ShippingItem.cs similarity index 78% rename from Nop.Plugin.Misc.AIPlugin/Domains/ShippingItem.cs rename to Nop.Plugin.Misc.AIPlugin/Domains/Entities/ShippingItem.cs index 5963a8d..d67a51a 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/ShippingItem.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/Entities/ShippingItem.cs @@ -1,8 +1,10 @@ using FruitBank.Common.Entities; +using LinqToDB.Mapping; using Mango.Nop.Core.Entities; -namespace Nop.Plugin.Misc.FruitBankPlugin.Domains; +namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.Entities; +[Table(Name = "fbShippingItem")] public class ShippingItem : MgEntityBase, IShippingItem { public int Id { get; set; } @@ -13,6 +15,7 @@ public class ShippingItem : MgEntityBase, IShippingItem public double MeasuredNetWeight { get; set; } public double MeasuredGrossWeight { get; set; } + [SkipValuesOnUpdate] public DateTime Created { get; set; } public DateTime Modified { get; set; } } \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs b/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs index ff93cee..ab776cd 100644 --- a/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs +++ b/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs @@ -2,7 +2,7 @@ using AyCode.Core.Loggers; using FruitBank.Common; -using FruitBank.Common.Server.Controllers; +using FruitBank.Common.Interfaces; using FruitBank.Common.Server.Services.Loggers; using FruitBank.Common.Server.Services.SignalRs; using Mango.Nop.Core.Loggers; @@ -12,9 +12,11 @@ using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Nop.Core.Infrastructure; +using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; using Nop.Plugin.Misc.FruitBankPlugin.Filters; using Nop.Plugin.Misc.FruitBankPlugin.Services; using Nop.Services.Catalog; +using FruitBankDataController = Nop.Plugin.Misc.FruitBankPlugin.Controllers.FruitBankDataController; namespace Nop.Plugin.Misc.FruitBankPlugin.Infrastructure; @@ -39,7 +41,10 @@ public class PluginNopStartup : INopStartup services.AddSingleton(); services.AddSingleton(); //services.AddSingleton(); - services.AddScoped(); + + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); //services.AddScoped(); services.AddScoped(); diff --git a/Nop.Plugin.Misc.AIPlugin/Mapping/NameCompatibility.cs b/Nop.Plugin.Misc.AIPlugin/Mapping/NameCompatibility.cs index 29aeaab..f5462f4 100644 --- a/Nop.Plugin.Misc.AIPlugin/Mapping/NameCompatibility.cs +++ b/Nop.Plugin.Misc.AIPlugin/Mapping/NameCompatibility.cs @@ -1,4 +1,5 @@ using Nop.Data.Mapping; +using Nop.Plugin.Misc.FruitBankPlugin.Domains.Entities; namespace Nop.Plugin.Misc.FruitBankPlugin.Mapping; @@ -7,7 +8,14 @@ public partial class NameCompatibility : INameCompatibility /// /// Gets table name for mapping with the type /// - public Dictionary TableNames => new(); + public Dictionary TableNames => new Dictionary + { + { typeof(Partner), "fbPartner" }, + { typeof(Shipping), "fbShipping" }, + { typeof(ShippingItem), "fbShippingItem" }, + { typeof(ShippingDocument), "fbShippingDocument" }, + }; + /// /// Gets column name for mapping with the entity's property and type