Exemplo n.º 1
0
        public ActionResult AnswerQuestion(Guid id, AnswerQuestionDTO request)
        {
            if (ModelState.IsValid)
            {
                PartnerBLL partnerBLL = new PartnerBLL(WebApp.Connector)
                {
                    AnswerQuestionEmailSubject  = LocalizationProvider["AnswerQuestionEmailSubject"],
                    AnswerQuestionEmailTemplate = LocalizationProvider["AnswerQuestionEmailTemplate"]
                };
                string baseUrl = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port).ToString();
                PartnerBLL.AnswerQuestionResult result = partnerBLL.AnswerQuestion(Account, id, request.Answer, baseUrl);
                switch (result)
                {
                case PartnerBLL.AnswerQuestionResult.OK:
                    TempData["Result"] = "QuestionHasBeenAnswered";
                    return(RedirectToAction("ViewCustomerQuestion"));

                case PartnerBLL.AnswerQuestionResult.NotFound: return(HttpNotFound());

                case PartnerBLL.AnswerQuestionResult.QuestionHasBeenAlreadyAnswered:
                default:
                    return(BadRequest());
                }
            }
            else
            {
                bool result = AnswerQuestion_Base(id);
                return(result ? BadRequestWithErrors() as ActionResult : HttpNotFound());
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Indsætter en række i databasen når en bruger har besvaret et spørgsmål,
        /// og sørger for at sikre samtidighedsproblemer
        /// </summary>
        /// <param name="id"></param>
        /// <param name="lobbyId"></param>
        /// <param name="userId"></param>
        /// <param name="categoryId"></param>
        /// <returns></returns>
        public AnswerQuestionDTO AnswerQuestion(int id, int lobbyId, int userId, int categoryId)
        {
            AnswerQuestionDTO  answer  = null;
            UserQuestion       usrq    = null;
            TransactionOptions options = new TransactionOptions();

            options.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
            {
                using (var conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    using (SqlCommand command = conn.CreateCommand())
                    {
                        command.CommandText = "SELECT id, description, questionId, isCorrect, pointAmount from Answer where id = @id";
                        command.Parameters.Add("@id", SqlDbType.Int).Value = id;

                        var reader = command.ExecuteReader();
                        while (reader.Read())
                        {
                            answer                    = new AnswerQuestionDTO();
                            answer.Answer             = new Answer();
                            answer.Answer.id          = reader.GetInt32(reader.GetOrdinal("id"));
                            answer.Answer.description = reader.GetString(reader.GetOrdinal("description"));
                            answer.Answer.Question    = new Question()
                            {
                                id = reader.GetInt32(reader.GetOrdinal("questionId"))
                            };
                            answer.Answer.isCorrect   = reader.GetBoolean(reader.GetOrdinal("isCorrect"));
                            answer.Answer.pointAmount = reader.GetInt32(reader.GetOrdinal("pointAmount"));
                        }
                        reader.Close();
                        command.ExecuteNonQuery();
                    }

                    using (SqlCommand cmd = conn.CreateCommand())
                    {
                        usrq            = new UserQuestion();
                        cmd.CommandText = "SELECT UserQuestion.userId, UserQuestion.questionId, UserQuestion.categoryId, UserQuestion.lobbyId FROM UserQuestion WHERE UserQuestion.lobbyId = @lobbyId";
                        cmd.Parameters.Add("@lobbyId", SqlDbType.Int).Value = lobbyId;
                        var reader = cmd.ExecuteReader();
                        while (reader.Read())
                        {
                            usrq.user = new User()
                            {
                                id = reader.GetInt32(reader.GetOrdinal("userId"))
                            };
                            usrq.question = new Question {
                                id = reader.GetInt32(reader.GetOrdinal("questionId"))
                            };
                            usrq.category = new Category {
                                id = reader.GetInt32(reader.GetOrdinal("categoryId"))
                            };
                            usrq.lobby = new Lobby {
                                id = reader.GetInt32(reader.GetOrdinal("lobbyId"))
                            };
                        }


                        if (usrq.question.id == answer.Answer.Question.id)
                        {
                            answer.IsAnswered = true;
                            scope.Dispose();
                        }
                        else
                        {
                            answer.IsAnswered = false;
                        }
                        reader.Close();
                    }

                    if (answer.Answer.isCorrect && !answer.IsAnswered)
                    {
                        try
                        {
                            using (SqlCommand cmd = conn.CreateCommand())
                            {
                                //cmd.CommandText = "INSERT INTO UserQuestion(userId, questionId, categoryId, lobbyId)VALUES(@userId,@questionId,@categoryId, @lobbyId)";
                                cmd.CommandText = "if not exists(select questionid from userQuestion where questionid = @questionId)INSERT INTO UserQuestion(userId, questionId, categoryId, lobbyId)VALUES(@userId, @questionId, @categoryId, @lobbyId)";
                                cmd.Parameters.Add("@userId", SqlDbType.Int).Value     = userId;
                                cmd.Parameters.Add("@questionId", SqlDbType.Int).Value = answer.Answer.Question.id;
                                cmd.Parameters.Add("@categoryId", SqlDbType.Int).Value = categoryId;
                                cmd.Parameters.Add("@lobbyId", SqlDbType.Int).Value    = lobbyId;
                                cmd.ExecuteNonQuery();
                            }
                        }
                        catch (Exception)
                        {
                            throw new FaultException("You answered at the same time");
                        }
                        scope.Complete();
                        conn.Close();
                    }
                }
            }
            return(answer);
        }