diff --git a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs index 1b771d5..a80fe3c 100644 --- a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs +++ b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs @@ -1,21 +1,32 @@ using AyCode.Core.Loggers; using AyCode.Services.SignalRs; -using DocumentFormat.OpenXml.Office2010.Excel; using FruitBank.Common.Entities; using FruitBank.Common.Interfaces; using FruitBank.Common.Loggers; using FruitBank.Common.Models; +using FruitBank.Common.Server; using FruitBank.Common.SignalRs; -using Microsoft.AspNetCore.Mvc; +using Mango.Nop.Core.Dtos; +using Mango.Nop.Core.Models; using Nop.Core; +using Nop.Core.Domain.Customers; using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; using Nop.Services.Customers; +using Nop.Services.Localization; using Nop.Web.Framework.Controllers; +using NUglify.Helpers; namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers { //https://linq2db.github.io/articles/sql/Join-Operators.html - public class FruitBankDataController(FruitBankDbContext ctx, IWorkContext workContext, ICustomerService customerService, IEnumerable logWriters): BasePluginController, IFruitBankDataControllerServer + public class FruitBankDataController( + FruitBankDbContext ctx, + IWorkContext workContext, + ICustomerService customerService, + ICustomerRegistrationService customerRegistrationService, + ILocalizationService localizationService, + IEnumerable logWriters) + : BasePluginController, IFruitBankDataControllerServer { private readonly ILogger _logger = new Logger(logWriters.ToArray()); @@ -45,9 +56,9 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers { _logger.Detail($"GetPartnerById invoked; id: {id}"); - var customers = await ctx.GetCustormersBySystemRoleName("Measuring").ToListAsync(); + //var customers = await ctx.GetCustormersBySystemRoleName("Measuring").ToListAsync(); + //_logger.Error($"COUNT: {customers.Count}"); - _logger.Error($"COUNT: {customers.Count}"); return await ctx.Partners.GetByIdAsync(id); } @@ -110,5 +121,87 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers return await ctx.ShippingDocuments.GetByIdAsync(id); } + + [SignalR(SignalRTags.GetMeasuringUsers)] + public async Task> GetMeasuringUsers() + { + _logger.Detail($"GetMeasuringUsers invoked"); + + var customers = await ctx.GetCustormersBySystemRoleName(FruitBankConst.MeasuringRoleSystemName).OrderBy(o => o.Username).Select(c => new CustomerDto(c)).ToListAsync(); + + return customers; //.ToModelDto(); + } + + [SignalR(SignalRTags.GetProductDtos)] + public async Task> GetProductDtos() + { + _logger.Detail($"GetProductDtos invoked"); + + return await ctx.GetProducts().OrderBy(o => o.Name).Select(c => new ProductDto(c)).ToListAsync(); + } + + [SignalR(SignalRTags.AuthenticateUser)] + public async Task LoginMeasuringUser(MgLoginModelRequest loginModelRequest) + { + var customerEmail = loginModelRequest?.Email; + var customerPassword = loginModelRequest?.Password; + + _logger.Detail($"LoginMeasuringUser invoked; customerEmail; {customerEmail}"); + + var resultLoginModel = new MgLoginModelResponse(); + + if (!customerEmail.IsNullOrWhiteSpace() && !customerPassword.IsNullOrWhiteSpace()) + { + var loginResult = await customerRegistrationService.ValidateCustomerAsync(customerEmail, customerPassword); + + switch (loginResult) + { + case CustomerLoginResults.Successful: + { + var customer = await customerService.GetCustomerByEmailAsync(customerEmail); + + var isInMeasuringRole = await customerService.IsInCustomerRoleAsync(customer, FruitBankConst.MeasuringRoleSystemName); + if (!isInMeasuringRole) + { + resultLoginModel.ErrorMessage = "Is not in MeauringRole!"; + break; + } + + //var actionResult = await customerRegistrationService.SignInCustomerAsync(customer, returnUrl, loginModel.RememberMe); + + //await _workContext.SetCurrentCustomerAsync(customer); + //await _authenticationService.SignInAsync(customer, isPersist); + ////raise event + //await _eventPublisher.PublishAsync(new CustomerLoggedinEvent(customer)); + + resultLoginModel.CustomerDto = new CustomerDto(customer); //customer.ToModel(); + break; + } + case CustomerLoginResults.CustomerNotExist: + resultLoginModel.ErrorMessage = await localizationService.GetResourceAsync("Account.Login.WrongCredentials.CustomerNotExist"); + break; + case CustomerLoginResults.Deleted: + resultLoginModel.ErrorMessage = await localizationService.GetResourceAsync("Account.Login.WrongCredentials.Deleted"); + break; + case CustomerLoginResults.NotActive: + resultLoginModel.ErrorMessage = await localizationService.GetResourceAsync("Account.Login.WrongCredentials.NotActive"); + break; + case CustomerLoginResults.NotRegistered: + resultLoginModel.ErrorMessage = await localizationService.GetResourceAsync("Account.Login.WrongCredentials.NotRegistered"); + break; + case CustomerLoginResults.LockedOut: + resultLoginModel.ErrorMessage = await localizationService.GetResourceAsync("Account.Login.WrongCredentials.LockedOut"); + break; + case CustomerLoginResults.WrongPassword: + default: + resultLoginModel.ErrorMessage = await localizationService.GetResourceAsync("Account.Login.WrongCredentials"); + break; + } + } + else resultLoginModel.ErrorMessage = await localizationService.GetResourceAsync("Account.Login.WrongCredentials"); + + if (!resultLoginModel.ErrorMessage.IsNullOrWhiteSpace()) _logger.Error($"{resultLoginModel.ErrorMessage}; email: {customerEmail}"); + return resultLoginModel; + } } } diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs index f2671a5..d74cc69 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs @@ -4,6 +4,7 @@ using LinqToDB; using Mango.Nop.Core.Repositories; using Microsoft.CodeAnalysis.CSharp.Syntax; using Nop.Core.Caching; +using Nop.Core.Domain.Catalog; using Nop.Core.Domain.Customers; using Nop.Data; using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer.Interfaces; @@ -18,20 +19,20 @@ public class FruitBankDbContext : MgDbContextBase, IPartnerDbSet 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 IRepository Products { get; set; } + public IRepository Customers { get; set; } + public IRepository CustomerRoles { get; set; } + public IRepository CustomerRoleMappings { get; set; } - public FruitBankDbContext(INopDataProvider dataProvider, PartnerDbTable partnerDbTable, ShippingDbTable shippingDbTable, ShippingItemDbTable shippingItemDbTable, - ShippingDocumentDbTable shippingDocumentDbTable, IProductService productService, IStaticCacheManager staticCacheManager, + public FruitBankDbContext(INopDataProvider dataProvider, PartnerDbTable partnerDbTable, ShippingDbTable shippingDbTable, ShippingItemDbTable shippingItemDbTable, + ShippingDocumentDbTable shippingDocumentDbTable, IProductService productService, IStaticCacheManager staticCacheManager, + IRepository productRepository, IRepository customerRepository, IRepository customerCustomerRoleMappingRepository, IRepository customerRoleRepository, @@ -45,13 +46,10 @@ public class FruitBankDbContext : MgDbContextBase, IPartnerDbSet ShippingItems = shippingItemDbTable; ShippingDocuments = shippingDocumentDbTable; - _customerRepository = customerRepository; - _customerCustomerRoleMappingRepository = customerCustomerRoleMappingRepository; - _customerRoleRepository = customerRoleRepository; - - - //Auctions.Table - //var auctions = DataProvider.GetTable().Where(x => x.Closed); + Products = productRepository; + Customers = customerRepository; + CustomerRoles = customerRoleRepository; + CustomerRoleMappings = customerCustomerRoleMappingRepository; } public IQueryable GetMeasuringModelByShippingId(int shippingId) @@ -70,92 +68,15 @@ public class FruitBankDbContext : MgDbContextBase, IPartnerDbSet 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 + from c in Customers.Table + join crm in CustomerRoleMappings.Table on c.Id equals crm.CustomerId + join cr in CustomerRoles.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) - ////{ - //// 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); - //} + public IQueryable GetProducts() + => Products.Table.Where(p => !p.Deleted); } \ 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 ed339c3..900b65f 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/PartnerDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/PartnerDbTable.cs @@ -15,7 +15,6 @@ public class PartnerDbTable : MgDbTableBase { } - public IQueryable GetAll() => Table; //public IOrderedQueryable GetAllLastBidByAuctionId(int auctionId) //{ diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDbTable.cs index 8e9a836..c667803 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDbTable.cs @@ -14,6 +14,4 @@ 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 index 0f11f8a..aad6170 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDocumentDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDocumentDbTable.cs @@ -14,6 +14,4 @@ public class ShippingDocumentDbTable : 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/ShippingItemDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingItemDbTable.cs index 3cee783..7a1c164 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingItemDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingItemDbTable.cs @@ -14,6 +14,4 @@ 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 31f2101..98a1d9b 100644 --- a/Nop.Plugin.Misc.AIPlugin/FruitBankPlugin.cs +++ b/Nop.Plugin.Misc.AIPlugin/FruitBankPlugin.cs @@ -1,4 +1,5 @@ +using FruitBank.Common.Server; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Routing; @@ -50,7 +51,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin // --- INSTALL --- public override async Task InstallAsync() { - //TODO: Add "Measuring" role + //TODO: Add "Measuring" role - FruitBankConst.MeasuringRoleSystemName //TODO: Add "NeedsToBeMeasured" product attribute if not exists // Default settings