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()); } }
/// <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); }