private async Task <IActionResult> SaveViewModel(CertificateOptionViewModel vm, string returnToIfModelNotValid, RedirectToActionResult nextAction, string action)
        {
            var username = GetUsernameFromClaim();

            Logger.LogDebug($"Save View Model for CertificateOptionViewModel for {username} with values: {GetModelValues(vm)}");

            var certificate = await CertificateApiClient.GetCertificate(vm.Id);

            var certData = JsonConvert.DeserializeObject <CertificateData>(certificate.CertificateData);

            SessionService.RemoveRedirectedFromVersion();

            var sessionString = SessionService.Get(nameof(CertificateSession));

            if (sessionString == null)
            {
                Logger.LogDebug($"Session for CertificateOptionViewModel requested by {username} has been lost. Redirecting to Search Index");
                return(RedirectToAction("Index", "Search"));
            }
            var certSession = JsonConvert.DeserializeObject <CertificateSession>(sessionString);

            if (!ModelState.IsValid)
            {
                vm.Options = certSession.Options;
                Logger.LogDebug($"Model State not valid for CertificateOptionViewModel requested by {username} with Id {certificate.Id}. Errors: {ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage)}");
                return(View(returnToIfModelNotValid, vm));
            }

            var updatedCertificate = vm.GetCertificateFromViewModel(certificate, certData);

            try
            {
                await CertificateApiClient.UpdateCertificate(new UpdateCertificateRequest(updatedCertificate) { Username = username, Action = action });
            }
            catch
            {
                Logger.LogError($"Unable to update certificate with Id {certificate.Id}.");
                return(RedirectToAction("Error", "Home"));
            }

            Logger.LogDebug($"Certificate for CertificateOptionViewModel requested by {username} with Id {certificate.Id} updated.");

            if (SessionService.GetRedirectToCheck())
            {
                Logger.LogDebug($"Certificate for CertificateOptionViewModel requested by {username} with Id {certificate.Id} redirecting back to Certificate Check.");
                return(new RedirectToActionResult("Check", "CertificateCheck", null));
            }

            Logger.LogDebug($"Certificate for CertificateOptionViewModel requested by {username} with Id {certificate.Id} redirecting to {nextAction.ControllerName} {nextAction.ActionName}");
            return(nextAction);
        }
        private async Task <IActionResult> SaveViewModel(CertificateOptionViewModel vm, string returnToIfModelNotValid, RedirectToActionResult nextAction, string action)
        {
            var username = ContextAccessor.HttpContext.User.FindFirst("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn")?.Value;

            Logger.LogInformation($"Save View Model for CertificateOptionViewModel for {username} with values: {GetModelValues(vm)}");

            var certificate = await CertificateApiClient.GetCertificate(vm.Id);

            var certData = JsonConvert.DeserializeObject <CertificateData>(certificate.CertificateData);

            var sessionString = SessionService.Get("CertificateSession");

            if (sessionString == null)
            {
                Logger.LogInformation($"Session for CertificateOptionViewModel requested by {username} has been lost. Redirecting to Search Index");
                return(RedirectToAction("Index", "Search"));
            }
            var certSession = JsonConvert.DeserializeObject <CertificateSession>(sessionString);

            if (!ModelState.IsValid)
            {
                vm.FamilyName = certData.LearnerFamilyName;
                vm.GivenNames = certData.LearnerGivenNames;
                vm.Options    = certSession.Options;
                Logger.LogInformation($"Model State not valid for CertificateOptionViewModel requested by {username} with Id {certificate.Id}. Errors: {ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage)}");
                return(View(returnToIfModelNotValid, vm));
            }

            var updatedCertificate = vm.GetCertificateFromViewModel(certificate, certData);

            await CertificateApiClient.UpdateCertificate(new UpdateCertificateRequest(updatedCertificate) { Username = username, Action = action });

            Logger.LogInformation($"Certificate for CertificateOptionViewModel requested by {username} with Id {certificate.Id} updated.");

            if (SessionService.Exists("redirecttocheck") && bool.Parse(SessionService.Get("redirecttocheck")))
            {
                Logger.LogInformation($"Certificate for CertificateOptionViewModel requested by {username} with Id {certificate.Id} redirecting back to Certificate Check.");
                return(new RedirectToActionResult("Check", "CertificateCheck", null));
            }

            Logger.LogInformation($"Certificate for CertificateOptionViewModel requested by {username} with Id {certificate.Id} redirecting to {nextAction.ControllerName} {nextAction.ActionName}");
            return(nextAction);
        }
Beispiel #3
0
        private async Task <IActionResult> SaveViewModel(CertificateVersionViewModel vm, RedirectToActionResult nextAction, string action)
        {
            var username        = GetUsernameFromClaim();
            var epaoid          = GetEpaOrgIdFromClaim();
            var redirectToCheck = SessionService.GetRedirectToCheck();

            Logger.LogDebug($"Save View Model for CertificateVersionViewModel for {username} with values: {GetModelValues(vm)}");

            var certificate = await CertificateApiClient.GetCertificate(vm.Id);

            var certData = JsonConvert.DeserializeObject <CertificateData>(certificate.CertificateData);

            if (!TryGetCertificateSession("CertificateVersionViewModel", username, out var certSession))
            {
                return(RedirectToAction("Index", "Search"));
            }

            if (!ModelState.IsValid)
            {
                Logger.LogDebug($"Model State not valid for CertificateVersionViewModel requested by {username} with Id {certificate.Id}. Errors: {ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage)}");
                return(View("~/Views/Certificate/Version.cshtml", vm));
            }

            var standardVersion = await _standardVersionClient.GetStandardVersionById(vm.StandardUId);

            var approvedStandardVersions = await _standardVersionClient.GetEpaoRegisteredStandardVersions(epaoid, certSession.StandardCode);

            var options = await _standardVersionClient.GetStandardOptions(vm.StandardUId);

            if (!approvedStandardVersions.Any(v => v.StandardUId == vm.StandardUId))
            {
                SessionService.Set("AttemptedStandardVersion", vm.StandardUId);

                return(RedirectToAction("NotApprovedToAssess", "CertificateVersionNotApproved", redirectToCheck ? new { redirectToCheck } : null));
            }

            var versionChanged = certificate.StandardUId != vm.StandardUId;
            // Edge case to cater to back buttons where user can change version without setting an option
            var optionNotSet = string.IsNullOrEmpty(certData.CourseOption) && options != null && options.HasOptions();

            if (!versionChanged && !optionNotSet && redirectToCheck)
            {
                // if version hasn't changed, and option set if required, don't need to update options.
                return(new RedirectToActionResult("Check", "CertificateCheck", null));
            }

            certSession.StandardUId = vm.StandardUId;

            // To pass in to inherited method.
            vm.SelectedStandardVersion = standardVersion;
            vm.SelectedStandardOptions = options;
            var updatedCertificate = vm.GetCertificateFromViewModel(certificate, certData);

            try
            {
                await CertificateApiClient.UpdateCertificate(new UpdateCertificateRequest(updatedCertificate) { Username = username, Action = action });
            }
            catch
            {
                Logger.LogError($"Unable to update certificate with Id {certificate.Id}.");
                return(RedirectToAction("Error", "Home"));
            }

            Logger.LogDebug($"Certificate for CertificateVersionViewModel requested by {username} with Id {certificate.Id} updated.");

            if (options != null && options.HasOptions())
            {
                certSession.Options = options.CourseOption.ToList();
                SessionService.Set(nameof(CertificateSession), certSession);

                if (options.OnlyOneOption())
                {
                    if (redirectToCheck)
                    {
                        return(new RedirectToActionResult("Check", "CertificateCheck", null));
                    }

                    return(new RedirectToActionResult("Declare", "CertificateDeclaration", null));
                }

                object routeValues = null;
                if (redirectToCheck)
                {
                    routeValues = new { redirecttocheck = true };
                }

                SessionService.SetRedirectedFromVersion(true);
                return(new RedirectToActionResult("Option", "CertificateOption", routeValues));
            }
            else
            {
                certSession.Options = null;
                SessionService.Set(nameof(CertificateSession), certSession);
            }

            if (redirectToCheck)
            {
                Logger.LogDebug($"Certificate for CertificateVersionViewModel requested by {username} with Id {certificate.Id} redirecting back to Certificate Check.");
                return(new RedirectToActionResult("Check", "CertificateCheck", null));
            }

            Logger.LogDebug($"Certificate for CertificateVersionViewModel requested by {username} with Id {certificate.Id} redirecting to {nextAction.ControllerName} {nextAction.ActionName}");
            return(nextAction);
        }