using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.Rendering; using Nop.Core.Domain.Discounts; using Nop.Plugin.DiscountRules.NopCliGeneric.Models; using Nop.Services.Configuration; using Nop.Services.Customers; using Nop.Services.Discounts; using Nop.Services.Localization; using Nop.Services.Security; using Nop.Web.Framework; using Nop.Web.Framework.Controllers; using Nop.Web.Framework.Mvc.Filters; namespace Nop.Plugin.DiscountRules.NopCliGeneric.Controllers { [AuthorizeAdmin] [Area(AreaNames.Admin)] [AutoValidateAntiforgeryToken] public class DiscountRulesNopCliGenericController : BasePluginController { #region Fields private readonly ICustomerService _customerService; private readonly IDiscountService _discountService; private readonly ILocalizationService _localizationService; private readonly IPermissionService _permissionService; private readonly ISettingService _settingService; #endregion #region Ctor public DiscountRulesNopCliGenericController(ICustomerService customerService, IDiscountService discountService, ILocalizationService localizationService, IPermissionService permissionService, ISettingService settingService) { _customerService = customerService; _discountService = discountService; _localizationService = localizationService; _permissionService = permissionService; _settingService = settingService; } #endregion #region Methods public IActionResult Configure(int discountId, int? discountRequirementId) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageDiscounts)) return Content("Access denied"); //load the discount var discount = _discountService.GetDiscountById(discountId); if (discount == null) throw new ArgumentException("Discount could not be loaded"); //check whether the discount requirement exists if (discountRequirementId.HasValue && _discountService.GetDiscountRequirementById(discountRequirementId.Value) is null) return Content("Failed to load requirement."); //try to get previously saved restricted customer role identifier var restrictedRoleId = _settingService.GetSettingByKey(string.Format(DiscountRequirementDefaults.SettingsKey, discountRequirementId ?? 0)); var model = new RequirementModel { RequirementId = discountRequirementId ?? 0, DiscountId = discountId, TestId = restrictedRoleId }; //set available customer roles model.AvailableNopCliGeneric = _customerService.GetAllCustomerRoles(true).Select(role => new SelectListItem { Text = role.Name, Value = role.Id.ToString(), Selected = role.Id == restrictedRoleId }).ToList(); model.AvailableNopCliGeneric.Insert(0, new SelectListItem { Text = _localizationService.GetResource("Plugins.DiscountRules.NopCliGeneric.Fields.CustomerRole.Select"), Value = "0" }); //set the HTML field prefix ViewData.TemplateInfo.HtmlFieldPrefix = string.Format(DiscountRequirementDefaults.HtmlFieldPrefix, discountRequirementId ?? 0); return View("~/Plugins/DiscountRules.NopCliGeneric/Views/Configure.cshtml", model); } [HttpPost] public IActionResult Configure(RequirementModel model) { if (!_permissionService.Authorize(StandardPermissionProvider.ManageDiscounts)) return Content("Access denied"); if (ModelState.IsValid) { //load the discount var discount = _discountService.GetDiscountById(model.DiscountId); if (discount == null) return NotFound(new { Errors = new[] { "Discount could not be loaded" } }); //get the discount requirement var discountRequirement = _discountService.GetDiscountRequirementById(model.RequirementId); //the discount requirement does not exist, so create a new one if (discountRequirement == null) { discountRequirement = new DiscountRequirement { DiscountId = discount.Id, DiscountRequirementRuleSystemName = DiscountRequirementDefaults.SystemName }; _discountService.InsertDiscountRequirement(discountRequirement); } //save restricted customer role identifier _settingService.SetSetting(string.Format(DiscountRequirementDefaults.SettingsKey, discountRequirement.Id), model.TestId); return Ok(new { NewRequirementId = discountRequirement.Id }); } return BadRequest(new { Errors = GetErrorsFromModelState(ModelState) }); } #endregion #region Utilities private IEnumerable GetErrorsFromModelState(ModelStateDictionary modelState) { return ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage)); } #endregion } }