Try your search with a different keyword or use * as a wildcard.
using Microsoft.AspNetCore.Mvc;
using Nop.Core;
using Nop.Core.Domain.Customers;
using Nop.Core.Domain.Forums;
using Nop.Services.Customers;
using Nop.Services.Forums;
using Nop.Services.Localization;
using Nop.Services.Logging;
using Nop.Web.Factories;
using Nop.Web.Framework.Controllers;
using Nop.Web.Models.PrivateMessages;
namespace Nop.Web.Controllers;
[AutoValidateAntiforgeryToken]
public partial class PrivateMessagesController : BasePublicController
{
#region Fields
protected readonly ForumSettings _forumSettings;
protected readonly ICustomerActivityService _customerActivityService;
protected readonly ICustomerService _customerService;
protected readonly IForumService _forumService;
protected readonly ILocalizationService _localizationService;
protected readonly IPrivateMessagesModelFactory _privateMessagesModelFactory;
protected readonly IStoreContext _storeContext;
protected readonly IWorkContext _workContext;
#endregion
#region Ctor
public PrivateMessagesController(ForumSettings forumSettings,
ICustomerActivityService customerActivityService,
ICustomerService customerService,
IForumService forumService,
ILocalizationService localizationService,
IPrivateMessagesModelFactory privateMessagesModelFactory,
IStoreContext storeContext,
IWorkContext workContext)
{
_forumSettings = forumSettings;
_customerActivityService = customerActivityService;
_customerService = customerService;
_forumService = forumService;
_localizationService = localizationService;
_privateMessagesModelFactory = privateMessagesModelFactory;
_storeContext = storeContext;
_workContext = workContext;
}
#endregion
#region Methods
public virtual async Task Index(int? pageNumber, string tab)
{
if (!_forumSettings.AllowPrivateMessages)
{
return RedirectToRoute("Homepage");
}
if (await _customerService.IsGuestAsync(await _workContext.GetCurrentCustomerAsync()))
{
return Challenge();
}
var model = await _privateMessagesModelFactory.PreparePrivateMessageIndexModelAsync(pageNumber, tab);
return View(model);
}
[HttpPost, FormValueRequired("delete-inbox"), ActionName("InboxUpdate")]
public virtual async Task DeleteInboxPM(IFormCollection formCollection)
{
foreach (var key in formCollection.Keys)
{
var value = formCollection[key];
if (value.Equals("on") && key.StartsWith("pm", StringComparison.InvariantCultureIgnoreCase))
{
var id = key.Replace("pm", "").Trim();
if (int.TryParse(id, out var privateMessageId))
{
var pm = await _forumService.GetPrivateMessageByIdAsync(privateMessageId);
if (pm != null)
{
var customer = await _workContext.GetCurrentCustomerAsync();
if (pm.ToCustomerId == customer.Id)
{
pm.IsDeletedByRecipient = true;
await _forumService.UpdatePrivateMessageAsync(pm);
}
}
}
}
}
return RedirectToRoute("PrivateMessages");
}
[HttpPost, FormValueRequired("mark-unread"), ActionName("InboxUpdate")]
public virtual async Task MarkUnread(IFormCollection formCollection)
{
foreach (var key in formCollection.Keys)
{
var value = formCollection[key];
if (value.Equals("on") && key.StartsWith("pm", StringComparison.InvariantCultureIgnoreCase))
{
var id = key.Replace("pm", "").Trim();
if (int.TryParse(id, out var privateMessageId))
{
var pm = await _forumService.GetPrivateMessageByIdAsync(privateMessageId);
if (pm != null)
{
var customer = await _workContext.GetCurrentCustomerAsync();
if (pm.ToCustomerId == customer.Id)
{
pm.IsRead = false;
await _forumService.UpdatePrivateMessageAsync(pm);
}
}
}
}
}
return RedirectToRoute("PrivateMessages");
}
//updates sent items (deletes PrivateMessages)
[HttpPost, FormValueRequired("delete-sent"), ActionName("SentUpdate")]
public virtual async Task DeleteSentPM(IFormCollection formCollection)
{
foreach (var key in formCollection.Keys)
{
var value = formCollection[key];
if (value.Equals("on") && key.StartsWith("si", StringComparison.InvariantCultureIgnoreCase))
{
var id = key.Replace("si", "").Trim();
if (int.TryParse(id, out var privateMessageId))
{
var pm = await _forumService.GetPrivateMessageByIdAsync(privateMessageId);
if (pm != null)
{
var customer = await _workContext.GetCurrentCustomerAsync();
if (pm.FromCustomerId == customer.Id)
{
pm.IsDeletedByAuthor = true;
await _forumService.UpdatePrivateMessageAsync(pm);
}
}
}
}
}
return RedirectToRoute("PrivateMessages", new { tab = "sent" });
}
public virtual async Task SendPM(int toCustomerId, int? replyToMessageId)
{
if (!_forumSettings.AllowPrivateMessages)
return RedirectToRoute("Homepage");
if (await _customerService.IsGuestAsync(await _workContext.GetCurrentCustomerAsync()))
return Challenge();
var customerTo = await _customerService.GetCustomerByIdAsync(toCustomerId);
if (customerTo == null || await _customerService.IsGuestAsync(customerTo))
return RedirectToRoute("PrivateMessages");
PrivateMessage replyToPM = null;
if (replyToMessageId.HasValue)
{
//reply to a previous PM
replyToPM = await _forumService.GetPrivateMessageByIdAsync(replyToMessageId.Value);
}
var model = await _privateMessagesModelFactory.PrepareSendPrivateMessageModelAsync(customerTo, replyToPM);
return View(model);
}
[HttpPost]
public virtual async Task SendPM(SendPrivateMessageModel model)
{
if (!_forumSettings.AllowPrivateMessages)
{
return RedirectToRoute("Homepage");
}
var customer = await _workContext.GetCurrentCustomerAsync();
if (await _customerService.IsGuestAsync(customer))
{
return Challenge();
}
Customer toCustomer;
var replyToPM = await _forumService.GetPrivateMessageByIdAsync(model.ReplyToMessageId);
if (replyToPM != null)
{
//reply to a previous PM
if (replyToPM.ToCustomerId == customer.Id || replyToPM.FromCustomerId == customer.Id)
{
//Reply to already sent PM (by current customer) should not be sent to yourself
toCustomer = await _customerService.GetCustomerByIdAsync(replyToPM.FromCustomerId == customer.Id
? replyToPM.ToCustomerId
: replyToPM.FromCustomerId);
}
else
{
return RedirectToRoute("PrivateMessages");
}
}
else
{
//first PM
toCustomer = await _customerService.GetCustomerByIdAsync(model.ToCustomerId);
}
if (toCustomer == null || await _customerService.IsGuestAsync(toCustomer))
{
return RedirectToRoute("PrivateMessages");
}
if (ModelState.IsValid)
{
try
{
var subject = model.Subject;
if (_forumSettings.PMSubjectMaxLength > 0 && subject.Length > _forumSettings.PMSubjectMaxLength)
{
subject = subject[0.._forumSettings.PMSubjectMaxLength];
}
var text = model.Message;
if (_forumSettings.PMTextMaxLength > 0 && text.Length > _forumSettings.PMTextMaxLength)
{
text = text[0.._forumSettings.PMTextMaxLength];
}
var nowUtc = DateTime.UtcNow;
var store = await _storeContext.GetCurrentStoreAsync();
var privateMessage = new PrivateMessage
{
StoreId = store.Id,
ToCustomerId = toCustomer.Id,
FromCustomerId = customer.Id,
Subject = subject,
Text = text,
IsDeletedByAuthor = false,
IsDeletedByRecipient = false,
IsRead = false,
CreatedOnUtc = nowUtc
};
await _forumService.InsertPrivateMessageAsync(privateMessage);
//activity log
await _customerActivityService.InsertActivityAsync("PublicStore.SendPM",
string.Format(await _localizationService.GetResourceAsync("ActivityLog.PublicStore.SendPM"), toCustomer.Email), toCustomer);
return RedirectToRoute("PrivateMessages", new { tab = "sent" });
}
catch (Exception ex)
{
ModelState.AddModelError("", ex.Message);
}
}
model = await _privateMessagesModelFactory.PrepareSendPrivateMessageModelAsync(toCustomer, replyToPM);
return View(model);
}
public virtual async Task ViewPM(int privateMessageId)
{
if (!_forumSettings.AllowPrivateMessages)
{
return RedirectToRoute("Homepage");
}
var customer = await _workContext.GetCurrentCustomerAsync();
if (await _customerService.IsGuestAsync(customer))
{
return Challenge();
}
var pm = await _forumService.GetPrivateMessageByIdAsync(privateMessageId);
if (pm != null)
{
if (pm.ToCustomerId != customer.Id && pm.FromCustomerId != customer.Id)
{
return RedirectToRoute("PrivateMessages");
}
if (!pm.IsRead && pm.ToCustomerId == customer.Id)
{
pm.IsRead = true;
await _forumService.UpdatePrivateMessageAsync(pm);
}
}
else
{
return RedirectToRoute("PrivateMessages");
}
var model = await _privateMessagesModelFactory.PreparePrivateMessageModelAsync(pm);
return View(model);
}
public virtual async Task DeletePM(int privateMessageId)
{
if (!_forumSettings.AllowPrivateMessages)
{
return RedirectToRoute("Homepage");
}
var customer = await _workContext.GetCurrentCustomerAsync();
if (await _customerService.IsGuestAsync(customer))
{
return Challenge();
}
var pm = await _forumService.GetPrivateMessageByIdAsync(privateMessageId);
if (pm != null)
{
if (pm.FromCustomerId == customer.Id)
{
pm.IsDeletedByAuthor = true;
await _forumService.UpdatePrivateMessageAsync(pm);
}
if (pm.ToCustomerId == customer.Id)
{
pm.IsDeletedByRecipient = true;
await _forumService.UpdatePrivateMessageAsync(pm);
}
}
return RedirectToRoute("PrivateMessages");
}
#endregion
}