public async Task <IActionResult> CreateExerciseSubmissionAsync([FromServices] IExerciseService exerciseService, int labId, int slotId, int exerciseId, int userId, DateTime submissionTime, bool passed, int weight) { try { // Create submission var submission = new ExerciseSubmission { ExerciseId = exerciseId, UserId = userId, ExercisePassed = passed, SubmissionTime = submissionTime, Weight = passed ? 1 : weight }; await exerciseService.CreateExerciseSubmissionAsync(submission, HttpContext.RequestAborted); AddStatusMessage(_localizer["CreateExerciseSubmissionAsync:Success"], StatusMessageTypes.Success); } catch (InvalidOperationException ex) { _logger.LogError(ex, "Create exercise submission"); AddStatusMessage(_localizer["CreateExerciseSubmissionAsync:UnknownError"], StatusMessageTypes.Error); } return(await RenderAsync(labId, slotId)); }
public async Task <IActionResult> CreateExerciseSubmissionAsync(CtfApiRequest request) { try { // Resolve lab var lab = await _labService.GetLabAsync(request.LabId, HttpContext.RequestAborted); if (lab == null) { return(BadRequest(new { error = $"Could not resolve requested lab {request.LabId}" })); } // Decode request var apiExerciseSubmission = request.Decode <ApiExerciseSubmission>(new CryptoService(lab.ApiCode)); // Resolve exercise var exercise = await _exerciseService.FindExerciseAsync(lab.Id, apiExerciseSubmission.ExerciseNumber, HttpContext.RequestAborted); if (exercise == null) { return(NotFound(new { error = "Exercise not found" })); } // Check lab execution // This will also automatically check whether the given user exists var labExecution = await _labExecutionService.GetLabExecutionForUserAsync(apiExerciseSubmission.UserId, lab.Id, HttpContext.RequestAborted); var now = DateTime.Now; if (labExecution == null || now < labExecution.PreStart) { return(NotFound(new { error = "Lab is not active for this user" })); } // Some exercises may only be submitted after the pre-start phase has ended if (!exercise.IsPreStartAvailable && now < labExecution.Start) { return(NotFound(new { error = "This exercise may not be submitted in the pre-start phase" })); } // Create submission var submission = new ExerciseSubmission { ExerciseId = exercise.Id, UserId = apiExerciseSubmission.UserId, ExercisePassed = apiExerciseSubmission.ExercisePassed, SubmissionTime = apiExerciseSubmission.SubmissionTime ?? DateTime.Now, Weight = apiExerciseSubmission.ExercisePassed ? 1 : (apiExerciseSubmission.Weight >= 0 ? apiExerciseSubmission.Weight : 1) }; await _exerciseService.CreateExerciseSubmissionAsync(submission, HttpContext.RequestAborted); return(Ok()); } catch (CryptographicException ex) { _logger.LogError(ex, "Create exercise submission for user"); return(StatusCode(StatusCodes.Status401Unauthorized, new { error = "Could not decode the request packet" })); } catch (Exception ex) { _logger.LogError(ex, "Create exercise submission for user"); return(StatusCode(StatusCodes.Status500InternalServerError, new { error = "An internal error occured during processing of the request" })); } }