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();
        }
Ejemplo n.º 3
0
        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();
        }
Ejemplo n.º 5
0
        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();
        }
Ejemplo n.º 8
0
        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();
        }
Ejemplo n.º 9
0
        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());
        }
Ejemplo n.º 10
0
        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));
            }
        }