Exemple #1
0
        public async Task Merge(DataModels.Topic sourceTopic, DataModels.Topic targetTopic)
        {
            await UpdateMessagesTopicId(sourceTopic, targetTopic);
            await RebuildTopicReplies(targetTopic);
            await RemoveTopic(sourceTopic);

            await DbContext.SaveChangesAsync();
        }
Exemple #2
0
        public async Task RemoveTopic(DataModels.Topic topic)
        {
            await RemoveTopicViewLogs(topic.Id);
            await RemoveTopicBookmarks(topic.Id);
            await RemoveTopicBoards(topic.Id);
            await RemoveTopicMessages(topic.Id);

            topic.Deleted = true;
            DbContext.Update(topic);
        }
Exemple #3
0
        public async Task UpdateMessagesTopicId(DataModels.Topic sourceTopic, DataModels.Topic targetTopic)
        {
            var sourceMessages = await DbContext.Messages.Where(item => item.TopicId == sourceTopic.Id).ToListAsync();

            foreach (var message in sourceMessages)
            {
                message.TopicId = targetTopic.Id;
                DbContext.Update(message);
            }
        }
Exemple #4
0
 public vTopic(DataModels.Topic topic)
 {
     ID                = topic.ID;
     ForumID           = topic.ForumID;
     ForumTitle        = topic.Forum.Title;
     Gravatar          = "/Avatar/" + topic.UserID;
     Nickname          = Helpers.ColorName.GetNicknameHtml(topic.User.Username, topic.User.Role);
     RepliesCount      = topic.Replies.Count;
     Time              = topic.LastReply;
     Title             = HttpUtility.HtmlEncode(topic.Title);
     Top               = topic.Top;
     UserID            = topic.UserID;
     HasReply          = topic.Replies.Count == 0 ? false : true;
     LastReplyNickname = topic.Replies.Count == 0 ? null : topic.Replies.OrderBy(x => x.Time).Last().User.Username;
     LastReplyUserID   = topic.Replies.Count == 0 ? null : (int?)(topic.Replies.OrderBy(x => x.Time).Last().UserID);
     Reward            = topic.Reward;
 }
Exemple #5
0
        public ActionResult Create(ViewModels.vPost model)
        {
            if ((from f in DbContext.Forums where f.ID == model.ForumID && f.FatherID != null select f).Count() == 0)
            {
                return(Message("没有找到这个论坛版块!"));
            }
            if (string.IsNullOrEmpty(model.Content))
            {
                return(Message("内容不能为空!"));
            }
            if (string.IsNullOrEmpty(model.Title))
            {
                return(Message("标题不能为空!"));
            }
            if (model.Reward > 0)
            {
                if (CurrentUser.Coins < model.Reward)
                {
                    return(Message("您的金币不足,无法发出悬赏。"));
                }
                else
                {
                    var user = DbContext.Users.Find(CurrentUser.ID);
                    user.Coins -= model.Reward;
                }
            }
            var topic = new DataModels.Topic
            {
                ForumID   = model.ForumID,
                Title     = model.Title,
                Content   = model.Content,
                UserID    = CurrentUser.ID,
                Time      = DateTime.Now,
                Top       = false,
                LastReply = DateTime.Now,
                Reward    = model.Reward
            };

            DbContext.Topics.Add(topic);
            DbContext.SaveChanges();
            HomeController.RefreshHomeTopicsCache();
            return(RedirectToAction("Index", "Topic", new { id = topic.ID }));
        }
        public async Task DeleteMessageFromTopic(DataModels.Message message, DataModels.Topic topic)
        {
            var directRepliesQuery = from m in DbContext.Messages
                                     where m.ReplyId == message.Id
                                     where !m.Deleted
                                     select m;

            foreach (var reply in directRepliesQuery)
            {
                reply.OriginalBody =
                    $"[quote]{message.OriginalBody}\n" +
                    $"Message deleted by {CurrentUser.ApplicationUser.DisplayName} on {DateTime.Now.ToString("MMMM dd, yyyy")}[/quote]" +
                    reply.OriginalBody;

                reply.ReplyId = 0;

                DbContext.Update(reply);
            }

            message.Deleted = true;
            DbContext.Update(message);
            await DbContext.SaveChangesAsync();
        }
Exemple #7
0
        public async Task RebuildTopicReplies(DataModels.Topic topic)
        {
            var messagesQuery = from message in DbContext.Messages
                                where message.TopicId == topic.Id && !message.Deleted
                                select new {
                message.Id,
                message.TimePosted,
                message.PostedById,
                message.ShortPreview
            };

            var messages = await messagesQuery.ToListAsync();

            var replyCount = messages.Count() - 1;

            if (topic.ReplyCount != replyCount)
            {
                topic.ReplyCount = replyCount;
            }

            var firstMessage = messages.First();

            topic.FirstMessageId           = firstMessage.Id;
            topic.FirstMessageTimePosted   = firstMessage.TimePosted;
            topic.FirstMessagePostedById   = firstMessage.PostedById;
            topic.FirstMessageShortPreview = firstMessage.ShortPreview;

            var lastMessage = messages.Last();

            topic.LastMessageId           = lastMessage.Id;
            topic.LastMessageTimePosted   = lastMessage.TimePosted;
            topic.LastMessagePostedById   = lastMessage.PostedById;
            topic.LastMessageShortPreview = lastMessage.ShortPreview;

            DbContext.Update(topic);
        }
Exemple #8
0
        public async Task <ControllerModels.Topics.CreateTopicResult> CreateTopic(ControllerModels.Topics.CreateTopicInput input)
        {
            var result = new ControllerModels.Topics.CreateTopicResult();

            var processedMessage = await MessageRepository.ProcessMessageInput(input.Body);

            result.Errors = processedMessage.Errors;

            if (!result.Errors.Any())
            {
                var message = await MessageRepository.CreateMessageRecord(processedMessage);

                var topic = new DataModels.Topic {
                    FirstMessageId           = message.Id,
                    FirstMessagePostedById   = message.PostedById,
                    FirstMessageTimePosted   = message.TimePosted,
                    FirstMessageShortPreview = message.ShortPreview,
                    LastMessageId            = message.Id,
                    LastMessagePostedById    = message.PostedById,
                    LastMessageTimePosted    = message.TimePosted,
                    LastMessageShortPreview  = message.ShortPreview,
                };

                DbContext.Topics.Add(topic);
                await DbContext.SaveChangesAsync();

                message.TopicId = topic.Id;
                DbContext.Update(message);

                MessageRepository.UpdateTopicParticipation(topic.Id, UserContext.ApplicationUser.Id, message.TimePosted);

                var boards = await BoardRepository.Records();

                foreach (var selectedBoard in input.SelectedBoards)
                {
                    var board = boards.FirstOrDefault(item => item.Id == selectedBoard);

                    if (board != null)
                    {
                        DbContext.TopicBoards.Add(new DataModels.TopicBoard {
                            TopicId   = topic.Id,
                            BoardId   = board.Id,
                            TimeAdded = DateTime.Now,
                            UserId    = UserContext.ApplicationUser.Id
                        });
                    }
                }

                await DbContext.SaveChangesAsync();

                await ForumHub.Clients.All.SendAsync("new-topic", new HubModels.Message {
                    TopicId   = topic.Id,
                    MessageId = message.Id
                });

                result.TopicId   = topic.Id;
                result.MessageId = message.Id;
            }

            return(result);
        }