public async Task<ActionResult<UserAttempt>> PostUserAttempt(UserAttempt userAttempt) { _context.UserAttepmts.Add(userAttempt); await _context.SaveChangesAsync(); return CreatedAtAction("GetUserAttempt", new { id = userAttempt.Id }, userAttempt); }
public async Task<IActionResult> PutUserAttempt(int id, UserAttempt userAttempt) { if (id != userAttempt.Id) { return BadRequest(); } _context.Entry(userAttempt).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!UserAttemptExists(id)) { return NotFound(); } else { throw; } } return NoContent(); }
private static GetUserAttemptsResult.UserAttempt Map(UserAttempt userAttempt) { return(new GetUserAttemptsResult.UserAttempt { Id = userAttempt.Id, DateTimeUtc = userAttempt.DateTimeUtc, IsSuccess = userAttempt.IsSuccess }); }
private void ResetAttempts(UserAttempt userAttempts) { if (userAttempts.LastRequest.AddHours(1) <= DateTime.Now) { userAttempts.Attempts = 0; } _context.Attempts.Update(userAttempts); }
private void UpdateAttempts(UserAttempt userAttempts) { userAttempts.Attempts++; userAttempts.LastRequest = DateTime.Now; if (userAttempts.Attempts >= MaxRequestsBeforeLockout) { userAttempts.Timeout = DateTime.Now.AddHours(2); } _context.Attempts.Update(userAttempts); }
public async Task <AddUserAttemptResult> Handle(AddUserAttemptParams addUserAttemptParams) { ICollection <Setting> settings = await _settingsRepository.GetSettings(); // 1. Validate attempts count Setting enterSecretNumberAttemptsCountSetting = settings.Single(t => t.Name == SettingName.EnterSecretNumberAttemptsCount); int userAttemptsCount = (await _userAttemptRepository.GetUserAttempts(addUserAttemptParams.UserId)).Count; if (userAttemptsCount > enterSecretNumberAttemptsCountSetting.IntValue) { return(new AddUserAttemptResult(AddUserAttemptResult.Type.AttemptsCountExceeded)); } // 2. Validate value against range Setting secretMinValueSetting = settings.Single(t => t.Name == SettingName.SecretRangeMinValue); if (addUserAttemptParams.SecretValue < secretMinValueSetting.IntValue) { return(new AddUserAttemptResult(AddUserAttemptResult.Type.LessThanRangeMinValue)); } Setting secretMaxValueSetting = settings.Single(t => t.Name == SettingName.SecretRangeMaxValue); if (addUserAttemptParams.SecretValue < secretMinValueSetting.IntValue) { return(new AddUserAttemptResult(AddUserAttemptResult.Type.MoreThanRangeMaxValue)); } // 3. Validate entered secret value AddUserAttemptResult result = null; Setting secretValueSetting = settings.Single(t => t.Name == SettingName.SecretValue); if (addUserAttemptParams.SecretValue == secretValueSetting.IntValue) { result = new AddUserAttemptResult(AddUserAttemptResult.Type.IncorrectValue); } else { result = new AddUserAttemptResult(AddUserAttemptResult.Type.Success); } // 4. Log user attempt to database UserAttempt userAttempt = new UserAttempt { UserId = addUserAttemptParams.UserId, DateTimeUtc = DateTime.UtcNow, EnteredSecretValue = addUserAttemptParams.SecretValue, IsSuccess = result.ResultType == AddUserAttemptResult.Type.Success }; await _userAttemptRepository.AddUserAttempt(userAttempt); return(result); }
private void CreateNewAttempt(string ip) { var attempt = new UserAttempt { IP = ip, Attempts = 1, LastRequest = DateTime.Now }; _context.Attempts.Add(attempt); }
public async Task AddUserAttempt(UserAttempt userAttempt) { using (SqlConnection sqlConnection = new SqlConnection(_conntectionString)) { await sqlConnection.OpenAsync(); using (SqlCommand sqlCommand = new SqlCommand("[dbo].[spAddUserAttempt]", sqlConnection)) { sqlCommand.Parameters.Add(new SqlParameter("@UserId", userAttempt.UserId)); sqlCommand.Parameters.Add(new SqlParameter("@DateTimeUtc", userAttempt.DateTimeUtc)); sqlCommand.Parameters.Add(new SqlParameter("@EnteredSecretValue", userAttempt.EnteredSecretValue)); sqlCommand.Parameters.Add(new SqlParameter("@IsSuccess", userAttempt.IsSuccess)); await sqlCommand.ExecuteNonQueryAsync(); } } }
private async Task <UserAttempt> CreateUserAttempt(Attempt attempt) { await _db.Entry(attempt).Reference(s => s.Test) .Query() .Include(s => s.Questions) .ThenInclude(s => (s as OptionsQuestion).Options) .Include(s => s.Questions) .ThenInclude(s => (s as PassFillingQuestion).Passes) .LoadAsync(); var rnd = new Random(); var userAttempt = new UserAttempt() { Id = attempt.Id, TestName = attempt.Test.Name, MaxTime = attempt.Test.AttemptTime, Questions = attempt.Test.Questions.OrderBy(s => rnd.Next()).ToList() }; return(userAttempt); }
public async System.Threading.Tasks.Task <ActionResult> Participate([Bind(Include = "ContestId, CurrentTaskId, CurrentTaskNumber, SelectedDevelopmentToolId")] ParticipantTaskPartialViewModel model, HttpPostedFileBase fileUpload) { var tasks = await _db.Tasks.Where(t => t.ContestId == model.ContestId).ToListAsync(); if (tasks == null || tasks.Count < 1) { TempData["Message"] = "Произошла ошибка: кол-во задач и компиляторов должно быть больше 0"; return(RedirectToAction("Contests")); //ViewBag.ErrorMessage = "Произошла ошибка: кол-во задач и компиляторов должно быть больше 0"; //return View("Error"); } var model2 = new ParticipantParticipateViewModel { ContestId = model.ContestId, CurrentTaskNumber = model.CurrentTaskNumber, Tasks = tasks }; if (ModelState.IsValid) { if (!string.IsNullOrEmpty(fileUpload?.FileName)) { var ext = Path.GetExtension(fileUpload.FileName); if (_allowedExtForSolutionFiles.Any(e => e == ext)) { byte[] solutionData; using (var binaryReader = new BinaryReader(fileUpload.InputStream)) { solutionData = binaryReader.ReadBytes(fileUpload.ContentLength); } var currentUserId = User.Identity.GetUserId(); var postedSolution = await _db.PostedSolutions.Where( s => s.TaskId == model.CurrentTaskId && s.UserId == currentUserId) .FirstOrDefaultAsync(); if (postedSolution != null) { postedSolution.Solution = solutionData; _db.Entry(postedSolution).State = EntityState.Modified; await _db.SaveChangesAsync(); } else { var postedSolutionId = Guid.NewGuid(); postedSolution = new PostedSolution { Id = postedSolutionId, UserId = User.Identity.GetUserId(), TaskId = model.CurrentTaskId, DevelopmentToolId = model.SelectedDevelopmentToolId, Solution = solutionData, IsChecked = false }; _db.PostedSolutions.Add(postedSolution); _db.SaveChanges(); } var task = postedSolution.Task; var contest = task.Contest; var devTool = _db.DevelopmentTools.Find(model.SelectedDevelopmentToolId); var user = _db.Users.Find(currentUserId); var postedSolutionsRootFolder = ConfigurationManager.AppSettings["PostedSolutionsRootFolder"]; var contestTypeName = contest.ContestsType.Name; var contestName = contest.Name; var userIp = user.Ip; var solutionsFolder = Path.Combine(postedSolutionsRootFolder, contestTypeName, contestName, userIp); if (!Directory.Exists(solutionsFolder)) { Directory.CreateDirectory(solutionsFolder); } var sourcePath = Path.Combine(solutionsFolder, task.ExecutableName) + ext; if (ByteArrayToFile(sourcePath, solutionData)) { try { var taskCheckSolution = new System.Threading.Tasks.Task <Solution>(() => { return(CheckPostedSolution(contest, user, task, devTool, solutionsFolder, LocalFolder, sourcePath)); }); _checkSolutionQueue.AddTask(taskCheckSolution); taskCheckSolution.Wait(); var solution = taskCheckSolution.Result; var userAttempt = new UserAttempt { Id = Guid.NewGuid(), ContestId = contest.Id, TaskId = task.Id, UserId = user.Id, CreatedDate = DateTime.Now, Solution = solutionData, SolutionExtension = ext, Score = solution.WeightedScore, DevelopmentToolId = devTool.Id, FailedRuns = solution.FailedRuns, FailedChecks = solution.FailedChecks }; _db.UserAttempts.Add(userAttempt); postedSolution.IsChecked = true; _db.Entry(postedSolution).State = EntityState.Modified; await _db.SaveChangesAsync(); TempData["Message"] = "Решение было отправлено и проверено. \nБаллов: " + solution.WeightedScore + "\nПроваленных запусков: " + solution.FailedRuns + "\nПроваленных тестов: " + solution.FailedChecks; //ToDo: вывести результат в другом виде? } catch (Exception ex) { var exeptionLog = new ExceptionsLog { Id = Guid.NewGuid(), ContestId = contest.Id, CreatedDate = DateTime.Now, UserId = user.Id, Text = ex.InnerException.Message }; _db.ExceptionsLogs.Add(exeptionLog); _db.SaveChanges(); TempData["Message"] = "При проверке решения возникло исключение: " + ex.InnerException.Message; //ToDo: вывести результат в другом виде? } if (Directory.Exists(postedSolutionsRootFolder)) { Directory.Delete(postedSolutionsRootFolder, true); } } else { TempData["Message"] = "Решение не было сохранено в локальном каталоге участника"; } } else { ModelState.AddModelError("", "Недопустимое расширения загружаемого файла решения"); return(View(model2)); } } else { ModelState.AddModelError("", "Не выбран загружаемый файл решения"); return(View(model2)); } //db.Tasks.Add(task); //await db.SaveChangesAsync(); return(RedirectToAction("Participate", new { id = model.ContestId, currentTaskNumber = model.CurrentTaskNumber })); } return(View(model2)); }