public ActionResult Conversation(int id) { var model = new Messenger(); // get conversation model.Conversation = ConversationService.Get(id); if (model.Conversation == null) { ThrowResponseException(HttpStatusCode.NotFound, $"Conversation with id {id} not found"); } // mark conversation as read (if needed) if (model.Conversation.ReadAt == null) { model.Conversation = ConversationService.SetRead(id, DateTime.UtcNow); } else if (model.Conversation.LastMessage != null && model.Conversation.ReadAt < model.Conversation.LastMessage.CreatedAt) { // NOTE: do not assign the read conversation to model.Conversation since that will prevent rendering of the "New messages" separator ConversationService.SetRead(model.Conversation.Id, DateTime.UtcNow); } // get first page of messages (and reverse them for easier rendering in correct order) model.Messages = ConversationService.GetMessages(id, new QueryOptions { Top = MAX_PAGE_SIZE }); model.Messages.Reverse(); return(View(model)); }
public PartialViewResult PartialMessages(int id, QueryOptions opts) { // limit page size to 25 opts.Top = Math.Min(opts.Top ?? MAX_PAGE_SIZE, MAX_PAGE_SIZE); var model = new Messenger(); model.Conversation = ConversationService.Get(id); model.Messages = ConversationService.GetMessages(model.Conversation.Id, opts); model.Messages.Reverse(); return(PartialView("_Messages", model)); }
public IHttpActionResult GetMessages(int id, QueryOptions opts) { var conversation = ConversationService.Get(id); if (conversation == null) { ThrowResponseException(HttpStatusCode.NotFound, "Conversation with id " + id + " not found"); } var messages = ConversationService.GetMessages(id, opts); messages.Reverse(); return(Ok(new ScrollableList <Message>(messages, Request.RequestUri))); }
public async Task <IActionResult> GetMessages(int id) { UserConversation conversation = _conversationService.GetUserConversation(id); if (conversation == null) { return(Forbid()); } IEnumerable <Message> messages = await _conversationService.GetMessages(id); return(Ok(_mapper.Map <IEnumerable <MessageDto> >(messages.Reverse()))); }
public IHttpActionResult GetMessages(int id, QueryOptions opts) { var messagesOut = new List <MessageOutModel>(); var conversation = GetConversation(id); var messages = ConversationService.GetMessages(id, opts); foreach (var m in messages) { var seenBy = GetSeenBy(m, messages, conversation.Members); var messageOut = GetMessageOut(m, seenBy); messagesOut.Add(messageOut); } messagesOut.Reverse(); return(Ok(new ScrollableList <MessageOutModel>(messagesOut, null, null, null, Request.RequestUri))); }
public ActionResult Messenger(int?id, QueryOptions opts) { // limit page size to 25 opts.Top = Math.Min(opts.Top ?? MAX_PAGE_SIZE, MAX_PAGE_SIZE); var model = new Messenger { ConversationId = id }; if (model.ConversationId != null) { // get selected conversation model.Conversation = ConversationService.Get(model.ConversationId.Value); if (model.Conversation == null) { ThrowResponseException(HttpStatusCode.NotFound, $"Conversation with id {model.ConversationId.Value} not found"); } } else { // get most recent conversation model.Conversation = ConversationService.Search(new ConversationQuery { OrderBy = "PinnedAt DESC, LastMessageAt DESC", Top = 1 }).FirstOrDefault(); } if (model.Conversation != null) { if (model.ConversationId != null) { // mark conversation as read (if needed) if (model.Conversation.ReadAt == null) { model.Conversation = ConversationService.SetRead(model.Conversation.Id, DateTime.UtcNow); } else if (model.Conversation.ReadAt < model.Conversation.LastMessage?.CreatedAt) { // NOTE: do not assign the read conversation to model.Conversation since that will prevent rendering of the "New messages" separator ConversationService.SetRead(model.Conversation.Id, DateTime.UtcNow); } } // get first page of messages (and reverse them for easier rendering in correct order) model.Messages = ConversationService.GetMessages(model.Conversation.Id, new QueryOptions { Top = MAX_PAGE_SIZE }); model.Messages.Reverse(); } // Meetings model.ZoomEnabled = ConfigurationService.ZoomMeetings; model.TeamsEnabled = ConfigurationService.TeamsMeetings; // NOTE: we load conversations last so that selected conversation does not appear unread in the list var query = new ConversationQuery(opts); query.UserId = User.Id; query.OrderBy = "PinnedAt DESC, LastMessageAt DESC"; model.Conversations = ConversationService.Search(query); // make sure selected conversation is visible in conversations list while (model.Conversation != null && !model.Conversations.Any(x => x.Id == model.Conversation.Id)) { query.Top += PageSizes.First(); model.Conversations = ConversationService.Search(query); } return(View(nameof(Messenger), model)); }