Пример #1
0
        //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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #6
0
 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
     });
 }
Пример #7
0
        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);
        }