using Microsoft.AspNetCore.Mvc; using Nop.Core; using Nop.Core.Domain.Customers; using Nop.Services.Catalog; using Nop.Services.Customers; using Nop.Services.Localization; using Nop.Services.Logging; using Nop.Services.Messages; using Nop.Services.Security; using Nop.Web.Areas.Admin.Factories; using Nop.Web.Areas.Admin.Infrastructure.Mapper.Extensions; using Nop.Web.Areas.Admin.Models.Customers; using Nop.Web.Framework.Controllers; using Nop.Web.Framework.Mvc.Filters; namespace Nop.Web.Areas.Admin.Controllers; public partial class CustomerRoleController : BaseAdminController { #region Fields protected readonly ICustomerActivityService _customerActivityService; protected readonly ICustomerRoleModelFactory _customerRoleModelFactory; protected readonly ICustomerService _customerService; protected readonly ILocalizationService _localizationService; protected readonly INotificationService _notificationService; protected readonly IPermissionService _permissionService; protected readonly IProductService _productService; protected readonly IWorkContext _workContext; #endregion #region Ctor public CustomerRoleController(ICustomerActivityService customerActivityService, ICustomerRoleModelFactory customerRoleModelFactory, ICustomerService customerService, ILocalizationService localizationService, INotificationService notificationService, IPermissionService permissionService, IProductService productService, IWorkContext workContext) { _customerActivityService = customerActivityService; _customerRoleModelFactory = customerRoleModelFactory; _customerService = customerService; _localizationService = localizationService; _notificationService = notificationService; _permissionService = permissionService; _productService = productService; _workContext = workContext; } #endregion #region Methods public virtual IActionResult Index() { return RedirectToAction("List"); } [CheckPermission(StandardPermission.Customers.CUSTOMER_ROLES_VIEW)] public virtual async Task List() { //prepare model var model = await _customerRoleModelFactory.PrepareCustomerRoleSearchModelAsync(new CustomerRoleSearchModel()); return View(model); } [HttpPost] [CheckPermission(StandardPermission.Customers.CUSTOMER_ROLES_VIEW)] public virtual async Task List(CustomerRoleSearchModel searchModel) { //prepare model var model = await _customerRoleModelFactory.PrepareCustomerRoleListModelAsync(searchModel); return Json(model); } [CheckPermission(StandardPermission.Customers.CUSTOMER_ROLES_CREATE_EDIT_DELETE)] [CheckPermission(StandardPermission.Configuration.MANAGE_ACL)] public virtual async Task Create() { //prepare model var model = await _customerRoleModelFactory.PrepareCustomerRoleModelAsync(new CustomerRoleModel(), null); return View(model); } [HttpPost, ParameterBasedOnFormName("save-continue", "continueEditing")] [CheckPermission(StandardPermission.Customers.CUSTOMER_ROLES_CREATE_EDIT_DELETE)] [CheckPermission(StandardPermission.Configuration.MANAGE_ACL)] public virtual async Task Create(CustomerRoleModel model, bool continueEditing) { if (ModelState.IsValid) { var customerRole = model.ToEntity(); await _customerService.InsertCustomerRoleAsync(customerRole); //activity log await _customerActivityService.InsertActivityAsync("AddNewCustomerRole", string.Format(await _localizationService.GetResourceAsync("ActivityLog.AddNewCustomerRole"), customerRole.Name), customerRole); _notificationService.SuccessNotification(await _localizationService.GetResourceAsync("Admin.Customers.CustomerRoles.Added")); return continueEditing ? RedirectToAction("Edit", new { id = customerRole.Id }) : RedirectToAction("List"); } //prepare model model = await _customerRoleModelFactory.PrepareCustomerRoleModelAsync(model, null, true); //if we got this far, something failed, redisplay form return View(model); } [CheckPermission(StandardPermission.Customers.CUSTOMER_ROLES_VIEW)] [CheckPermission(StandardPermission.Configuration.MANAGE_ACL)] public virtual async Task Edit(int id) { //try to get a customer role with the specified id var customerRole = await _customerService.GetCustomerRoleByIdAsync(id); if (customerRole == null) return RedirectToAction("List"); //prepare model var model = await _customerRoleModelFactory.PrepareCustomerRoleModelAsync(null, customerRole); return View(model); } [HttpPost, ParameterBasedOnFormName("save-continue", "continueEditing")] [CheckPermission(StandardPermission.Customers.CUSTOMER_ROLES_CREATE_EDIT_DELETE)] [CheckPermission(StandardPermission.Configuration.MANAGE_ACL)] public virtual async Task Edit(CustomerRoleModel model, bool continueEditing) { //try to get a customer role with the specified id var customerRole = await _customerService.GetCustomerRoleByIdAsync(model.Id); if (customerRole == null) return RedirectToAction("List"); try { if (ModelState.IsValid) { if (customerRole.IsSystemRole && !model.Active) throw new NopException(await _localizationService.GetResourceAsync("Admin.Customers.CustomerRoles.Fields.Active.CantEditSystem")); if (customerRole.IsSystemRole && !customerRole.SystemName.Equals(model.SystemName, StringComparison.InvariantCultureIgnoreCase)) throw new NopException(await _localizationService.GetResourceAsync("Admin.Customers.CustomerRoles.Fields.SystemName.CantEditSystem")); if (NopCustomerDefaults.RegisteredRoleName.Equals(customerRole.SystemName, StringComparison.InvariantCultureIgnoreCase) && model.PurchasedWithProductId > 0) throw new NopException(await _localizationService.GetResourceAsync("Admin.Customers.CustomerRoles.Fields.PurchasedWithProduct.Registered")); customerRole = model.ToEntity(customerRole); await _customerService.UpdateCustomerRoleAsync(customerRole); //activity log await _customerActivityService.InsertActivityAsync("EditCustomerRole", string.Format(await _localizationService.GetResourceAsync("ActivityLog.EditCustomerRole"), customerRole.Name), customerRole); _notificationService.SuccessNotification(await _localizationService.GetResourceAsync("Admin.Customers.CustomerRoles.Updated")); return continueEditing ? RedirectToAction("Edit", new { id = customerRole.Id }) : RedirectToAction("List"); } //prepare model model = await _customerRoleModelFactory.PrepareCustomerRoleModelAsync(model, customerRole, true); //if we got this far, something failed, redisplay form return View(model); } catch (Exception exc) { await _notificationService.ErrorNotificationAsync(exc); return RedirectToAction("Edit", new { id = customerRole.Id }); } } [HttpPost] [CheckPermission(StandardPermission.Customers.CUSTOMER_ROLES_CREATE_EDIT_DELETE)] [CheckPermission(StandardPermission.Configuration.MANAGE_ACL)] public virtual async Task Delete(int id) { //try to get a customer role with the specified id var customerRole = await _customerService.GetCustomerRoleByIdAsync(id); if (customerRole == null) return RedirectToAction("List"); try { await _customerService.DeleteCustomerRoleAsync(customerRole); //activity log await _customerActivityService.InsertActivityAsync("DeleteCustomerRole", string.Format(await _localizationService.GetResourceAsync("ActivityLog.DeleteCustomerRole"), customerRole.Name), customerRole); _notificationService.SuccessNotification(await _localizationService.GetResourceAsync("Admin.Customers.CustomerRoles.Deleted")); return RedirectToAction("List"); } catch (Exception exc) { _notificationService.ErrorNotification(exc.Message); return RedirectToAction("Edit", new { id = customerRole.Id }); } } [CheckPermission(StandardPermission.Customers.CUSTOMER_ROLES_VIEW)] [CheckPermission(StandardPermission.Configuration.MANAGE_ACL)] public virtual async Task AssociateProductToCustomerRolePopup() { //prepare model var model = await _customerRoleModelFactory.PrepareCustomerRoleProductSearchModelAsync(new CustomerRoleProductSearchModel()); return View(model); } [HttpPost] [CheckPermission(StandardPermission.Customers.CUSTOMER_ROLES_VIEW)] [CheckPermission(StandardPermission.Configuration.MANAGE_ACL)] public virtual async Task AssociateProductToCustomerRolePopupList(CustomerRoleProductSearchModel searchModel) { //prepare model var model = await _customerRoleModelFactory.PrepareCustomerRoleProductListModelAsync(searchModel); return Json(model); } [HttpPost] [FormValueRequired("save")] [CheckPermission(StandardPermission.Customers.CUSTOMER_ROLES_CREATE_EDIT_DELETE)] [CheckPermission(StandardPermission.Configuration.MANAGE_ACL)] public virtual async Task AssociateProductToCustomerRolePopup([Bind(Prefix = nameof(AddProductToCustomerRoleModel))] AddProductToCustomerRoleModel model) { //try to get a product with the specified id var associatedProduct = await _productService.GetProductByIdAsync(model.AssociatedToProductId); if (associatedProduct == null) return Content("Cannot load a product"); //a vendor should have access only to his products var currentVendor = await _workContext.GetCurrentVendorAsync(); if (currentVendor != null && associatedProduct.VendorId != currentVendor.Id) return Content("This is not your product"); ViewBag.RefreshPage = true; ViewBag.productId = associatedProduct.Id; ViewBag.productName = associatedProduct.Name; return View(new CustomerRoleProductSearchModel()); } #endregion }