public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "graph/purge/{soc}/{socId}")] HttpRequest?request, int soc, Guid socId, [DurableClient] IDurableOrchestrationClient starter) { try { var socRequest = new SocRequestModel { Soc = soc, SocId = socId, IsDraftEnvironment = environmentValues.IsDraftEnvironment, }; if (!socRequest.IsDraftEnvironment) { return(new BadRequestResult()); } logger.LogInformation($"Received graph purge for SOC {soc} request"); string instanceId = await starter.StartNewAsync(nameof(LmiImportOrchestrationTrigger.GraphPurgeSocOrchestrator), socRequest).ConfigureAwait(false); logger.LogInformation($"Started orchestration with ID = '{instanceId}' for SOC {soc}."); return(starter.CreateCheckStatusResponse(request, instanceId)); } catch (Exception ex) { logger.LogError(ex.ToString()); return(new StatusCodeResult((int)HttpStatusCode.InternalServerError)); } }
public async Task PagesControllerHeadJsonReturnsSuccess(string mediaTypeName) { // Arrange var dummyJobGroupModel = A.Dummy <JobGroupModel>(); var controller = BuildPagesController(mediaTypeName); var socRequestModel = new SocRequestModel { Soc = 3231, FromJobProfileCanonicalName = "a-job-profile", }; var dummyHeadViewModel = A.Dummy <HeadViewModel>(); A.CallTo(() => FakeJobGroupDocumentService.GetAsync(A <Expression <Func <JobGroupModel, bool> > > .Ignored, A <string> .Ignored)).Returns(dummyJobGroupModel); A.CallTo(() => FakeMapper.Map <HeadViewModel>(A <JobGroupModel> .Ignored)).Returns(dummyHeadViewModel); // Act var result = await controller.Head(socRequestModel).ConfigureAwait(false); // Assert A.CallTo(() => FakeJobGroupDocumentService.GetAsync(A <Expression <Func <JobGroupModel, bool> > > .Ignored, A <string> .Ignored)).MustHaveHappenedOnceExactly(); A.CallTo(() => FakeMapper.Map <HeadViewModel>(A <JobGroupModel> .Ignored)).MustHaveHappenedOnceExactly(); var jsonResult = Assert.IsType <OkObjectResult>(result); _ = Assert.IsAssignableFrom <HeadViewModel>(jsonResult.Value); controller.Dispose(); }
public async Task <IActionResult> Breadcrumb(SocRequestModel socRequest) { var jobGroupModel = await jobGroupDocumentService.GetAsync(w => w.Soc == socRequest.Soc, socRequest.Soc.ToString(CultureInfo.InvariantCulture)).ConfigureAwait(false); if (jobGroupModel != null) { BreadcrumbItemModel?breadcrumbItemModel = default; if (!string.IsNullOrWhiteSpace(socRequest.FromJobProfileCanonicalName) && jobGroupModel.JobProfiles != null && jobGroupModel.JobProfiles.Any()) { breadcrumbItemModel = new BreadcrumbItemModel() { Route = "/job-profiles/" + socRequest.FromJobProfileCanonicalName, Title = jobGroupModel.JobProfiles.FirstOrDefault(f => !string.IsNullOrWhiteSpace(f.CanonicalName) && f.CanonicalName.Equals(socRequest.FromJobProfileCanonicalName, System.StringComparison.OrdinalIgnoreCase))?.Title, }; } var viewModel = BuildBreadcrumb(RegistrationPath, breadcrumbItemModel, jobGroupModel.Title); logger.LogInformation($"{nameof(Breadcrumb)} has succeeded for: {socRequest.Soc}"); return(this.NegotiateContentResult(viewModel)); } logger.LogWarning($"{nameof(Breadcrumb)} has returned no content for: {socRequest.Soc}"); return(NoContent()); }
public async Task PagesControllerBodyReturnsNotAcceptable(string mediaTypeName) { // Arrange var dummyJobGroupModel = A.Dummy <JobGroupModel>(); var controller = BuildPagesController(mediaTypeName); var socRequestModel = new SocRequestModel { Soc = 3231, FromJobProfileCanonicalName = "a-job-profile", }; var dummyBodyViewModel = A.Dummy <BodyViewModel>(); A.CallTo(() => FakeJobGroupDocumentService.GetAsync(A <Expression <Func <JobGroupModel, bool> > > .Ignored, A <string> .Ignored)).Returns(dummyJobGroupModel); A.CallTo(() => FakeMapper.Map <BodyViewModel>(A <JobGroupModel> .Ignored)).Returns(dummyBodyViewModel); // Act var result = await controller.Body(socRequestModel).ConfigureAwait(false); // Assert A.CallTo(() => FakeJobGroupDocumentService.GetAsync(A <Expression <Func <JobGroupModel, bool> > > .Ignored, A <string> .Ignored)).MustHaveHappenedOnceExactly(); A.CallTo(() => FakeMapper.Map <BodyViewModel>(A <JobGroupModel> .Ignored)).MustHaveHappenedOnceExactly(); var statusResult = Assert.IsType <StatusCodeResult>(result); A.Equals((int)HttpStatusCode.NotAcceptable, statusResult.StatusCode); controller.Dispose(); }
public async Task <IActionResult> SideBarRight(SocRequestModel socRequest) { var jobGroupModel = await jobGroupDocumentService.GetAsync(w => w.Soc == socRequest.Soc, socRequest.Soc.ToString(CultureInfo.InvariantCulture)).ConfigureAwait(false); if (jobGroupModel != null) { var viewModel = mapper.Map <SideBarRightViewModel>(jobGroupModel); if (!string.IsNullOrWhiteSpace(socRequest.FromJobProfileCanonicalName) && viewModel.JobProfiles != null && viewModel.JobProfiles.Any()) { var jobProfile = viewModel.JobProfiles.FirstOrDefault(f => !string.IsNullOrWhiteSpace(f.CanonicalName) && f.CanonicalName.Equals(socRequest.FromJobProfileCanonicalName, System.StringComparison.OrdinalIgnoreCase)); if (jobProfile != null) { viewModel.JobProfiles.Remove(jobProfile); } } var sharedContentAskAdviser = await sharedContentDocumentService.GetByIdAsync(Guid.Parse(Constants.SharedContentAskAdviserItemId)).ConfigureAwait(false); viewModel.SharedContent = new SharedContentViewModel { Markup = new HtmlString(sharedContentAskAdviser?.Content), }; logger.LogInformation($"{nameof(SideBarRight)} has succeeded for: {socRequest.Soc}"); return(this.NegotiateContentResult(viewModel)); } logger.LogWarning($"{nameof(SideBarRight)} has returned no content for: {socRequest.Soc}"); return(NoContent()); }
public async Task PagesControllerSideBarRightJsonReturnsSuccess(string mediaTypeName) { // Arrange var dummyJobGroupModel = A.Dummy <JobGroupModel>(); var dummyContentItemModel = A.Dummy <ContentItemModel>(); var controller = BuildPagesController(mediaTypeName); var socRequestModel = new SocRequestModel { Soc = 3231, FromJobProfileCanonicalName = "a-job-profile", }; var dummySideBarRightViewModel = A.Dummy <SideBarRightViewModel>(); dummySideBarRightViewModel.JobProfiles = new List <JobProfileViewModel> { new JobProfileViewModel { CanonicalName = socRequestModel.FromJobProfileCanonicalName, Title = "A title" }, }; A.CallTo(() => FakeJobGroupDocumentService.GetAsync(A <Expression <Func <JobGroupModel, bool> > > .Ignored, A <string> .Ignored)).Returns(dummyJobGroupModel); A.CallTo(() => FakeMapper.Map <SideBarRightViewModel>(A <JobGroupModel> .Ignored)).Returns(dummySideBarRightViewModel); A.CallTo(() => FakeSharedContentDocumentService.GetByIdAsync(A <Guid> .Ignored, A <string> .Ignored)).Returns(dummyContentItemModel); // Act var result = await controller.SideBarRight(socRequestModel).ConfigureAwait(false); // Assert A.CallTo(() => FakeJobGroupDocumentService.GetAsync(A <Expression <Func <JobGroupModel, bool> > > .Ignored, A <string> .Ignored)).MustHaveHappenedOnceExactly(); A.CallTo(() => FakeMapper.Map <SideBarRightViewModel>(A <JobGroupModel> .Ignored)).MustHaveHappenedOnceExactly(); A.CallTo(() => FakeSharedContentDocumentService.GetByIdAsync(A <Guid> .Ignored, A <string> .Ignored)).MustHaveHappenedOnceExactly(); var jsonResult = Assert.IsType <OkObjectResult>(result); _ = Assert.IsAssignableFrom <SideBarRightViewModel>(jsonResult.Value); controller.Dispose(); }
public async Task PagesControllerSideBarRightReturnsNoContentWhenNoData(string mediaTypeName) { // Arrange JobGroupModel?nullJobGroupModel = null; var controller = BuildPagesController(mediaTypeName); var socRequestModel = new SocRequestModel { Soc = 3231, FromJobProfileCanonicalName = "a-job-profile", }; A.CallTo(() => FakeJobGroupDocumentService.GetAsync(A <Expression <Func <JobGroupModel, bool> > > .Ignored, A <string> .Ignored)).Returns(nullJobGroupModel); // Act var result = await controller.SideBarRight(socRequestModel).ConfigureAwait(false); // Assert A.CallTo(() => FakeJobGroupDocumentService.GetAsync(A <Expression <Func <JobGroupModel, bool> > > .Ignored, A <string> .Ignored)).MustHaveHappenedOnceExactly(); A.CallTo(() => FakeMapper.Map <SideBarRightViewModel>(A <JobGroupModel> .Ignored)).MustNotHaveHappened(); A.CallTo(() => FakeSharedContentDocumentService.GetByIdAsync(A <Guid> .Ignored, A <string> .Ignored)).MustNotHaveHappened(); var statusResult = Assert.IsType <NoContentResult>(result); A.Equals((int)HttpStatusCode.NoContent, statusResult.StatusCode); controller.Dispose(); }
public async Task PagesControllerBreadcrumbJsonReturnsSuccess(string mediaTypeName) { // Arrange var socRequestModel = new SocRequestModel { Soc = 3231, FromJobProfileCanonicalName = "a-job-profile", }; var dummyJobGroupModel = A.Dummy <JobGroupModel>(); dummyJobGroupModel.JobProfiles = new List <JobProfileModel> { new JobProfileModel { CanonicalName = socRequestModel.FromJobProfileCanonicalName, Title = "A title" }, }; var controller = BuildPagesController(mediaTypeName); var breadcrumbViewModel = new BreadcrumbViewModel { Breadcrumbs = new List <BreadcrumbItemViewModel> { new BreadcrumbItemViewModel { Title = "Home: Explore careers", Route = "/", }, new BreadcrumbItemViewModel { Title = dummyJobGroupModel.JobProfiles.First().Title, Route = $"/job-profiles/" + dummyJobGroupModel.JobProfiles.First().CanonicalName, }, new BreadcrumbItemViewModel { Title = "Job group LMI", Route = $"/{PagesController.RegistrationPath}", AddHyperlink = false, }, }, }; A.CallTo(() => FakeJobGroupDocumentService.GetAsync(A <Expression <Func <JobGroupModel, bool> > > .Ignored, A <string> .Ignored)).Returns(dummyJobGroupModel); // Act var result = await controller.Breadcrumb(socRequestModel).ConfigureAwait(false); // Assert A.CallTo(() => FakeJobGroupDocumentService.GetAsync(A <Expression <Func <JobGroupModel, bool> > > .Ignored, A <string> .Ignored)).MustHaveHappenedOnceExactly(); var jsonResult = Assert.IsType <OkObjectResult>(result); Assert.IsAssignableFrom <BreadcrumbViewModel>(jsonResult.Value); var viewModel = jsonResult.Value as BreadcrumbViewModel; Assert.Equal(breadcrumbViewModel.Breadcrumbs[1].Title, viewModel?.Breadcrumbs?[1].Title); Assert.Equal(breadcrumbViewModel.Breadcrumbs[1].Route, viewModel?.Breadcrumbs?[1].Route); controller.Dispose(); }
public async Task <IActionResult> Body(SocRequestModel socRequest) { var jobGroupModel = await jobGroupDocumentService.GetAsync(w => w.Soc == socRequest.Soc, socRequest.Soc.ToString(CultureInfo.InvariantCulture)).ConfigureAwait(false); if (jobGroupModel != null) { var viewModel = mapper.Map <BodyViewModel>(jobGroupModel); logger.LogInformation($"{nameof(Body)} has succeeded for: {socRequest.Soc}"); return(this.NegotiateContentResult(viewModel)); } logger.LogWarning($"{nameof(Body)} has returned no content for: {socRequest.Soc}"); return(NotFound()); }
public async Task <IActionResult> Head(SocRequestModel socRequest) { var jobGroupModel = await jobGroupDocumentService.GetAsync(w => w.Soc == socRequest.Soc, socRequest.Soc.ToString(CultureInfo.InvariantCulture)).ConfigureAwait(false); if (jobGroupModel != null) { var viewModel = mapper.Map <HeadViewModel>(jobGroupModel); viewModel.CanonicalUrl = new Uri($"{Request.GetBaseAddress()}{RegistrationPath}/{jobGroupModel.Soc}", UriKind.RelativeOrAbsolute); logger.LogInformation($"{nameof(Head)} has succeeded for: {socRequest.Soc}"); return(this.NegotiateContentResult(viewModel)); } logger.LogWarning($"{nameof(Head)} has returned no content for: {socRequest.Soc}"); return(NoContent()); }
public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "lmi/webhook")] HttpRequest?request, [DurableClient] IDurableOrchestrationClient starter) { try { logger.LogInformation("Received webhook request"); using var streamReader = new StreamReader(request?.Body !); var requestBody = await streamReader.ReadToEndAsync().ConfigureAwait(false); if (string.IsNullOrEmpty(requestBody)) { logger.LogError($"{nameof(request)} body is null"); return(new BadRequestResult()); } string? instanceId = null; SocRequestModel?socRequest = null; var webhookRequestModel = lmiWebhookReceiverService.ExtractEvent(requestBody); switch (webhookRequestModel.WebhookCommand) { case WebhookCommand.SubscriptionValidation: return(new OkObjectResult(webhookRequestModel.SubscriptionValidationResponse)); case WebhookCommand.TransformAllSocToJobGroup: socRequest = new SocRequestModel { Uri = webhookRequestModel.Url, }; instanceId = await starter.StartNewAsync(nameof(LmiOrchestrationTrigger.RefreshOrchestrator), socRequest).ConfigureAwait(false); break; case WebhookCommand.TransformSocToJobGroup: socRequest = new SocRequestModel { Uri = webhookRequestModel.Url, SocId = webhookRequestModel.ContentId, }; instanceId = await starter.StartNewAsync(nameof(LmiOrchestrationTrigger.RefreshJobGroupOrchestrator), socRequest).ConfigureAwait(false); break; case WebhookCommand.PurgeAllJobGroups: socRequest = new SocRequestModel { Uri = webhookRequestModel.Url, }; instanceId = await starter.StartNewAsync(nameof(LmiOrchestrationTrigger.PurgeOrchestrator), socRequest).ConfigureAwait(false); break; case WebhookCommand.PurgeJobGroup: socRequest = new SocRequestModel { Uri = webhookRequestModel.Url, SocId = webhookRequestModel.ContentId, }; instanceId = await starter.StartNewAsync(nameof(LmiOrchestrationTrigger.PurgeJobGroupOrchestrator), socRequest).ConfigureAwait(false); break; default: return(new BadRequestResult()); } logger.LogInformation($"Started orchestration with ID = '{instanceId}' for SOC {socRequest?.Uri}"); return(starter.CreateCheckStatusResponse(request, instanceId)); } catch (Exception ex) { logger.LogError(ex.ToString()); return(new StatusCodeResult((int)HttpStatusCode.InternalServerError)); } }