public IActionResult SendMessageToUser([Bind("AssetId, Subject, Body, SenderId, RecieverId")] MessageThreadDTO messageThreadDTO) { messageThreadDTO.RecieverId = HttpContext.Request.Cookies["RecieverId"]; var adminUser = _context.User.Single(u => u.Email == User.Identity.Name); messageThreadDTO.SenderId = adminUser.Id; messageThreadDTO.AssetId = 0; MessageRepository messageRepo = new MessageRepository(_context); MessageThreadRepository messageThreadRepo = new MessageThreadRepository(_context); // The reciever will always be the seller Message message; Notification notification; message = new Message(messageThreadDTO.Subject, messageThreadDTO.Body, false, false); string messageThreadId; string recieverEmail; string redirectURL; try { var messageThreadRetrieved = _context.MessageThread.Single(m => m.SenderId == messageThreadDTO.SenderId && m.RecieverId == messageThreadDTO.RecieverId); message.messageThread = messageThreadRetrieved; message.messageThread.LastUpdateDate = DateTime.Now; messageRepo.AddMessage(message); messageThreadId = message.messageThread.id.ToString(); recieverEmail = message.messageThread.RecieverEmail; message.messageThread.RecieverUnreadMessageCount += 1; message.RecieverUnread = true; } catch (InvalidOperationException) { messageRepo.AddMessage(message); MessageThread messageThread = new MessageThread(messageThreadDTO.SenderId, messageThreadDTO.RecieverId); messageThread.SenderEmail = _context.User.Single(u => u.Id == messageThreadDTO.SenderId).Email; messageThread.RecieverEmail = _context.User.Single(u => u.Id == messageThreadDTO.RecieverId).Email; messageThreadId = messageThread.id.ToString(); messageThread.messages.Add(message); recieverEmail = messageThread.RecieverEmail; messageThread.RecieverUnreadMessageCount += 1; message.RecieverUnread = true; messageThread.LastUpdateDate = DateTime.Now; messageThreadRepo.AddMessageThread(messageThread); } // This notification redirect URL should put the user to the discussion redirectURL = "/MessageThreads/Details/" + message.messageThread.id.ToString(); notification = new Notification(message.Subject, message.Body, redirectURL); Clients.Group(recieverEmail).AddNotificationToQueue(notification); _context.SaveChanges(); Clients.Group(recieverEmail).UpdateOverallNotificationCount(); return(RedirectToAction(nameof(AdminController.Index))); }
public void testAddMessageThread() { var options = new DbContextOptionsBuilder <ApplicationDbContext>() .UseInMemoryDatabase(databaseName: "Add_messageThread_to_database") .Options; var mockSender = new Mock <ApplicationUser>(); var mockReciever = new Mock <ApplicationUser>(); string mockSenderID = "ab3+10ds2"; string mockRecieverID = "rg9_x1t\a"; mockSender.Setup(sender => sender.Id).Returns(mockSenderID); mockReciever.Setup(reciever => reciever.Id).Returns(mockRecieverID); MessageThread messageThread = new MessageThread(mockSender.Object.Id, mockReciever.Object.Id); using (ApplicationDbContext context = new ApplicationDbContext(options)) { IMessageThreadRepository messageThreadRepo = new MessageThreadRepository(context); messageThreadRepo.AddMessageThread(messageThread); messageThreadRepo.Save(); Assert.True(context.MessageThread.Count() == 1); } // Use a separate instance of the context to verify correct data was saved to database using (var context = new ApplicationDbContext(options)) { IMessageThreadRepository messageThreadRepo = new MessageThreadRepository(context); var messageThreadRecieved = messageThreadRepo.GetMessageThreadByID(messageThread.id); Assert.True(messageThreadRecieved.SenderId == mockSender.Object.Id); } }
public IHttpActionResult AddThread(MessageThreadModel Model) { long id = 0; try { MessageThread thread = new MessageThread(); thread.AgentId = Model.AgentId; thread.BuyerId = Model.BuyerId; thread.RequestId = Model.RequestId; thread.CreatedBy = Model.CreatedBy; thread.CreatedTime = DateTime.Now.ToUniversalTime(); using (AppDBContext context = new AppDBContext()) { var repo = new MessageThreadRepository(context); id = repo.SafeAdd(thread); } } catch (Exception ex) { Logger.Log(typeof(MessageController), ex.Message + ex.StackTrace, LogType.ERROR); return(InternalServerError(ex)); } return(Ok(id)); }
public IHttpActionResult GetByIdFromBuyer(long Id) { RequestQuotationViewModel model = null; try { using (AppDBContext context = new AppDBContext()) { var quote = new RequestQuotationRepository(context).GetById(Id); if (quote != null) { model = new RequestQuotationViewModel { Id = quote.Id, ServiceRequestId = quote.ServiceRequestId, QuotationTemplateId = quote.QuotationTemplateId, Premimum = quote.Premimum?.ToString("#,##0.00"), Cover = quote.Cover?.ToString("#,##0.00"), AgentId = quote.AgentId, AgentName = quote.Agent?.Name, AgentContact = quote.Agent?.UserName, CompanyId = quote.Agent?.CompanyId ?? 0, CompanyName = quote.Agent?.Company?.Name, QuotationTemplateName = quote.QuotationTemplate.Name, QuotationText = quote.QuotationText, Status = quote.Status ?? 0, ServiceRequestCode = quote.ServiceRequest.Code, ClaimType = quote.ServiceRequest.ClaimType, VehicleNo = quote.ServiceRequest.VehicleNo, VehicleValue = quote.ServiceRequest.VehicleValue, IsExpired = quote.IsExpired ?? false }; if (quote.ServiceRequest.Status == (int)Constant.ServiceRequestStatus.Closed || quote.ServiceRequest.Status == (int)Constant.ServiceRequestStatus.Expired) { model.Status = (int)Constant.QuotationStatus.Closed; } var messageThread = new MessageThreadRepository(context).GetByAgentAndRequest(model.AgentId, model.ServiceRequestId); if (messageThread != null) { model.ThreadId = messageThread.Id; } new RequestQuotationRepository(context).UpdateToChecked(quote.Id); } } return(Ok(model)); } catch (Exception ex) { Logger.Log(typeof(QuotationController), ex.Message + ex.StackTrace, LogType.ERROR); return(InternalServerError()); } }
public void testPost() { var options = new DbContextOptionsBuilder <ApplicationDbContext>() .UseInMemoryDatabase(databaseName: "API_Post_Database") .Options; using (var context = new ApplicationDbContext(options)) { IMessageThreadRepository messageThreadRepo = new MessageThreadRepository(context); IMessageRepository messageRepo = new MessageRepository(context); var mockConnectionManager = new Mock <IConnectionManager>(); var controller = new MessagesAPIController(messageRepo, messageThreadRepo, mockConnectionManager.Object); OkObjectResult getResult = (OkObjectResult)controller.Get(); List <Message> messageList = (List <Message>)getResult.Value; Assert.True(messageList.Count == 0); } MessageThread messageThread = new MessageThread(); messageThread.id = Guid.NewGuid(); using (var context = new ApplicationDbContext(options)) { IMessageThreadRepository messageThreadRepo = new MessageThreadRepository(context); IMessageRepository messageRepo = new MessageRepository(context); var mockConnectionManager = new Mock <IConnectionManager>(); var controller = new MessagesAPIController(messageRepo, messageThreadRepo, mockConnectionManager.Object); context.MessageThread.Add(messageThread); context.SaveChanges(); string subject = "This is a test subject."; string body = "This is a test body"; MessageDTO messageDTO = new MessageDTO(subject, body, messageThread.id.ToString()); controller.Post(messageDTO); } using (var context = new ApplicationDbContext(options)) { IMessageThreadRepository messageThreadRepo = new MessageThreadRepository(context); IMessageRepository messageRepo = new MessageRepository(context); var mockConnectionManager = new Mock <IConnectionManager>(); var controller = new MessagesAPIController(messageRepo, messageThreadRepo, mockConnectionManager.Object); OkObjectResult getResult = (OkObjectResult)controller.Get(); List <Message> messageList = (List <Message>)getResult.Value; Assert.True(messageList.Count == 1); } }
public IHttpActionResult AcceptByMessageThread(long ThreadId) { try { using (AppDBContext context = new AppDBContext()) { var thread = new MessageThreadRepository(context).GetById(ThreadId); var repo = new RequestQuotationRepository(context); var quote = repo.GetByRequestAndAgent(thread.RequestId, thread.AgentId); quote.Status = (int)Constant.QuotationStatus.Accepted; repo.Update(quote); var otherQuotes = repo.GetByRequest(quote.ServiceRequestId)?.Where(q => q.Id != quote.Id); if (otherQuotes != null) { foreach (var q in otherQuotes) { q.Status = (int)Constant.QuotationStatus.Closed; repo.Update(q); } } var reqRepo = new ServiceRequestRepository(context); var request = quote.ServiceRequest; reqRepo.UpdateSRStatus(request.Id, (int)Constant.ServiceRequestStatus.Closed); var buyerName = new UserRepository(context).GetName(request.UserId); MessageModel message = new MessageModel { MessageText = "Quotation accepted by: " + buyerName, RequestId = request.Id, SenderId = request.UserId, RecieverId = quote.AgentId, QuotationId = 0 }; AddMessage(message, context); new NotificationRepository(context).Add( quote.AgentId, (int)Constant.NotificationType.Accept, quote.Id, ConfigurationHelper.NOTIFICATION_TITLE, Constant.Notification.ACCCEPTED_TEXT); } return(Ok()); } catch (Exception ex) { Logger.Log(typeof(QuotationController), ex.Message + ex.StackTrace, LogType.ERROR); return(InternalServerError()); } }
public IHttpActionResult AddMessage(MessageModel Model) { long Id = 0; try { Message message = new Message { Id = Model.Id, ThreadId = Model.ThreadId, MessageText = Model.MessageText, SenderId = Model.SenderId, RecieverId = Model.RecieverId, Status = (int)Constant.MessageStatus.Initial, Time = DateTime.Now.ToUniversalTime() }; using (AppDBContext context = new AppDBContext()) { var userRepo = new UserRepository(context); var sender = userRepo.GetByUserId(message.SenderId); var recipient = userRepo.GetByUserId(message.RecieverId); if (message.ThreadId == 0) { long agentId = 0; long buyerId = 0; if (sender.UserType == Constant.UserType.BUYER) { buyerId = sender.Id; agentId = recipient.Id; } else { buyerId = recipient.Id; agentId = sender.Id; new AgentServiceRequestRepository(context).UpdateResponseTime(Model.RequestId, agentId); } var existingthread = new MessageThreadRepository(context).GetByAgentId(agentId).Where( t => t.RequestId == Model.RequestId && t.BuyerId == buyerId).FirstOrDefault(); if (existingthread == null) { MessageThread thread = new MessageThread(); thread.AgentId = agentId; thread.BuyerId = buyerId; thread.RequestId = Model.RequestId; thread.CreatedBy = Model.SenderId; thread.CreatedTime = DateTime.Now.ToUniversalTime(); var repo = new MessageThreadRepository(context); long tid = repo.Add(thread); message.ThreadId = tid; } else { message.ThreadId = existingthread.Id; } } if (sender.UserType == Constant.UserType.BUYER) { new ServiceRequestRepository(context).UpdateBuyerResponded(Model.RequestId); } Id = new MessageRepository(context).Add(message); new NotificationRepository(context).Add( recipient.Id, (int)Constant.NotificationType.Message, message.ThreadId, ConfigurationHelper.NOTIFICATION_TITLE, Constant.Notification.NEW_MESSAGE_TEXT); } } catch (Exception ex) { Logger.Log(typeof(MessageController), ex.Message + ex.StackTrace, LogType.ERROR); InternalServerError(ex); } return(Ok(Id)); }
public IHttpActionResult GetAgentThreads(long UserId, int Page) { List <MessageThreadModel> threads = null; try { using (AppDBContext context = new AppDBContext()) { var userThreads = new MessageThreadRepository(context).GetByAgentId(UserId); userThreads = userThreads.Skip((Page - 1) * Constant.Paging.MESSAGE_THREADS_PER_PAGE). Take(Constant.Paging.MESSAGE_THREADS_PER_PAGE).ToList(); threads = userThreads.Select(t => new MessageThreadModel { Id = t.Id, AgentId = t.AgentId, BuyerId = t.BuyerId, RequestId = t.RequestId, Date = t.CreatedTime.GetAdjustedTime().ToString("dd/MMM"), Time = t.CreatedTime.GetAdjustedTime().ToString("HH:mm"), Messages = t.Messages.OrderBy( m => m.Time).Select(m => new MessageModel { Id = m.Id, ThreadId = m.ThreadId, RecieverId = m.RecieverId, SenderId = m.SenderId, MessageText = m.MessageText, Status = m.Status, QuotationId = m.QuotationId ?? 0, Time = m.Time.GetAdjustedTime().ToString("yyyy-MM-dd HH:mm") }).ToList() }).ToList(); foreach (var thread in threads) { var userRepo = new UserRepository(context); var userProfileRepo = new UserProfileRepository(context); var buyer = userRepo.GetByUserId(thread.BuyerId); var agent = userRepo.GetByUserId(thread.AgentId); var buyerProfile = userProfileRepo.GetByUserId(thread.BuyerId); var agentProfile = userProfileRepo.GetByUserId(thread.AgentId); var request = new ServiceRequestRepository(context).GetById(thread.RequestId); thread.AgentName = agent.Name; if (agentProfile != null) { thread.AgentName = agentProfile.FirstName + " " + agentProfile.LastName; } thread.CompanyName = agent.Company.Name; thread.BuyerName = buyer.Name; if (buyerProfile != null) { thread.BuyerName = buyerProfile.FirstName + " " + buyerProfile.LastName; } thread.Description = "Vehicle No: " + request.VehicleNo + " / Request: " + request.Code; thread.VehicleNo = request.VehicleNo; thread.UnreadMessageCount = thread.Messages.Count( m => m.Status == (int)Constant.MessageStatus.Initial && m.RecieverId == UserId); foreach (var message in thread.Messages) { var sender = userRepo.GetByUserId(message.SenderId); message.SenderName = sender.Name; var senderProfile = userProfileRepo.GetByUserId(message.SenderId); if (senderProfile != null) { message.SenderName = senderProfile.FirstName + " " + senderProfile.LastName; } } } } } catch (Exception ex) { Logger.Log(typeof(MessageController), ex.Message + ex.StackTrace, LogType.ERROR); return(InternalServerError(ex)); } return(Ok(threads)); }
public IHttpActionResult GetBuyerThreads(long UserId, int Page) { List <MessageThreadModel> threads = null; try { using (AppDBContext context = new AppDBContext()) { var userThreads = new MessageThreadRepository(context).GetByBuyerId(UserId); userThreads = userThreads.Skip((Page - 1) * Constant.Paging.MESSAGE_THREADS_PER_PAGE). Take(Constant.Paging.MESSAGE_THREADS_PER_PAGE).ToList(); threads = userThreads.Select(t => new MessageThreadModel { Id = t.Id, AgentId = t.AgentId, BuyerId = t.BuyerId, RequestId = t.RequestId, Date = t.CreatedTime.GetAdjustedTime().ToString("dd/MMM"), Time = t.CreatedTime.GetAdjustedTime().ToString("HH:mm"), Messages = t.Messages.OrderBy( m => m.Time).Select(m => new MessageModel { Id = m.Id, ThreadId = m.ThreadId, RecieverId = m.RecieverId, SenderId = m.SenderId, MessageText = m.MessageText, Status = m.Status, QuotationId = m.QuotationId ?? 0, Time = m.Time.GetAdjustedTime().ToString("yyyy-MM-dd HH:mm") }).ToList() }).ToList(); foreach (var thread in threads) { var userRepo = new UserRepository(context); var userProfileRepo = new UserProfileRepository(context); var buyer = userRepo.GetByUserId(thread.BuyerId); var agent = userRepo.GetByUserId(thread.AgentId); var buyerProfile = userProfileRepo.GetByUserId(thread.BuyerId); var agentProfile = userProfileRepo.GetByUserId(thread.AgentId); var request = new ServiceRequestRepository(context).GetById(thread.RequestId); thread.AgentName = agent.Name; if (agentProfile != null) { thread.AgentName = agentProfile.FirstName + " " + agentProfile.LastName; } thread.CompanyName = agent.Company.Name; thread.BuyerName = buyer.Name; if (buyerProfile != null) { thread.BuyerName = buyerProfile.FirstName + " " + buyerProfile.LastName; } thread.Description = "Vehicle No: " + request.VehicleNo + " / Request: " + request.Code; thread.VehicleNo = request.VehicleNo; thread.UnreadMessageCount = thread.Messages.Count( m => m.Status == (int)Constant.MessageStatus.Initial && m.RecieverId == UserId); foreach (var message in thread.Messages) { var sender = userRepo.GetByUserId(message.SenderId); message.SenderName = sender.Name; var senderProfile = userProfileRepo.GetByUserId(message.SenderId); if (senderProfile != null) { message.SenderName = senderProfile.FirstName + " " + senderProfile.LastName; } } } if (Page == 1) { var promotion = new PromotionRepository(context).GetLatestPromotion(1); //TODO change the type to param PromotionModel promModel = null; if (promotion != null) { promModel = new PromotionModel { Id = promotion.Id, Title = promotion.Title, Header = promotion.Header, Description = promotion.Description, CreatedDate = promotion.CreatedDate?.ToString(Constant.DateFormatType.YYYYMMDD), Status = promotion.Status ?? 0, Type = ((promotion.Type ?? 0) == Constant.PromotionType.OFFER) ? "Offers" : "Promotions" }; MessageThreadModel promotionEntry = new MessageThreadModel(); promotionEntry.Description = promModel.Type; promotionEntry.Promotion = promModel; if (threads == null) { threads = new List <MessageThreadModel>(); } threads.Insert(0, promotionEntry); } } } } catch (Exception ex) { Logger.Log(typeof(MessageController), ex.Message + ex.StackTrace, LogType.ERROR); return(InternalServerError(ex)); } return(Ok(threads)); }
public IHttpActionResult GetThreadById(long ThreadId, long UserId) { MessageThreadModel thread = null; try { using (AppDBContext context = new AppDBContext()) { var t = new MessageThreadRepository(context).GetById(ThreadId); if (t != null) { thread = new MessageThreadModel { Id = t.Id, AgentId = t.AgentId, BuyerId = t.BuyerId, RequestId = t.RequestId, Date = t.CreatedTime.GetAdjustedTime().ToString("dd/MMM"), Time = t.CreatedTime.GetAdjustedTime().ToString("HH:mm"), Messages = t.Messages.OrderBy( m => m.Time).Select(m => new MessageModel { Id = m.Id, ThreadId = m.ThreadId, RecieverId = m.RecieverId, SenderId = m.SenderId, MessageText = m.MessageText, Status = m.Status, QuotationId = m.QuotationId ?? 0, Time = m.Time.GetAdjustedTime().ToString("yyyy-MM-dd hh:mm tt") }).ToList() }; var userRepo = new UserRepository(context); var userProfileRepo = new UserProfileRepository(context); var buyer = userRepo.GetByUserId(thread.BuyerId); var agent = userRepo.GetByUserId(thread.AgentId); var buyerProfile = userProfileRepo.GetByUserId(thread.BuyerId); var agentProfile = userProfileRepo.GetByUserId(thread.AgentId); var request = new ServiceRequestRepository(context).GetById(thread.RequestId); thread.AgentName = agent.Name; if (agentProfile != null) { thread.AgentName = agentProfile.FirstName + " " + agentProfile.LastName; } thread.CompanyName = agent.Company.Name; thread.BuyerName = buyer.Name; if (buyerProfile != null) { thread.BuyerName = buyerProfile.FirstName + " " + buyerProfile.LastName; } thread.Description = "Vehicle No: " + request.VehicleNo + " / Request: " + request.Code; thread.RequestStatus = request.Status; var latestMessageWithQuote = thread.Messages.Where( m => m.QuotationId > 0).OrderByDescending(m => m.Id).FirstOrDefault()?.Id; thread.UnreadMessageCount = thread.Messages.Count( m => m.Status == (int)Constant.MessageStatus.Initial && m.RecieverId == UserId); foreach (var message in thread.Messages) { var sender = userRepo.GetByUserId(message.SenderId); message.SenderName = sender.Name; var senderProfile = userProfileRepo.GetByUserId(message.SenderId); if (senderProfile != null) { message.SenderName = senderProfile.FirstName + " " + senderProfile.LastName; } if (message.QuotationId > 0) { thread.HasQuotation = true; } if (message.Id != latestMessageWithQuote) { message.QuotationId = 0; } else { message.MessageText = "New " + message.MessageText; } } new MessageRepository(context).UpdateMessgesToRead(UserId, ThreadId); } } } catch (Exception ex) { Logger.Log(typeof(MessageController), ex.Message + ex.StackTrace, LogType.ERROR); return(InternalServerError(ex)); } return(Ok(thread)); }
private void AddMessage(MessageModel Model, AppDBContext context) { long Id = 0; try { Message message = new Message { Id = Model.Id, ThreadId = Model.ThreadId, MessageText = Model.MessageText, SenderId = Model.SenderId, RecieverId = Model.RecieverId, Status = (int)Constant.MessageStatus.Initial, QuotationId = Model.QuotationId, Time = DateTime.Now.ToUniversalTime() }; var userRepo = new UserRepository(context); var sender = userRepo.GetByUserId(message.SenderId); var recipient = userRepo.GetByUserId(message.RecieverId); if (message.ThreadId == 0) { long agentId = 0; long buyerId = 0; if (sender.UserType == Constant.UserType.BUYER) { buyerId = sender.Id; agentId = recipient.Id; } else { buyerId = recipient.Id; agentId = sender.Id; } var existingthread = new MessageThreadRepository(context).GetByAgentId(agentId).Where( t => t.RequestId == Model.RequestId && t.BuyerId == buyerId).FirstOrDefault(); if (existingthread == null) { MessageThread thread = new MessageThread(); thread.AgentId = agentId; thread.BuyerId = buyerId; thread.RequestId = Model.RequestId; thread.CreatedBy = Model.SenderId; thread.CreatedTime = DateTime.Now.ToUniversalTime(); var repo = new MessageThreadRepository(context); long tid = repo.Add(thread); message.ThreadId = tid; } else { message.ThreadId = existingthread.Id; } } Id = new MessageRepository(context).Add(message); } catch (Exception ex) { throw (ex); } }