Exemplo n.º 1
0
        private async Task <IActionResult> LoadViewModel(string view)
        {
            var username = GetUsernameFromClaim();

            Logger.LogInformation($"Load View Model for CertificateCheckViewModel for {username}");

            var viewModel = new CertificateCheckViewModel();

            CheckAndSetRedirectToCheck(viewModel);

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

            var certificate = await CertificateApiClient.GetCertificate(certSession.CertificateId);

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

            viewModel.FromCertificate(certificate);
            viewModel.SetStandardHasVersionsAndOptions(certSession);

            Logger.LogInformation($"Got View Model of type CertificateCheckViewModel requested by {username}");

            return(View(view, viewModel));
        }
 public ProgramCsv(LearnerApiClient learnerApiClient, EpaApiClient epaApiClient, CertificateApiClient certificateApiClient, StandardsApiClient standardsApiClient)
 {
     _LearnerApiClient     = learnerApiClient;
     _EpaApiClient         = epaApiClient;
     _CertificateApiClient = certificateApiClient;
     _StandardsApiClient   = standardsApiClient;
 }
        private async Task <IActionResult> LoadViewModel(string view)
        {
            var username = GetUsernameFromClaim();

            Logger.LogDebug($"Load View Model for CertificateOptionViewModel for {username}");

            var viewModel = new CertificateOptionViewModel();

            CheckAndSetRedirectToCheck(viewModel);

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

            var certificate = await CertificateApiClient.GetCertificate(certSession.CertificateId);

            if (certSession.Options == null || !certSession.Options.Any())
            {
                return(RedirectToAction("Index", "Search"));
            }

            if (certSession.Options.Count == 1)
            {
                return(RedirectToAction("Declare", "CertificateDeclaration"));
            }

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

            viewModel.FromCertificate(certificate, certSession.Options);

            Logger.LogDebug($"Got View Model of type CertificateOptionViewModel requested by {username}");

            return(View(view, viewModel));
        }
        public static void Main()
        {
            const string subscriptionKey = ""; // insert your key here
            const string apiBaseAddress  = ""; // insert the API address here

            HttpClient httpClient = new HttpClient();

            httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
            httpClient.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
            httpClient.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
            httpClient.BaseAddress = new Uri(apiBaseAddress);

            LearnerApiClient     learnerApiClient     = new LearnerApiClient(httpClient);
            EpaApiClient         epaApiClient         = new EpaApiClient(httpClient);
            CertificateApiClient certificateApiClient = new CertificateApiClient(httpClient);
            StandardsApiClient   standardsApiClient   = new StandardsApiClient(httpClient);

            ProgramCsv p = new ProgramCsv(learnerApiClient, epaApiClient, certificateApiClient, standardsApiClient);

            p.GetLearnerExample().GetAwaiter().GetResult();
            p.CreateEpaRecordsExample().GetAwaiter().GetResult();
            p.UpdateEpaRecordsExample().GetAwaiter().GetResult();
            p.DeleteEpaRecordExample().GetAwaiter().GetResult();
            p.CreateCertificatesExample().GetAwaiter().GetResult();
            p.UpdateCertificatesExample().GetAwaiter().GetResult();
            p.SubmitCertificatesExample().GetAwaiter().GetResult();
            p.DeleteCertificateExample().GetAwaiter().GetResult();
            p.GetCertificateExample().GetAwaiter().GetResult();
            p.GetGradesExample().GetAwaiter().GetResult();
            p.GetOptionsForAllStandardsExample().GetAwaiter().GetResult();
            p.GetOptionsForStandardExample().GetAwaiter().GetResult();
        }
        private async Task <IActionResult> LoadViewModel(string view, bool?isFromStandard)
        {
            var username = ContextAccessor.HttpContext.User.FindFirst("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn")?.Value;

            Logger.LogInformation($"Load View Model for CertificateOptionViewModel for {username}");

            var viewModel = new CertificateOptionViewModel {
                IsFromStandard = isFromStandard ?? false
            };

            var query = ContextAccessor.HttpContext.Request.Query;

            if (query.ContainsKey("redirecttocheck") && bool.Parse(query["redirecttocheck"]))
            {
                Logger.LogInformation($"RedirectToCheck for CertificateOptionViewModel is true");
                SessionService.Set("redirecttocheck", "true");
                viewModel.BackToCheckPage = true;
            }
            else
            {
                SessionService.Remove("redirecttocheck");
            }

            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);

            var certificate = await CertificateApiClient.GetCertificate(certSession.CertificateId);

            if (!certSession.Options.Any())
            {
                if (ContextAccessor.HttpContext.Request.Query.ContainsKey("fromback"))
                {
                    if (certificate.IsPrivatelyFunded)
                    {
                        return(RedirectToAction("StandardCode", "CertificatePrivateStandardCode"));
                    }
                    return(RedirectToAction("Declare", "CertificateDeclaration"));
                }

                return(RedirectToAction("Grade", "CertificateGrade"));
            }

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

            viewModel.FromCertificate(certificate, certSession.Options);

            Logger.LogInformation($"Got View Model of type CertificateOptionViewModel requested by {username}");

            return(View(view, viewModel));
        }
Exemplo n.º 6
0
        private async Task <IActionResult> LoadViewModel(string view)
        {
            var username = GetUsernameFromClaim();

            Logger.LogDebug($"Load View Model for CertificateVersionViewModel for {username}");

            var viewModel = new CertificateVersionViewModel();

            CheckAndSetRedirectToCheck(viewModel);

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

            var certificate = await CertificateApiClient.GetCertificate(certSession.CertificateId, includeLogs : true);

            if (certSession.Versions == null || certSession.Versions.Count == 0)
            {
                return(RedirectToAction("Index", "Search"));
            }

            if (certSession.Versions.Count == 1)
            {
                // Only 1 version no need for a selection
                var singularStandard = certSession.Versions.First();
                var options          = await _standardVersionClient.GetStandardOptions(singularStandard.StandardUId);

                if (options != null & options.HasOptions())
                {
                    certSession.StandardUId = singularStandard.StandardUId;
                    certSession.Options     = options.CourseOption.ToList();
                    SessionService.Set(nameof(CertificateSession), certSession);
                    return(RedirectToAction("Option", "CertificateOption"));
                }

                return(RedirectToAction("Declare", "CertificateDeclaration"));
            }

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

            viewModel.FromCertificate(certificate, certSession.Versions);

            var attemptedStandardVersion = SessionService.Get("AttemptedStandardVersion");

            if (attemptedStandardVersion != null)
            {
                viewModel.StandardUId = attemptedStandardVersion;
                SessionService.Remove("AttemptedStandardVersion");
            }

            Logger.LogDebug($"Got View Model of type CertificateVersionViewModel requested by {username}");

            return(View(view, viewModel));
        }
        public CertificateDeleteQueryBase()
        {
            MockedLogger = new Mock <ILogger <CertificateDeleteController> >();
            var mockedCertificateApiClientLogger = new Mock <ILogger <CertificateApiClient> >();
            var mockedApiClientLogger            = new Mock <ILogger <ApiClient> >();

            MockHttpContextAccessor = SetupMockedHttpContextAccessor();
            CertificateApiClient    = SetupCertificateApiClient(mockedCertificateApiClientLogger);
            ApiClient       = SetupApiClient(mockedApiClientLogger);
            CertificateData = JsonConvert.DeserializeObject <CertificateData>(Certificate.CertificateData);
        }
Exemplo n.º 8
0
        public void Setup()
        {
            _MockHttp = new MockHttpMessageHandler();

            HttpClient httpClient = _MockHttp.ToHttpClient();

            httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
            httpClient.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
            httpClient.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
            httpClient.BaseAddress = new Uri(apiBaseAddress);

            _ApiClient = new CertificateApiClient(httpClient);
        }
        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);
        }
Exemplo n.º 10
0
        public async Task <IActionResult> Grade(CertificateGradeViewModel vm)
        {
            var certificate = await CertificateApiClient.GetCertificate(vm.Id);

            if (certificate.IsPrivatelyFunded)
            {
                return(await SaveViewModel(vm,
                                           returnToIfModelNotValid : "~/Views/Certificate/Grade.cshtml",
                                           nextAction : RedirectToAction("LearnerStartDate", "CertificatePrivateLearnerStartDate"),
                                           action : CertificateActions.Grade));
            }
            return(await SaveViewModel(vm,
                                       returnToIfModelNotValid : "~/Views/Certificate/Grade.cshtml",
                                       nextAction : RedirectToAction("Date", "CertificateDate"), action : CertificateActions.Grade));
        }
        public static CertificateApiClient Setup(Certificate certificate, Mock <ILogger <CertificateApiClient> > apiClientLoggerMock)
        {
            var webConfigMock = new Mock <IWebConfiguration>();
            var hostMock      = new Mock <IHostingEnvironment>();

            hostMock
            .Setup(m => m.EnvironmentName)
            .Returns(EnvironmentName.Development);
            var tokenServiceMock = new TokenService(webConfigMock.Object, hostMock.Object, false);

            var options = Builder <Option> .CreateListOfSize(10)
                          .Build();

            var mockHttp = new MockHttpMessageHandler();

            var client = mockHttp.ToHttpClient();

            client.BaseAddress = new Uri("http://localhost:59022/");

            mockHttp.When($"http://localhost:59022/api/v1/certificates/{certificate.Id}")
            .Respond("application/json", JsonConvert.SerializeObject(certificate));

            mockHttp.When($"http://localhost:59022/api/v1/organisations/{certificate.OrganisationId}")
            .Respond("application/json", JsonConvert.SerializeObject(certificate));

            mockHttp.When($"http://localhost:59022/api/v1/certificates/options/?stdCode={93}")
            .Respond("application/json", JsonConvert.SerializeObject(options));

            var certificateFirstNameViewModel = new CertificateFirstNameViewModel
            {
                Id                = new Guid("1f120837-72d5-40eb-a785-b3936210d47a"),
                FullName          = "James Corley",
                FirstName         = "James",
                FamilyName        = "Corley",
                GivenNames        = "James",
                Level             = 2,
                Standard          = "91",
                IsPrivatelyFunded = true
            };

            mockHttp
            .When(System.Net.Http.HttpMethod.Put, "http://localhost:59022/api/v1/certificates/update")
            .Respond(System.Net.HttpStatusCode.OK, "application/json", "{'status' : 'OK'}");

            var apiClient = new CertificateApiClient(client, tokenServiceMock, apiClientLoggerMock.Object);

            return(apiClient);
        }
        private CertificateApiClient SetupCertificateApiClient(Mock <ILogger <CertificateApiClient> > apiClientLoggerMock)
        {
            Certificate = SetupCertificate();

            var tokenServiceMock = new Mock <ITokenService>();

            var mockHttp = new MockHttpMessageHandler();

            var client = mockHttp.ToHttpClient();

            client.BaseAddress = new Uri("http://localhost:59022/");

            var apiClient = new CertificateApiClient(client.BaseAddress.ToString(), tokenServiceMock.Object, apiClientLoggerMock.Object);

            return(apiClient);
        }
        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);
        }
Exemplo n.º 14
0
        public static CertificateApiClient Setup(Certificate certificate, Mock <ILogger <CertificateApiClient> > apiClientLoggerMock)
        {
            var webConfigMock = new Mock <IWebConfiguration>();
            var hostMock      = new Mock <IHostingEnvironment>();

            hostMock
            .Setup(m => m.EnvironmentName)
            .Returns(EnvironmentName.Development);
            var tokenServiceMock = new TokenService(webConfigMock.Object, hostMock.Object, false);

            var options = Builder <Option> .CreateListOfSize(10)
                          .Build();

            var mockHttp = new MockHttpMessageHandler();

            var client = mockHttp.ToHttpClient();

            client.BaseAddress = new Uri("http://localhost:59022/");

            mockHttp.When($"http://localhost:59022/api/v1/certificates/{certificate.Id}?includeLogs={false}")
            .Respond("application/json", JsonConvert.SerializeObject(certificate));

            mockHttp.When($"http://localhost:59022/api/v1/organisations/{certificate.OrganisationId}")
            .Respond("application/json", JsonConvert.SerializeObject(certificate));

            mockHttp.When($"http://localhost:59022/api/v1/certificates/options/?stdCode={93}")
            .Respond("application/json", JsonConvert.SerializeObject(options));

            mockHttp.When($"http://localhost:59022/api/v1/certificates/options/?stdCode={1}")
            .Respond("application/json", JsonConvert.SerializeObject(options));

            mockHttp.When($"http://localhost:59022/api/v1/certificates/start")
            .Respond("application/json", JsonConvert.SerializeObject(certificate));

            mockHttp
            .When(System.Net.Http.HttpMethod.Put, "http://localhost:59022/api/v1/certificates/update")
            .Respond(System.Net.HttpStatusCode.OK, "application/json", "{'status' : 'OK'}");

            var apiClient = new CertificateApiClient(client, tokenServiceMock, apiClientLoggerMock.Object);

            return(apiClient);
        }
Exemplo n.º 15
0
        public async Task <IActionResult> Check(CertificateCheckViewModel vm)
        {
            // This is the final step in the process so get the latest version of the certificate!
            if (vm is null)
            {
                vm = new CertificateCheckViewModel();
            }
            vm.FromCertificate(await CertificateApiClient.GetCertificate(vm.Id));

            var result = _validator.Validate(vm);

            if (!result.IsValid)
            {
                return(await Check());
            }

            return(await SaveViewModel(vm,
                                       returnToIfModelNotValid : "~/Views/Certificate/Check.cshtml",
                                       nextAction : RedirectToAction("Confirm", "CertificateConfirmation"), action : CertificateActions.Submit));
        }
        private async Task GetGrades()
        {
            string subscriptionKey = Settings.Default["SubscriptionKey"].ToString();
            string apiBaseAddress  = Settings.Default["ApiBaseAddress"].ToString();

            using (HttpClient httpClient = new HttpClient())
            {
                httpClient.BaseAddress = new Uri(apiBaseAddress);
                httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
                httpClient.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
                httpClient.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);

                CertificateApiClient certificateApiClient = new CertificateApiClient(httpClient);

                var grades = new List <string>();

                try
                {
                    BusyIndicator.IsBusy = true;
                    var response = await certificateApiClient.GetGrades();

                    if (response != null)
                    {
                        grades.AddRange(response);
                    }
                }
                finally
                {
                    BusyIndicator.IsBusy = false;
                }

                if (grades.Any())
                {
                    SaveGrades(grades);
                }
            }
        }
Exemplo n.º 17
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);
        }