using Microsoft.AspNetCore.Mvc; using Nop.Core; using Nop.Core.Domain.Localization; using Nop.Core.Domain.Messages; using Nop.Core.Domain.Security; using Nop.Services.Customers; using Nop.Services.Localization; using Nop.Services.Messages; using Nop.Web.Factories; using Nop.Web.Framework.Mvc.Filters; namespace Nop.Web.Controllers; [AutoValidateAntiforgeryToken] public partial class NewsletterController : BasePublicController { protected readonly CaptchaSettings _captchaSettings; protected readonly ICustomerService _customerService; protected readonly ILanguageService _languageService; protected readonly ILocalizationService _localizationService; protected readonly INewsletterModelFactory _newsletterModelFactory; protected readonly INewsLetterSubscriptionService _newsLetterSubscriptionService; protected readonly IStoreContext _storeContext; protected readonly IWorkContext _workContext; protected readonly IWorkflowMessageService _workflowMessageService; public NewsletterController(CaptchaSettings captchaSettings, ICustomerService customerService, ILanguageService languageService, ILocalizationService localizationService, INewsletterModelFactory newsletterModelFactory, INewsLetterSubscriptionService newsLetterSubscriptionService, IStoreContext storeContext, IWorkContext workContext, IWorkflowMessageService workflowMessageService) { _captchaSettings = captchaSettings; _customerService = customerService; _languageService = languageService; _localizationService = localizationService; _newsletterModelFactory = newsletterModelFactory; _newsLetterSubscriptionService = newsLetterSubscriptionService; _storeContext = storeContext; _workContext = workContext; _workflowMessageService = workflowMessageService; } //available even when a store is closed [CheckAccessClosedStore(ignore: true)] [HttpPost] [ValidateCaptcha] public virtual async Task SubscribeNewsletter(string email, bool subscribe, bool captchaValid) { string result; var success = false; //validate CAPTCHA if (_captchaSettings.Enabled && _captchaSettings.ShowOnNewsletterPage && !captchaValid) { result = await _localizationService.GetResourceAsync("Common.WrongCaptchaMessage"); return Json(new { Success = success, Result = result, }); } if (!CommonHelper.IsValidEmail(email)) { result = await _localizationService.GetResourceAsync("Newsletter.Email.Wrong"); } else { email = email.Trim(); var store = await _storeContext.GetCurrentStoreAsync(); var subscription = await _newsLetterSubscriptionService.GetNewsLetterSubscriptionByEmailAndStoreIdAsync(email, store.Id); var currentLanguage = await _workContext.GetWorkingLanguageAsync(); if (subscription != null) { subscription.LanguageId = subscription.LanguageId == 0 ? currentLanguage.Id : subscription.LanguageId; if (subscribe) { if (!subscription.Active) { await _workflowMessageService.SendNewsLetterSubscriptionActivationMessageAsync(subscription); } result = await _localizationService.GetResourceAsync("Newsletter.SubscribeEmailSent"); } else { if (subscription.Active) { await _workflowMessageService.SendNewsLetterSubscriptionDeactivationMessageAsync(subscription); } result = await _localizationService.GetResourceAsync("Newsletter.UnsubscribeEmailSent"); } } else if (subscribe) { subscription = new NewsLetterSubscription { NewsLetterSubscriptionGuid = Guid.NewGuid(), Email = email, Active = false, StoreId = store.Id, LanguageId = currentLanguage.Id, CreatedOnUtc = DateTime.UtcNow }; await _newsLetterSubscriptionService.InsertNewsLetterSubscriptionAsync(subscription); await _workflowMessageService.SendNewsLetterSubscriptionActivationMessageAsync(subscription); result = await _localizationService.GetResourceAsync("Newsletter.SubscribeEmailSent"); } else { result = await _localizationService.GetResourceAsync("Newsletter.UnsubscribeEmailSent"); } success = true; } return Json(new { Success = success, Result = result, }); } //available even when a store is closed [CheckAccessClosedStore(ignore: true)] public virtual async Task SubscriptionActivation(Guid token, bool active) { var subscription = await _newsLetterSubscriptionService.GetNewsLetterSubscriptionByGuidAsync(token); if (subscription == null) return RedirectToRoute("Homepage"); if (active) { subscription.Active = true; await _newsLetterSubscriptionService.UpdateNewsLetterSubscriptionAsync(subscription); if (!await _customerService.IsRegisteredAsync(await _workContext.GetCurrentCustomerAsync()) && await _languageService.GetLanguageByIdAsync(subscription.LanguageId) is Language language) { await _workContext.SetWorkingLanguageAsync(language); } } else await _newsLetterSubscriptionService.DeleteNewsLetterSubscriptionAsync(subscription); var model = await _newsletterModelFactory.PrepareSubscriptionActivationModelAsync(active); return View(model); } }