public ActionResult TopicEdit(EditForumTopicModel model) { if (!_forumSettings.ForumsEnabled) { return RedirectToRoute("HomePage"); } var forumTopic = _forumService.GetTopicById(model.Id); if (forumTopic == null) { return RedirectToRoute("Boards"); } var forum = forumTopic.Forum; if (forum == null) { return RedirectToRoute("Boards"); } if (ModelState.IsValid) { try { if (!_forumService.IsCustomerAllowedToEditTopic(_workContext.CurrentCustomer, forumTopic)) { return new HttpUnauthorizedResult(); } string subject = model.Subject; var maxSubjectLength = _forumSettings.TopicSubjectMaxLength; if (maxSubjectLength > 0 && subject.Length > maxSubjectLength) { subject = subject.Substring(0, maxSubjectLength); } var text = model.Text; var maxPostLength = _forumSettings.PostMaxLength; if (maxPostLength > 0 && text.Length > maxPostLength) { text = text.Substring(0, maxPostLength); } var topicType = ForumTopicType.Normal; string ipAddress = _webHelper.GetCurrentIpAddress(); DateTime nowUtc = DateTime.UtcNow; if (_forumService.IsCustomerAllowedToSetTopicPriority(_workContext.CurrentCustomer)) { topicType = (ForumTopicType) Enum.ToObject(typeof (ForumTopicType), model.TopicTypeId); } //forum topic forumTopic.TopicTypeId = (int) topicType; forumTopic.Subject = subject; forumTopic.UpdatedOnUtc = nowUtc; _forumService.UpdateTopic(forumTopic); //forum post var firstPost = forumTopic.GetFirstPost(_forumService); if (firstPost != null) { firstPost.Text = text; firstPost.UpdatedOnUtc = nowUtc; _forumService.UpdatePost(firstPost); } else { //error (not possible) firstPost = new ForumPost { TopicId = forumTopic.Id, CustomerId = forumTopic.CustomerId, Text = text, IPAddress = ipAddress, UpdatedOnUtc = nowUtc }; _forumService.InsertPost(firstPost, false); } //subscription if (_forumService.IsCustomerAllowedToSubscribe(_workContext.CurrentCustomer)) { var forumSubscription = _forumService.GetAllSubscriptions(_workContext.CurrentCustomer.Id, 0, forumTopic.Id, 0, 1).FirstOrDefault(); if (model.Subscribed) { if (forumSubscription == null) { forumSubscription = new ForumSubscription { SubscriptionGuid = Guid.NewGuid(), CustomerId = _workContext.CurrentCustomer.Id, TopicId = forumTopic.Id, CreatedOnUtc = nowUtc }; _forumService.InsertSubscription(forumSubscription); } } else { if (forumSubscription != null) { _forumService.DeleteSubscription(forumSubscription); } } } // redirect to the topic page with the topic slug return RedirectToRoute("TopicSlug", new {id = forumTopic.Id, slug = forumTopic.GetSeName()}); } catch (Exception ex) { ModelState.AddModelError("", ex.Message); } } // redisplay form model.TopicPriorities = ForumTopicTypesList(); model.IsEdit = true; model.ForumName = forum.Name; model.ForumSeName = forum.GetSeName(); model.ForumId = forum.Id; model.ForumEditor = _forumSettings.ForumEditor; model.IsCustomerAllowedToSetTopicPriority = _forumService.IsCustomerAllowedToSetTopicPriority(_workContext.CurrentCustomer); model.IsCustomerAllowedToSubscribe = _forumService.IsCustomerAllowedToSubscribe(_workContext.CurrentCustomer); return View(model); }
public ActionResult PostCreate(EditForumPostModel model) { if (!_forumSettings.ForumsEnabled) { return RedirectToRoute("HomePage"); } var forumTopic = _forumService.GetTopicById(model.ForumTopicId); if (forumTopic == null) { return RedirectToRoute("Boards"); } if (ModelState.IsValid) { try { if (!_forumService.IsCustomerAllowedToCreatePost(_workContext.CurrentCustomer, forumTopic)) return new HttpUnauthorizedResult(); var text = model.Text; var maxPostLength = _forumSettings.PostMaxLength; if (maxPostLength > 0 && text.Length > maxPostLength) text = text.Substring(0, maxPostLength); string ipAddress = _webHelper.GetCurrentIpAddress(); DateTime nowUtc = DateTime.UtcNow; var forumPost = new ForumPost { TopicId = forumTopic.Id, CustomerId = _workContext.CurrentCustomer.Id, Text = text, IPAddress = ipAddress, CreatedOnUtc = nowUtc, UpdatedOnUtc = nowUtc }; _forumService.InsertPost(forumPost, true); //subscription if (_forumService.IsCustomerAllowedToSubscribe(_workContext.CurrentCustomer)) { var forumSubscription = _forumService.GetAllSubscriptions(_workContext.CurrentCustomer.Id, 0, forumPost.TopicId, 0, 1).FirstOrDefault(); if (model.Subscribed) { if (forumSubscription == null) { forumSubscription = new ForumSubscription { SubscriptionGuid = Guid.NewGuid(), CustomerId = _workContext.CurrentCustomer.Id, TopicId = forumPost.TopicId, CreatedOnUtc = nowUtc }; _forumService.InsertSubscription(forumSubscription); } } else { if (forumSubscription != null) { _forumService.DeleteSubscription(forumSubscription); } } } int pageSize = 10; if (_forumSettings.PostsPageSize > 0) pageSize = _forumSettings.PostsPageSize; int pageIndex = (_forumService.CalculateTopicPageIndex(forumPost.TopicId, pageSize, forumPost.Id) + 1); var url = string.Empty; if (pageIndex > 1) { url = Url.RouteUrl("TopicSlugPaged", new { id = forumPost.TopicId, slug = forumPost.ForumTopic.GetSeName(), page = pageIndex }); } else { url = Url.RouteUrl("TopicSlug", new { id = forumPost.TopicId, slug = forumPost.ForumTopic.GetSeName() }); } return Redirect(string.Format("{0}#{1}", url, forumPost.Id)); } catch (Exception ex) { ModelState.AddModelError("", ex.Message); } } // redisplay form var forum = forumTopic.Forum; if (forum == null) return RedirectToRoute("Boards"); model.IsEdit = false; model.ForumName = forum.Name; model.ForumTopicId = forumTopic.Id; model.ForumTopicSubject = forumTopic.Subject; model.ForumTopicSeName = forumTopic.GetSeName(); model.Id = 0; model.IsCustomerAllowedToSubscribe = _forumService.IsCustomerAllowedToSubscribe(_workContext.CurrentCustomer); model.ForumEditor = _forumSettings.ForumEditor; return View(model); }
/// <summary> /// Sends a forum subscription message to a customer /// </summary> /// <param name="customer">Customer instance</param> /// <param name="forumPost">Forum post</param> /// <param name="forumTopic">Forum Topic</param> /// <param name="forum">Forum</param> /// <param name="friendlyForumTopicPageIndex">Friendly (starts with 1) forum topic page to use for URL generation</param> /// <param name="languageId">Message language identifier</param> /// <returns>Queued email identifier</returns> public int SendNewForumPostMessage(Customer customer, ForumPost forumPost, ForumTopic forumTopic, Forum forum, int friendlyForumTopicPageIndex, int languageId) { if (customer == null) { throw new ArgumentNullException("customer"); } var messageTemplate = GetLocalizedActiveMessageTemplate("Forums.NewForumPost", languageId); if (messageTemplate == null || !messageTemplate.IsActive) { return 0; } var tokens = GenerateTokens(forumPost, friendlyForumTopicPageIndex, forumPost.Id); //event notification _eventPublisher.MessageTokensAdded(messageTemplate, tokens); var emailAccount = GetEmailAccountOfMessageTemplate(messageTemplate, languageId); var toEmail = customer.Email; var toName = customer.GetFullName(); return SendNotification(messageTemplate, emailAccount, languageId, tokens, toEmail, toName); }
public ActionResult TopicCreate(EditForumTopicModel model) { if (!_forumSettings.ForumsEnabled) { return RedirectToRoute("HomePage"); } var forum = _forumService.GetForumById(model.ForumId); if (forum == null) { return RedirectToRoute("Boards"); } if (ModelState.IsValid) { try { if (!_forumService.IsCustomerAllowedToCreateTopic(_workContext.CurrentCustomer, forum)) { return new HttpUnauthorizedResult(); } string subject = model.Subject; var maxSubjectLength = _forumSettings.TopicSubjectMaxLength; if (maxSubjectLength > 0 && subject.Length > maxSubjectLength) { subject = subject.Substring(0, maxSubjectLength); } var text = model.Text; var maxPostLength = _forumSettings.PostMaxLength; if (maxPostLength > 0 && text.Length > maxPostLength) { text = text.Substring(0, maxPostLength); } var topicType = ForumTopicType.Normal; string ipAddress = _webHelper.GetCurrentIpAddress(); var nowUtc = DateTime.UtcNow; if (_forumService.IsCustomerAllowedToSetTopicPriority(_workContext.CurrentCustomer)) { topicType = (ForumTopicType) Enum.ToObject(typeof (ForumTopicType), model.TopicTypeId); } //forum topic var forumTopic = new ForumTopic { ForumId = forum.Id, CustomerId = _workContext.CurrentCustomer.Id, TopicTypeId = (int) topicType, Subject = subject, CreatedOnUtc = nowUtc, UpdatedOnUtc = nowUtc }; _forumService.InsertTopic(forumTopic, true); //forum post var forumPost = new ForumPost { TopicId = forumTopic.Id, CustomerId = _workContext.CurrentCustomer.Id, Text = text, IPAddress = ipAddress, CreatedOnUtc = nowUtc, UpdatedOnUtc = nowUtc }; _forumService.InsertPost(forumPost, false); //update forum topic forumTopic.NumPosts = 1; forumTopic.LastPostId = forumPost.Id; forumTopic.LastPostCustomerId = forumPost.CustomerId; forumTopic.LastPostTime = forumPost.CreatedOnUtc; forumTopic.UpdatedOnUtc = nowUtc; _forumService.UpdateTopic(forumTopic); //subscription if (_forumService.IsCustomerAllowedToSubscribe(_workContext.CurrentCustomer)) { if (model.Subscribed) { var forumSubscription = new ForumSubscription { SubscriptionGuid = Guid.NewGuid(), CustomerId = _workContext.CurrentCustomer.Id, TopicId = forumTopic.Id, CreatedOnUtc = nowUtc }; _forumService.InsertSubscription(forumSubscription); } } return RedirectToRoute("TopicSlug", new {id = forumTopic.Id, slug = forumTopic.GetSeName()}); } catch (Exception ex) { ModelState.AddModelError("", ex.Message); } } // redisplay form model.TopicPriorities = ForumTopicTypesList(); model.IsEdit = false; model.ForumId = forum.Id; model.ForumName = forum.Name; model.ForumSeName = forum.GetSeName(); model.Id = 0; model.IsCustomerAllowedToSetTopicPriority = _forumService.IsCustomerAllowedToSetTopicPriority(_workContext.CurrentCustomer); model.IsCustomerAllowedToSubscribe = _forumService.IsCustomerAllowedToSubscribe(_workContext.CurrentCustomer); model.ForumEditor = _forumSettings.ForumEditor; return View(model); }
public void Can_save_and_load_forumpost() { var customer = GetTestCustomer(); var customerFromDb = SaveAndLoadEntity(customer); customerFromDb.ShouldNotBeNull(); var forumGroup = new ForumGroup { Name = "Forum Group 1", DisplayOrder = 1, CreatedOnUtc = DateTime.UtcNow, UpdatedOnUtc = DateTime.UtcNow }; var forumGroupFromDb = SaveAndLoadEntity(forumGroup); forumGroupFromDb.ShouldNotBeNull(); forumGroupFromDb.Name.ShouldEqual("Forum Group 1"); forumGroupFromDb.DisplayOrder.ShouldEqual(1); var forum = new Forum { ForumGroup = forumGroupFromDb, Name = "Forum 1", Description = "Forum 1 Description", ForumGroupId = forumGroupFromDb.Id, DisplayOrder = 10, CreatedOnUtc = DateTime.UtcNow, UpdatedOnUtc = DateTime.UtcNow, NumPosts = 25, NumTopics = 15 }; forumGroup.Forums.Add(forum); var forumFromDb = SaveAndLoadEntity(forum); forumFromDb.ShouldNotBeNull(); forumFromDb.Name.ShouldEqual("Forum 1"); forumFromDb.Description.ShouldEqual("Forum 1 Description"); forumFromDb.DisplayOrder.ShouldEqual(10); forumFromDb.NumTopics.ShouldEqual(15); forumFromDb.NumPosts.ShouldEqual(25); forumFromDb.ForumGroupId.ShouldEqual(forumGroupFromDb.Id); var forumTopic = new ForumTopic { Subject = "Forum Topic 1", ForumId = forumFromDb.Id, TopicTypeId = (int)ForumTopicType.Sticky, Views = 123, CreatedOnUtc = DateTime.UtcNow, UpdatedOnUtc = DateTime.UtcNow, NumPosts = 100, CustomerId = customerFromDb.Id, }; var forumTopicFromDb = SaveAndLoadEntity(forumTopic); forumTopicFromDb.ShouldNotBeNull(); forumTopicFromDb.Subject.ShouldEqual("Forum Topic 1"); forumTopicFromDb.Views.ShouldEqual(123); forumTopicFromDb.NumPosts.ShouldEqual(100); forumTopicFromDb.TopicTypeId.ShouldEqual((int)ForumTopicType.Sticky); forumTopicFromDb.ForumId.ShouldEqual(forumFromDb.Id); var forumPost = new ForumPost { Text = "Forum Post 1 Text", ForumTopic = forumTopicFromDb, TopicId = forumTopicFromDb.Id, IPAddress = "127.0.0.1", CreatedOnUtc = DateTime.UtcNow, UpdatedOnUtc = DateTime.UtcNow, CustomerId = customerFromDb.Id, }; var forumPostFromDb = SaveAndLoadEntity(forumPost); forumPostFromDb.ShouldNotBeNull(); forumPostFromDb.Text.ShouldEqual("Forum Post 1 Text"); forumPostFromDb.IPAddress.ShouldEqual("127.0.0.1"); forumPostFromDb.TopicId.ShouldEqual(forumTopicFromDb.Id); }
private IList<Token> GenerateTokens(ForumPost forumPost, int friendlyForumTopicPageIndex, int appendPostIdentifier) { var tokens = new List<Token>(); _messageTokenProvider.AddStoreTokens(tokens); _messageTokenProvider.AddForumPostTokens(tokens, forumPost); _messageTokenProvider.AddForumTopicTokens(tokens, forumPost.ForumTopic, friendlyForumTopicPageIndex, appendPostIdentifier); _messageTokenProvider.AddForumTokens(tokens, forumPost.ForumTopic.Forum); return tokens; }
/// <summary> /// Updates the forum post /// </summary> /// <param name="forumPost">Forum post</param> public virtual void UpdatePost(ForumPost forumPost) { //validation if (forumPost == null) { throw new ArgumentNullException("forumPost"); } _forumPostRepository.Update(forumPost); _cacheManager.RemoveByPattern(FORUMGROUP_PATTERN_KEY); _cacheManager.RemoveByPattern(FORUM_PATTERN_KEY); //event notification _eventPublisher.EntityUpdated(forumPost); }
/// <summary> /// Sends a forum subscription message to a customer /// </summary> /// <param name="customer">Customer instance</param> /// <param name="forumPost">Forum post</param> /// <param name="forumTopic">Forum Topic</param> /// <param name="forum">Forum</param> /// <param name="friendlyForumTopicPageIndex">Friendly (starts with 1) forum topic page to use for URL generation</param> /// <param name="languageId">Message language identifier</param> /// <returns>Queued email identifier</returns> public int SendNewForumPostMessage(Customer customer, ForumPost forumPost, ForumTopic forumTopic, Forum forum, int friendlyForumTopicPageIndex, int languageId) { if (customer == null) { throw new ArgumentNullException("customer"); } var store = _storeContext.CurrentStore; var messageTemplate = GetActiveMessageTemplate("Forums.NewForumPost", store.Id); if (messageTemplate == null ) { return 0; } //email account var emailAccount = GetEmailAccountOfMessageTemplate(messageTemplate, languageId); //tokens var tokens = new List<Token>(); _messageTokenProvider.AddStoreTokens(tokens, store, emailAccount); _messageTokenProvider.AddForumPostTokens(tokens, forumPost); _messageTokenProvider.AddForumTopicTokens(tokens, forumPost.ForumTopic, friendlyForumTopicPageIndex, forumPost.Id); _messageTokenProvider.AddForumTokens(tokens, forumPost.ForumTopic.Forum); _messageTokenProvider.AddCustomerTokens(tokens, customer); //event notification _eventPublisher.MessageTokensAdded(messageTemplate, tokens); var toEmail = customer.Email; var toName = customer.GetFullName(); return SendNotification(messageTemplate, emailAccount, languageId, tokens, toEmail, toName); }
/// <summary> /// Deletes a forum post /// </summary> /// <param name="forumPost">Forum post</param> public virtual void DeletePost(ForumPost forumPost) { if (forumPost == null) { throw new ArgumentNullException("forumPost"); } int forumTopicId = forumPost.TopicId; int customerId = forumPost.CustomerId; var forumTopic = this.GetTopicById(forumTopicId); int forumId = forumTopic.ForumId; //delete topic if it was the first post bool deleteTopic = false; ForumPost firstPost = forumTopic.GetFirstPost(this); if (firstPost != null && firstPost.Id == forumPost.Id) { deleteTopic = true; } //delete forum post _forumPostRepository.Delete(forumPost); //delete topic if (deleteTopic) { DeleteTopic(forumTopic); } //update stats if (!deleteTopic) { UpdateForumTopicStats(forumTopicId); } UpdateForumStats(forumId); UpdateCustomerStats(customerId); //clear cache _cacheManager.RemoveByPattern(FORUMGROUP_PATTERN_KEY); _cacheManager.RemoveByPattern(FORUM_PATTERN_KEY); //event notification _eventPublisher.EntityDeleted(forumPost); }
/// <summary> /// Inserts a forum post /// </summary> /// <param name="forumPost">The forum post</param> /// <param name="sendNotifications">A value indicating whether to send notifications to subscribed customers</param> public virtual void InsertPost(ForumPost forumPost, bool sendNotifications) { if (forumPost == null) { throw new ArgumentNullException("forumPost"); } _forumPostRepository.Insert(forumPost); //update stats int customerId = forumPost.CustomerId; var forumTopic = this.GetTopicById(forumPost.TopicId); int forumId = forumTopic.ForumId; UpdateForumTopicStats(forumPost.TopicId); UpdateForumStats(forumId); UpdateCustomerStats(customerId); //clear cache _cacheManager.RemoveByPattern(FORUMGROUP_PATTERN_KEY); _cacheManager.RemoveByPattern(FORUM_PATTERN_KEY); //event notification _eventPublisher.EntityInserted(forumPost); //notifications if (sendNotifications) { var forum = forumTopic.Forum; var subscriptions = GetAllSubscriptions(topicId: forumTopic.Id); var languageId = _workContext.WorkingLanguage.Id; int friendlyTopicPageIndex = CalculateTopicPageIndex(forumPost.TopicId, _forumSettings.PostsPageSize > 0 ? _forumSettings.PostsPageSize : 10, forumPost.Id) + 1; foreach (ForumSubscription subscription in subscriptions) { if (subscription.CustomerId == forumPost.CustomerId) { continue; } if (!String.IsNullOrEmpty(subscription.Customer.Email)) { _workflowMessageService.SendNewForumPostMessage(subscription.Customer, forumPost, forumTopic, forum, friendlyTopicPageIndex, languageId); } } } }
/// <summary> /// Check whether customer is allowed to delete post /// </summary> /// <param name="customer">Customer</param> /// <param name="post">Topic</param> /// <returns>True if allowed, otherwise false</returns> public virtual bool IsCustomerAllowedToDeletePost(Customer customer, ForumPost post) { if (post == null) { return false; } if (customer == null) { return false; } if (customer.IsGuest()) { return false; } if (IsForumModerator(customer)) { return true; } if (_forumSettings.AllowCustomersToDeletePosts) { bool ownPost = customer.Id == post.CustomerId; return ownPost; } return false; }
public virtual void AddForumPostTokens(IList<Token> tokens, ForumPost forumPost) { tokens.Add(new Token("Forums.PostAuthor", forumPost.Customer.FormatUserName())); tokens.Add(new Token("Forums.PostBody", forumPost.FormatPostText(), true)); //event notification _eventPublisher.EntityTokensAdded(forumPost, tokens); }
public virtual void AddForumPostTokens(IList<Token> tokens, ForumPost forumPost) { tokens.Add(new Token("Forums.PostAuthor", forumPost.Customer.FormatUserName())); tokens.Add(new Token("Forums.PostBody", forumPost.FormatPostText(), true)); }
public virtual void AddForumPostTokens(IList<Token> tokens, ForumPost forumPost) { var customer = EngineContext.Current.Resolve<ICustomerService>().GetCustomerById(forumPost.CustomerId); tokens.Add(new Token("Forums.PostAuthor", customer.FormatUserName())); tokens.Add(new Token("Forums.PostBody", forumPost.FormatPostText(), true)); //event notification _eventPublisher.EntityTokensAdded(forumPost, tokens); }
private IList<Token> GenerateTokens(ForumPost forumPost) { var tokens = new List<Token>(); _messageTokenProvider.AddStoreTokens(tokens); _messageTokenProvider.AddForumPostTokens(tokens, forumPost); _messageTokenProvider.AddForumTopicTokens(tokens, forumPost.ForumTopic); _messageTokenProvider.AddForumTokens(tokens, forumPost.ForumTopic.Forum); return tokens; }