//public BasicJsonMessage<Topic> PostNewTopic(Forum forum, User user, ForumPermissionContext permissionContext, NewPost newPost, string ip, string userUrl, Func<Topic, string> topicLinkGenerator) //{ //} public Topic PostNewTopic(Forum forum, User user, ForumPermissionContext permissionContext, NewPost newPost, string ip, string userUrl, Func <Topic, string> topicLinkGenerator) { if (!permissionContext.UserCanPost || !permissionContext.UserCanView) { throw new Exception($"User {user.Name} can't post to forum {forum.Title}."); } newPost.Title = _textParsingService.Censor(newPost.Title); // TODO: text parsing is controller, see issue #121 https://github.com/POPWorldMedia/POPForums/issues/121 var urlName = newPost.Title.ToUniqueUrlName(_topicRepository.GetUrlNamesThatStartWith(newPost.Title.ToUrlName())); var timeStamp = DateTime.UtcNow; var topicID = _topicRepository.Create(forum.ForumID, newPost.Title, 0, 0, user.UserID, user.Name, user.UserID, user.Name, timeStamp, false, false, false, urlName); var postID = _postRepository.Create(topicID, 0, ip, true, newPost.IncludeSignature, user.UserID, user.Name, newPost.Title, newPost.FullText, timeStamp, false, user.Name, null, false, 0); _forumRepository.UpdateLastTimeAndUser(forum.ForumID, timeStamp, user.Name); _forumRepository.IncrementPostAndTopicCount(forum.ForumID); _profileRepository.SetLastPostID(user.UserID, postID); var topic = new Topic { TopicID = topicID, ForumID = forum.ForumID, IsClosed = false, IsDeleted = false, IsPinned = false, LastPostName = user.Name, LastPostTime = timeStamp, LastPostUserID = user.UserID, ReplyCount = 0, StartedByName = user.Name, StartedByUserID = user.UserID, Title = newPost.Title, UrlName = urlName, ViewCount = 0 }; // <a href="{0}">{1}</a> started a new topic: <a href="{2}">{3}</a> var topicLink = topicLinkGenerator(topic); var message = String.Format(Resources.NewPostPublishMessage, userUrl, user.Name, topicLink, topic.Title); var forumHasViewRestrictions = _forumRepository.GetForumViewRoles(forum.ForumID).Count > 0; _eventPublisher.ProcessEvent(message, user, EventDefinitionService.StaticEventIDs.NewTopic, forumHasViewRestrictions); _eventPublisher.ProcessEvent(String.Empty, user, EventDefinitionService.StaticEventIDs.NewPost, true); forum = _forumRepository.Get(forum.ForumID); _broker.NotifyForumUpdate(forum); _broker.NotifyTopicUpdate(topic, forum, topicLink); _searchIndexQueueRepository.Enqueue(new SearchIndexPayload { TenantID = _tenantService.GetTenant(), TopicID = topic.TopicID }); return(topic); }
private Forum GetForumByIdWithPermissionContext(int forumID, out ForumPermissionContext permissionContext) { var forum = _forumService.Get(forumID); if (forum == null) { throw new Exception(String.Format("Forum {0} not found", forumID)); } permissionContext = _forumService.GetPermissionContext(forum, this.CurrentUser()); return(forum); }
private Forum GetForumByIdWithPermissionContext(int forumID, User user, out ForumPermissionContext permissionContext) { var forum = _forumService.Get(forumID); if (forum == null) { throw new Exception($"Forum {forumID} not found"); } permissionContext = _forumPermissionService.GetPermissionContext(forum, user); return(forum); }
private Forum GetForumByIdWithPermissionContext(int forumID, out ForumPermissionContext permissionContext) { var forum = _forumService.Get(forumID); if (forum == null) { throw new Exception(String.Format("Forum {0} not found", forumID)); } var user = _userRetrievalShim.GetUser(HttpContext); permissionContext = _forumService.GetPermissionContext(forum, user); return(forum); }
public Topic PostNewTopic(Forum forum, User user, ForumPermissionContext permissionContext, NewPost newPost, string ip, string userUrl, Func <Topic, string> topicLinkGenerator, DateTime timeStamp) { if (!permissionContext.UserCanPost || !permissionContext.UserCanView) { throw new Exception(String.Format("User {0} can't post to forum {1}.", user.Name, forum.Title)); } newPost.Title = _textParsingService.EscapeHtmlAndCensor(newPost.Title); if (newPost.IsPlainText) { newPost.FullText = _textParsingService.ForumCodeToHtml(newPost.FullText); } else { newPost.FullText = _textParsingService.ClientHtmlToHtml(newPost.FullText); } var urlName = newPost.Title.ToUniqueUrlName(_topicRepository.GetUrlNamesThatStartWith(newPost.Title.ToUrlName())); //var timeStamp = DateTime.UtcNow; var topicID = _topicRepository.Create(forum.ForumID, newPost.Title, 0, 0, user.UserID, user.Name, user.UserID, user.Name, timeStamp, false, false, false, false, urlName); var postID = _postRepository.Create(topicID, 0, ip, true, newPost.IncludeSignature, user.UserID, user.Name, newPost.Title, newPost.FullText, timeStamp, false, user.Name, null, false, 0, newPost.IsAnonymous, newPost.FileUrl); _forumRepository.UpdateLastTimeAndUser(forum.ForumID, timeStamp, user.Name); _forumRepository.IncrementPostAndTopicCount(forum.ForumID); _profileRepository.SetLastPostID(user.UserID, postID); var topic = new Topic(topicID) { ForumID = forum.ForumID, IsClosed = false, IsDeleted = false, IsIndexed = false, IsPinned = false, LastPostName = user.Name, LastPostTime = timeStamp, LastPostUserID = user.UserID, ReplyCount = 0, StartedByName = user.Name, StartedByUserID = user.UserID, Title = newPost.Title, UrlName = urlName, ViewCount = 0 }; // <a href="{0}">{1}</a> started a new topic: <a href="{2}">{3}</a> var topicLink = topicLinkGenerator(topic); var message = String.Format(Resources.NewPostPublishMessage, userUrl, user.Name, topicLink, topic.Title); var forumHasViewRestrictions = _forumRepository.GetForumViewRoles(forum.ForumID).Count > 0; _eventPublisher.ProcessEvent(message, user, EventDefinitionService.StaticEventIDs.NewTopic, forumHasViewRestrictions); _eventPublisher.ProcessEvent(String.Empty, user, EventDefinitionService.StaticEventIDs.NewPost, true); forum = _forumRepository.Get(forum.ForumID); _broker.NotifyForumUpdate(forum); _broker.NotifyTopicUpdate(topic, forum, topicLink); return(topic); }
private static TopicContainer ComposeTopicContainer(Topic topic, Forum forum, ForumPermissionContext permissionContext, bool isSubscribed, List <Post> posts, PagerContext pagerContext, bool isFavorite, Dictionary <int, string> signatures, Dictionary <int, int> avatars, List <int> votedPostIDs, DateTime?lastreadTime) { return(new TopicContainer { Forum = forum, Topic = topic, Posts = posts, PagerContext = pagerContext, PermissionContext = permissionContext, IsSubscribed = isSubscribed, IsFavorite = isFavorite, Signatures = signatures, Avatars = avatars, VotedPostIDs = votedPostIDs, LastReadTime = lastreadTime }); }
public ForumPermissionContext GetPermissionContext(Forum forum, User user, Topic topic) { var context = new ForumPermissionContext { DenialReason = String.Empty }; var viewRestrictionRoles = _forumRepository.GetForumViewRoles(forum.ForumID); var postRestrictionRoles = _forumRepository.GetForumPostRoles(forum.ForumID); // view if (viewRestrictionRoles.Count == 0) { context.UserCanView = true; } else { context.UserCanView = false; if (user != null && viewRestrictionRoles.Where(user.IsInRole).Count() > 0) { context.UserCanView = true; } } // post if (user == null || !context.UserCanView) { context.UserCanPost = false; context.DenialReason = Resources.LoginToPost; } else if (!user.IsApproved) { context.DenialReason += "You can't post until you have verified your account. "; context.UserCanPost = false; } else { if (postRestrictionRoles.Count == 0) { context.UserCanPost = true; } else { if (postRestrictionRoles.Where(user.IsInRole).Count() > 0) { context.UserCanPost = true; } else { context.DenialReason += Resources.ForumNoPost + ". "; context.UserCanPost = false; } } } if (topic != null && topic.IsClosed) { context.UserCanPost = false; context.DenialReason += Resources.Closed + ". "; } if (topic != null && topic.IsDeleted) { if (user == null || !user.IsInRole(PermanentRoles.Moderator)) { context.UserCanView = false; } context.DenialReason += "Topic is deleted. "; } if (forum.IsArchived) { context.UserCanPost = false; context.DenialReason += Resources.Archived + ". "; } // moderate context.UserCanModerate = false; if (user != null && (user.IsInRole(PermanentRoles.Admin) || user.IsInRole(PermanentRoles.Moderator))) { context.UserCanModerate = true; } return(context); }