From 2a8dfeaca941c974f415dba154bf87564aa8a94d Mon Sep 17 00:00:00 2001 From: Loretta Date: Fri, 29 May 2026 12:16:57 +0200 Subject: [PATCH] Add CargoPartner and CargoTruck support (API & DB) - Introduced CargoPartnerDbTable and CargoTruckDbTable with DI registration. - Extended FruitBankDbContext for new entities. - Added CRUD SignalR endpoints for CargoPartner and CargoTruck. - Renamed PartnerDbTable.GetByIdNameAsync to GetByNameAsync. - Minor code style improvements. --- .../Controllers/FruitBankDataController.cs | 50 ++++++++++++++++--- .../Domains/DataLayer/CargoPartnerDbTable.cs | 28 +++++++++++ .../Domains/DataLayer/CargoTruckDbTable.cs | 26 ++++++++++ .../Domains/DataLayer/FruitBankDbContext.cs | 15 +++--- .../Domains/DataLayer/PartnerDbTable.cs | 12 ++--- .../Infrastructure/PluginNopStartup.cs | 3 ++ 6 files changed, 112 insertions(+), 22 deletions(-) create mode 100644 Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/CargoPartnerDbTable.cs create mode 100644 Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/CargoTruckDbTable.cs diff --git a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs index 5a3a5e6..4f4fac6 100644 --- a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs +++ b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs @@ -137,21 +137,19 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers return await ctx.Partners.GetByIdAsync(partner.Id, partner.ShippingDocuments != null); } - - [SignalR(SignalRTags.GetCargoPartners)] public async Task> GetCargoPartners() { _logger.Detail($"GetCargoPartners invoked"); - return [];// await ctx.CargoPartners.GetAll().ToListAsync(); + return await ctx.CargoPartners.GetAll().ToListAsync(); } [SignalR(SignalRTags.GetCargoPartnerById)] public async Task GetCargoPartnerById(int id) { _logger.Detail($"GetCargoPartnerById invoked; id: {id}"); - return null;//await ctx.CargoPartners.GetByIdAsync(id); + return await ctx.CargoPartners.GetByIdAsync(id); } [SignalR(SignalRTags.AddCargoPartner)] @@ -161,8 +159,8 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers _logger.Detail($"AddCargoPartner invoked; id: {cargoPartner.Id}"); - //await ctx.CargoPartners.InsertAsync(cargoPartner); - return null;// await ctx.Partners.GetByIdAsync(cargoPartner.Id, cargoPartner.ShippingDocuments != null); + await ctx.CargoPartners.InsertAsync(cargoPartner); + return await ctx.CargoPartners.GetByIdAsync(cargoPartner.Id, cargoPartner.CargoTrucks != null); } [SignalR(SignalRTags.UpdateCargoPartner)] @@ -172,11 +170,47 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers _logger.Detail($"UpdateCargoPartner invoked; id: {cargoPartner.Id}"); - //await ctx.CargoPartners.UpdateAsync(cargoPartner); - return null;//await ctx.CargoPartners.GetByIdAsync(cargoPartner.Id, cargoPartner.ShippingDocuments != null); + await ctx.CargoPartners.UpdateAsync(cargoPartner); + return await ctx.CargoPartners.GetByIdAsync(cargoPartner.Id, cargoPartner.CargoTrucks != null); + } + + + [SignalR(SignalRTags.GetCargoTrucks)] + public async Task> GetCargoTrucks() + { + _logger.Detail($"GetCargoTrucks invoked"); + + return await ctx.CargoTrucks.GetAll().ToListAsync(); } + [SignalR(SignalRTags.GetCargoTruckById)] + public async Task GetCargoTruckById(int id) + { + _logger.Detail($"GetCargoTruckById invoked; id: {id}"); + return await ctx.CargoTrucks.GetByIdAsync(id); + } + [SignalR(SignalRTags.AddCargoTruck)] + public async Task AddCargoTruck(CargoTruck cargoTruck) + { + ArgumentNullException.ThrowIfNull(cargoTruck); + + _logger.Detail($"AddCargoTruck invoked; id: {cargoTruck.Id}"); + + await ctx.CargoTrucks.InsertAsync(cargoTruck); + return await ctx.CargoTrucks.GetByIdAsync(cargoTruck.Id); + } + + [SignalR(SignalRTags.UpdateCargoTruck)] + public async Task UpdateCargoTruck(CargoTruck cargoTruck) + { + ArgumentNullException.ThrowIfNull(cargoTruck); + + _logger.Detail($"UpdateCargoTruck invoked; id: {cargoTruck.Id}"); + + await ctx.CargoTrucks.UpdateAsync(cargoTruck); + return await ctx.CargoTrucks.GetByIdAsync(cargoTruck.Id); + } [SignalR(SignalRTags.GetShippings)] public async Task> GetShippings() diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/CargoPartnerDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/CargoPartnerDbTable.cs new file mode 100644 index 0000000..88a9d93 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/CargoPartnerDbTable.cs @@ -0,0 +1,28 @@ +using FruitBank.Common.Entities; +using LinqToDB; +using Mango.Nop.Data.Repositories; +using Nop.Core.Caching; +using Nop.Core.Configuration; +using Nop.Core.Events; +using Nop.Data; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; + +public class CargoPartnerDbTable : MgDbTableBase +{ + public CargoPartnerDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings) + : base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings) + { + } + + public override IOrderedQueryable GetAll() => base.GetAll().OrderBy(p => p.Name); + + public IQueryable GetAll(bool loadRelations) + { + return loadRelations ? GetAll().LoadWith(sd => sd.CargoTrucks) : GetAll(); + } + + public Task GetByIdAsync(int id, bool loadRelations) => GetAll(loadRelations).FirstOrDefaultAsync(p => p.Id == id); + + public Task GetByNameAsync(string name, bool loadRelations) => GetAll(loadRelations).FirstOrDefaultAsync(p => p.Name == name); +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/CargoTruckDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/CargoTruckDbTable.cs new file mode 100644 index 0000000..14e8c48 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/CargoTruckDbTable.cs @@ -0,0 +1,26 @@ +using FruitBank.Common.Entities; +using Mango.Nop.Data.Repositories; +using Nop.Core.Caching; +using Nop.Core.Configuration; +using Nop.Core.Events; +using Nop.Data; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; + +public class CargoTruckDbTable : MgDbTableBase +{ + public CargoTruckDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings) + : base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings) + { + } + + public override IOrderedQueryable GetAll() => base.GetAll().OrderBy(p => p.CargoPartnerId); + + public IQueryable GetAll(bool loadRelations) + { + return GetAll(); + //return loadRelations ? GetAll().LoadWith(sd => sd.CargoTrucks) : GetAll(); + } + + public Task GetByIdAsync(int id, bool loadRelations) => GetAll(loadRelations).FirstOrDefaultAsync(p => p.Id == id); +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs index ff35b13..4186529 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs @@ -55,6 +55,9 @@ public class FruitBankDbContext : MgDbContextBase, public OrderItemDtoDbTable OrderItemDtos { get; set; } public PartnerDbTable Partners { get; set; } + public CargoPartnerDbTable CargoPartners { get; set; } + public CargoTruckDbTable CargoTrucks{ get; set; } + public ShippingDbTable Shippings { get; set; } public ShippingDocumentDbTable ShippingDocuments { get; set; } public ShippingItemDbTable ShippingItems { get; set; } @@ -78,7 +81,7 @@ public class FruitBankDbContext : MgDbContextBase, public IRepository StockQuantityHistoriesExt { get; set; } public FruitBankDbContext(INopDataProvider dataProvider, ILockService lockService, FruitBankAttributeService fruitBankAttributeService, IStoreContext storeContext, - PartnerDbTable partnerDbTable, ShippingDbTable shippingDbTable, ShippingDocumentDbTable shippingDocumentDbTable, ShippingItemDbTable shippingItemDbTable, + CargoPartnerDbTable cargoPartnerDbTable, CargoTruckDbTable cargoTruckDbTable, PartnerDbTable partnerDbTable, ShippingDbTable shippingDbTable, ShippingDocumentDbTable shippingDocumentDbTable, ShippingItemDbTable shippingItemDbTable, ShippingItemPalletDbTable shippingItemPalletDbTable, FilesDbTable filesDbTable, ShippingDocumentToFilesDbTable shippingDocumentToFilesDbTable, ProductDtoDbTable productDtoDbTable, OrderDtoDbTable orderDtoDbTable, OrderItemDtoDbTable orderItemDtoDbTable, OrderItemPalletDbTable orderItemPalletDbTable, StockQuantityHistoryDtoDbTable stockQuantityHistoryDtos, CustomerCreditDbTable customerCreditDbTable, @@ -105,7 +108,9 @@ public class FruitBankDbContext : MgDbContextBase, Files = filesDbTable; Partners = partnerDbTable; - + CargoPartners = cargoPartnerDbTable; + CargoTrucks = cargoTruckDbTable; + ProductDtos = productDtoDbTable; OrderDtos = orderDtoDbTable; @@ -225,8 +230,7 @@ public class FruitBankDbContext : MgDbContextBase, return Task.FromResult(false); } - public Task AddShippingItemSafeAsync(ShippingItem shippingItem) - => TransactionSafeAsync(async _ => await AddShippingItemAsync(shippingItem)); + public Task AddShippingItemSafeAsync(ShippingItem shippingItem) => TransactionSafeAsync(async _ => await AddShippingItemAsync(shippingItem)); public async Task AddShippingItemAsync(ShippingItem shippingItem) { @@ -251,8 +255,7 @@ public class FruitBankDbContext : MgDbContextBase, return true; } - public Task UpdateShippingItemSafeAsync(ShippingItem shippingItem) - => TransactionSafeAsync(async _ => await UpdateShippingItemAsync(shippingItem)); + public Task UpdateShippingItemSafeAsync(ShippingItem shippingItem) => TransactionSafeAsync(async _ => await UpdateShippingItemAsync(shippingItem)); public async Task UpdateShippingItemAsync(ShippingItem shippingItem) { diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/PartnerDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/PartnerDbTable.cs index 87331d8..15444e4 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/PartnerDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/PartnerDbTable.cs @@ -16,8 +16,7 @@ public class PartnerDbTable : MgDbTableBase { } - public override IOrderedQueryable GetAll() - => base.GetAll().OrderBy(p => p.Name); + public override IOrderedQueryable GetAll() => base.GetAll().OrderBy(p => p.Name); public IQueryable GetAll(bool loadRelations) { @@ -29,10 +28,7 @@ public class PartnerDbTable : MgDbTableBase : GetAll(); } - public Task GetByIdAsync(int id, bool loadRelations) - => GetAll(loadRelations).FirstOrDefaultAsync(p => p.Id == id); - - - public Task GetByIdNameAsync(string name, bool loadRelations) - => GetAll(loadRelations).FirstOrDefaultAsync(p => p.Name == name); + public Task GetByIdAsync(int id, bool loadRelations) => GetAll(loadRelations).FirstOrDefaultAsync(p => p.Id == id); + + public Task GetByNameAsync(string name, bool loadRelations) => GetAll(loadRelations).FirstOrDefaultAsync(p => p.Name == name); } \ 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 0ecac3c..fdb7952 100644 --- a/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs +++ b/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs @@ -78,6 +78,9 @@ public class PluginNopStartup : INopStartup services.AddScoped(); services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped();