Esempio n. 1
0
        public Answer PostAnswer(AnswerCreateRequestDTO a, int accountId)
        {
            //Validations
            Account        answerer = _userManagementServices.FindById(accountId);
            PostedQuestion question = _questionServices.GetPostedQuestion(a.QuestionId);

            if (question.IsClosed)
            {
                throw new QuestionIsClosedException("Question is closed");
            }

            if (answerer.Exp < question.ExpNeededToAnswer)
            {
                throw new NotEnoughExpException("User does not have enough Exp to answer");
            }

            //Create Answer after passed in Answer is validated
            Answer answer = new Answer()
            {
                QuestionId = a.QuestionId,
                AccountId  = accountId,
                Text       = a.Text,
            };

            //Post Answer
            return(_answerServices.PostAnswer(answer));
        }
        /// <summary>
        /// Method to send a message to another user
        /// Then messenger services will try to create a chat history first
        /// Then save the message to database. Dbcontext will call SaveChanges after  those 2 operations finish.
        /// </summary>
        /// <param name="conversation"></param>
        public Message SaveMessageToDatabase(Message message, int authUserId, int contactUserId)
        {
            // On the auth user's side, try to check if there is a conversation with the contact
            Conversation authUserConversation = _msServices.GetConversationBetweenUsers(authUserId, contactUserId);

            // On the contact user's side, try to check if there is a conversation with the contact
            Conversation contactUserConversation = _msServices.GetConversationBetweenUsers(contactUserId, authUserId);

            // Retrieve auth user name using  auth user id
            var authUsername = _umServices.FindById(authUserId).UserName;

            // Retrieve contact user name using contact Id
            var contactUsername = _umServices.FindById(contactUserId).UserName;

            // If there is no conversation with the contact on auth user'side
            if (authUserConversation == null)
            {
                // Create one
                authUserConversation = _msServices.CreateConversation(authUserId, contactUserId, contactUsername);

                // Temporary assign a negative conversation id to avoid conflict when saving both coversations at same time
                authUserConversation.Id = -1;
            }

            if (contactUserConversation == null)
            {
                contactUserConversation    = _msServices.CreateConversation(contactUserId, authUserId, authUsername);
                contactUserConversation.Id = -2;
            }

            // Create a message which will be saved in auth user's conversation
            var authUserMessage = new Message
            {
                // Refer the message to auth user 's conversation
                ConversationId  = authUserConversation.Id,
                MessageContent  = message.MessageContent,
                OutgoingMessage = true,
                CreatedDate     = DateTime.Now
            };

            // Create a message which will be saved in contact user's conversation
            var targetUserMessage = new Message
            {
                // Refer the message to contact user 's conversation
                ConversationId  = contactUserConversation.Id,
                MessageContent  = message.MessageContent,
                OutgoingMessage = false,
                CreatedDate     = DateTime.Now
            };

            // Mark the conversation of contact user that has new message
            contactUserConversation.HasNewMessage = true;

            //Update time
            authUserConversation.ModifiedDate    = DateTime.Now;
            contactUserConversation.ModifiedDate = DateTime.Now;

            // Save both messages to message table
            _msServices.SaveMessageToDatabase(authUserMessage);
            _msServices.SaveMessageToDatabase(targetUserMessage);

            _DbContext.SaveChanges();
            return(authUserMessage);
        }