Beispiel #1
0
        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));
        }
Beispiel #2
0
        public async Task <IActionResult> UploadExercise2(List <IFormFile> files, int?activityId)
        {
            if (activityId == null)
            {
                return(NotFound());
            }
            var activity
                = await _context.CourseActivity
                  .Include(a => a.Module)
                  .ThenInclude(m => m.Course)
                  .FirstOrDefaultAsync(a => a.Id == activityId);

            var user = await _userManager.Users.FirstOrDefaultAsync(u => u.UserName == User.Identity.Name);

            // We handle only one file at a time, so this foreach should not be needed.
            // Maybe just take the first item in the list.
            // Maybe change the .cshtml so that it does not return a list.
            string fileName = "";

            foreach (var formFile in files)
            {
                if (formFile.Length > 0)
                {
                    string[] splitFileName = formFile.FileName.Split('.');
                    string   fileExtension = splitFileName[splitFileName.Length - 1];
                    fileName = "a" + activity.Id + "u" + user.Id + "." + fileExtension;

                    using (var stream = new FileStream("wwwroot/Exercises/" + fileName, FileMode.Create))
                    {
                        await formFile.CopyToAsync(stream);
                    }
                }
                // Need to check that file was created OK.
            }
            var docRec = new ExerciseSubmission()
            {
                FileName          = fileName,
                SubmissionTime    = DateTime.Now,
                ApplicationUserId = user.Id,
                CourseActivityId  = activity.Id
            };

            _context.ExerciseSubmission.Add(docRec);
            _context.SaveChanges();

            return(RedirectToAction("DetailsForStudent", new { id = activity.Id }));
        }
Beispiel #3
0
    public async Task <ExerciseSubmission> CreateExerciseSubmissionAsync(ExerciseSubmission submission, CancellationToken cancellationToken)
    {
        // Create new submission
        var submissionEntity = _dbContext.ExerciseSubmissions.Add(new ExerciseSubmissionEntity
        {
            ExerciseId     = submission.ExerciseId,
            ExercisePassed = submission.ExercisePassed,
            UserId         = submission.UserId,
            SubmissionTime = submission.SubmissionTime,
            Weight         = submission.Weight
        }).Entity;

        // Apply changes
        await _dbContext.SaveChangesAsync(cancellationToken);

        return(_mapper.Map <ExerciseSubmission>(submissionEntity));
    }
Beispiel #4
0
    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" }));
        }
    }