From 3abfc03d1e79c0a5a10916feaaa8d64e9e1ede79 Mon Sep 17 00:00:00 2001 From: Loretta Date: Tue, 9 Sep 2025 04:38:39 +0200 Subject: [PATCH] improvements, fixes, etc... --- .../Controllers/FruitBankDataController.cs | 48 +++++++++++++---- .../Domains/DataLayer/FruitBankDbContext.cs | 54 +++++++++++++++++-- .../Interfaces/IShippingDocumentDbSet.cs | 11 ++++ .../Domains/DataLayer/PartnerDbTable.cs | 4 +- .../Domains/DataLayer/ShippingDbTable.cs | 2 + .../DataLayer/ShippingDocumentDbTable.cs | 19 +++++++ .../Domains/DataLayer/ShippingItemDbTable.cs | 2 + Nop.Plugin.Misc.AIPlugin/FruitBankPlugin.cs | 4 +- .../Infrastructure/PluginNopStartup.cs | 1 + 9 files changed, 128 insertions(+), 17 deletions(-) create mode 100644 Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/Interfaces/IShippingDocumentDbSet.cs create mode 100644 Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDocumentDbTable.cs diff --git a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs index a0a6748..1b771d5 100644 --- a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs +++ b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs @@ -7,12 +7,15 @@ using FruitBank.Common.Loggers; using FruitBank.Common.Models; using FruitBank.Common.SignalRs; using Microsoft.AspNetCore.Mvc; +using Nop.Core; using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; +using Nop.Services.Customers; +using Nop.Web.Framework.Controllers; namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers { //https://linq2db.github.io/articles/sql/Join-Operators.html - public class FruitBankDataController(FruitBankDbContext ctx, IEnumerable logWriters): Controller, IFruitBankDataControllerServer + public class FruitBankDataController(FruitBankDbContext ctx, IWorkContext workContext, ICustomerService customerService, IEnumerable logWriters): BasePluginController, IFruitBankDataControllerServer { private readonly ILogger _logger = new Logger(logWriters.ToArray()); @@ -26,7 +29,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers [SignalR(SignalRTags.GetMeasuringModelByShippingId)] public async Task GetMeasuringModelByShippingId(int shippingId) { - return await ctx.GetMeasuringModelByShippingId(shippingId); + return await ctx.GetMeasuringModelByShippingId(shippingId).FirstOrDefaultAsync(); } [SignalR(SignalRTags.GetPartners)] @@ -34,7 +37,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers { _logger.Detail($"GetPartners invoked"); - return await ctx.Partners.Table.ToListAsync(); + return await ctx.Partners.GetAll().ToListAsync(); } [SignalR(SignalRTags.GetPartnerById)] @@ -42,15 +45,30 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers { _logger.Detail($"GetPartnerById invoked; id: {id}"); + var customers = await ctx.GetCustormersBySystemRoleName("Measuring").ToListAsync(); + + _logger.Error($"COUNT: {customers.Count}"); return await ctx.Partners.GetByIdAsync(id); } + [SignalR(SignalRTags.UpdatePartner)] + public async Task UpdatePartner(Partner partner) + { + ArgumentNullException.ThrowIfNull(partner); + + _logger.Detail($"UpdatePartner invoked; id: {partner.Id}"); + + await ctx.Partners.UpdateAsync(partner); + return partner; + } + + [SignalR(SignalRTags.GetShippings)] public async Task> GetShippings() { _logger.Detail($"GetShippings invoked"); - return await ctx.Shippings.Table.ToListAsync(); + return await ctx.Shippings.GetAll().ToListAsync(); } [SignalR(SignalRTags.GetShippingById)] @@ -61,24 +79,36 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers return await ctx.Shippings.GetByIdAsync(id); } - public async Task> GetShippingItem() + [SignalR(SignalRTags.GetShippingItems)] + public async Task> GetShippingItems() { - throw new NotImplementedException(); + _logger.Detail($"GetShippingItems invoked"); + + return await ctx.ShippingItems.GetAll().ToListAsync(); } + [SignalR(SignalRTags.GetShippingItemById)] public async Task GetShippingItemById(int id) { - throw new NotImplementedException(); + _logger.Detail($"GetShippingItemById invoked; id: {id}"); + + return await ctx.ShippingItems.GetByIdAsync(id); } + [SignalR(SignalRTags.GetShippingDocuments)] public async Task> GetShippingDocuments() { - throw new NotImplementedException(); + _logger.Detail($"GetShippingDocuments invoked"); + + return await ctx.ShippingDocuments.GetAll().ToListAsync(); } + [SignalR(SignalRTags.GetShippingDocumentById)] public async Task GetShippingDocumentById(int id) { - throw new NotImplementedException(); + _logger.Detail($"GetShippingDocumentById invoked; id: {id}"); + + return await ctx.ShippingDocuments.GetByIdAsync(id); } } } diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs index 18a5b13..f2671a5 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs @@ -1,26 +1,41 @@ -using FruitBank.Common.Models; +using DocumentFormat.OpenXml.Drawing; +using FruitBank.Common.Models; +using LinqToDB; using Mango.Nop.Core.Repositories; +using Microsoft.CodeAnalysis.CSharp.Syntax; using Nop.Core.Caching; +using Nop.Core.Domain.Customers; using Nop.Data; using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer.Interfaces; using Nop.Services.Catalog; using Nop.Services.Logging; +using NUglify.Helpers; namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; -public class FruitBankDbContext : MgDbContextBase, IPartnerDbSet, IShippingDbSet, IShippingItemDbSet +public class FruitBankDbContext : MgDbContextBase, IPartnerDbSet, IShippingDbSet, IShippingItemDbSet, IShippingDocumentDbSet { private readonly IProductService _productService; private readonly IStaticCacheManager _staticCacheManager; + protected readonly IRepository _customerRepository; + protected readonly IRepository _customerCustomerRoleMappingRepository; + protected readonly IRepository _customerRoleRepository; + public PartnerDbTable Partners { get; set; } public ShippingDbTable Shippings { get; set; } public ShippingItemDbTable ShippingItems { get; set; } + public ShippingDocumentDbTable ShippingDocuments { get; set; } //public EntityRepository Auctions2 { get; set; } //public IRepository AuctionBids2 { get; set; } - public FruitBankDbContext(INopDataProvider dataProvider, PartnerDbTable partnerDbTable, ShippingDbTable shippingDbTable, ShippingItemDbTable shippingItemDbTable, IProductService productService, IStaticCacheManager staticCacheManager, ILogger logger) : base(dataProvider, logger) + public FruitBankDbContext(INopDataProvider dataProvider, PartnerDbTable partnerDbTable, ShippingDbTable shippingDbTable, ShippingItemDbTable shippingItemDbTable, + ShippingDocumentDbTable shippingDocumentDbTable, IProductService productService, IStaticCacheManager staticCacheManager, + IRepository customerRepository, + IRepository customerCustomerRoleMappingRepository, + IRepository customerRoleRepository, + ILogger logger) : base(dataProvider, logger) { _productService = productService; _staticCacheManager = staticCacheManager; @@ -28,12 +43,18 @@ public class FruitBankDbContext : MgDbContextBase, IPartnerDbSet Partners = partnerDbTable; Shippings = shippingDbTable; ShippingItems = shippingItemDbTable; + ShippingDocuments = shippingDocumentDbTable; + + _customerRepository = customerRepository; + _customerCustomerRoleMappingRepository = customerCustomerRoleMappingRepository; + _customerRoleRepository = customerRoleRepository; + //Auctions.Table //var auctions = DataProvider.GetTable().Where(x => x.Closed); } - public async Task GetMeasuringModelByShippingId(int shippingId) + public IQueryable GetMeasuringModelByShippingId(int shippingId) { var query = from p in Partners.Table @@ -41,7 +62,30 @@ public class FruitBankDbContext : MgDbContextBase, IPartnerDbSet where s.Id == shippingId select new MeasuringModel(p.Name); - return await query.FirstOrDefaultAsync(); + return query; + } + + public IQueryable GetCustormersBySystemRoleName(string systemRoleName) + { + if (systemRoleName.IsNullOrWhiteSpace()) throw new ArgumentException("systemRoleName.IsNullOrWhiteSpace()", nameof(systemRoleName)); + + var query = + from c in _customerRepository.Table + join crm in _customerCustomerRoleMappingRepository.Table on c.Id equals crm.CustomerId + join cr in _customerRoleRepository.Table on crm.CustomerRoleId equals cr.Id + where c.Active && !c.Deleted && cr.SystemName == systemRoleName + select c; + + return query.Distinct(); + + // query = query.Join(_customerCustomerRoleMappingRepository.Table, x => x.Id, y => y.CustomerId, + // (x, y) => new { Customer = x, Mapping = y }) + // .Where(z => z.Mapping.CustomerRoleId == customerRoleId) + // .Select(z => z.Customer) + // .Distinct(); + //}); + + //return customers; } ////public AuctionDbContext(IRepository _auctionRepository, IRepository _auctionBidRepository) diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/Interfaces/IShippingDocumentDbSet.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/Interfaces/IShippingDocumentDbSet.cs new file mode 100644 index 0000000..20b8040 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/Interfaces/IShippingDocumentDbSet.cs @@ -0,0 +1,11 @@ +using FruitBank.Common.Entities; +using FruitBank.Common.Interfaces; +using Mango.Nop.Core.Interfaces; +using Nop.Data; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer.Interfaces; + +public interface IShippingDocumentDbSet : IMgDbTableBase where TDbTable : IRepository +{ + public TDbTable ShippingDocuments { 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 index c323fa8..ed339c3 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/PartnerDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/PartnerDbTable.cs @@ -15,6 +15,8 @@ public class PartnerDbTable : MgDbTableBase { } + public IQueryable GetAll() => Table; + //public IOrderedQueryable GetAllLastBidByAuctionId(int auctionId) //{ // return GetAllByAuctionId(auctionId) @@ -27,7 +29,7 @@ public class PartnerDbTable : MgDbTableBase // => GetAllByProductToAuctionId(productToAuctionId).OrderByDescending(x => x.Id); //public Task GetBidsCountByProductToAuctionIdAsync(int productToAuctionId) - // => Table.CountAsync(x => x.ProductAuctionMappingId == productToAuctionId); + // => Table.CountAsync(x => x.ProductAuctionMappingId == productToAuctionId); //public IQueryable GetAllByAuctionId(int auctionId) // => Table.Where(x => x.AuctionId == auctionId); diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDbTable.cs index c667803..8e9a836 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDbTable.cs @@ -14,4 +14,6 @@ public class ShippingDbTable : MgDbTableBase : base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger) { } + + public IQueryable GetAll() => Table; } \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDocumentDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDocumentDbTable.cs new file mode 100644 index 0000000..0f11f8a --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDocumentDbTable.cs @@ -0,0 +1,19 @@ +using FruitBank.Common.Entities; +using Mango.Nop.Core.Repositories; +using Nop.Core.Caching; +using Nop.Core.Configuration; +using Nop.Core.Events; +using Nop.Data; +using Nop.Services.Logging; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; + +public class ShippingDocumentDbTable : MgDbTableBase +{ + public ShippingDocumentDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger) + : base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger) + { + } + + public IQueryable GetAll() => Table; +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingItemDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingItemDbTable.cs index 7a1c164..3cee783 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingItemDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingItemDbTable.cs @@ -14,4 +14,6 @@ public class ShippingItemDbTable : MgDbTableBase : base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger) { } + + public IQueryable GetAll() => Table; } \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/FruitBankPlugin.cs b/Nop.Plugin.Misc.AIPlugin/FruitBankPlugin.cs index 2e3b2d8..31f2101 100644 --- a/Nop.Plugin.Misc.AIPlugin/FruitBankPlugin.cs +++ b/Nop.Plugin.Misc.AIPlugin/FruitBankPlugin.cs @@ -50,8 +50,8 @@ namespace Nop.Plugin.Misc.FruitBankPlugin // --- INSTALL --- public override async Task InstallAsync() { - - // TODO: Add "NeedsToBeMeasured" product attribute if not exists + //TODO: Add "Measuring" role + //TODO: Add "NeedsToBeMeasured" product attribute if not exists // Default settings var settings = new OpenAiSettings diff --git a/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs b/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs index d7c5903..891baa7 100644 --- a/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs +++ b/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs @@ -45,6 +45,7 @@ public class PluginNopStartup : INopStartup services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped();