public async Task Merge(DataModels.Topic sourceTopic, DataModels.Topic targetTopic) { await UpdateMessagesTopicId(sourceTopic, targetTopic); await RebuildTopicReplies(targetTopic); await RemoveTopic(sourceTopic); await DbContext.SaveChangesAsync(); }
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); }
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); } }
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; }
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(); }
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); }
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); }