예제 #1
0
        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)));
        }
예제 #2
0
        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());
            }
        }
예제 #5
0
        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);
            }
        }