private static async Task <JObject> RunCreate(ISiteFinityHttpService service, ILogger logger, string contentType, JObject source, Relation[] relations)
        {
            var contentTypeUrl = $"{contentType}";

            source["PublicationDate"] = DateTime.Now.ToString("O");
            source.InterpolateProperties();

            var result = await service.PostData(contentTypeUrl, source).FromJson <JObject>();

            if (result.ContainsKey("error"))
            {
                throw new Exception($"Error creating {contentType}: {result["error"].Value<string>("message")}");
            }

            if (!_relatedTypesCache.TryGetValue(contentType.ToLower(), out var cachedValues))
            {
                cachedValues = new List <JObject>();
                _relatedTypesCache[contentType.ToLower()] = cachedValues;
            }

            cachedValues.Add(result);

            if (relations != null && relations.Length > 0)
            {
                await CreateRelations(service, logger, contentType, result.Value <String>("Id"), relations);
            }

            return(result);
        }
        public static async Task Run([TimerTrigger(Schedule)] TimerInfo myTimer,
                                     ILogger log,
                                     [Inject] ISiteFinityHttpService siteFinityHttpService,
                                     [Inject] IContentTypeProcessor <ShortTraitDataProcessor> shortTraitDataProcessor,
                                     [Inject] IContentTypeProcessor <ShortQuestionSetDataProcessor> shortQuestionSetDataProcessor,
                                     [Inject] IContentTypeProcessor <FilteredQuestionSetDataProcessor> filteredQuestionSetDataProcessor,
                                     [Inject] IContentTypeProcessor <JobCategoryDataProcessor> jobCategoryDataProcessor,
                                     [Inject] IContentTypeProcessor <JobProfileSkillsProcessor> jobProfileSkillDataProcessor
                                     )
        {
            var id = Guid.NewGuid();

            try
            {
                siteFinityHttpService.Logger = log;

                log.LogInformation($"PollFunction executed at: {myTimer.ScheduleStatus.Last:O}");

                await shortTraitDataProcessor.RunOnce(log);

                await jobCategoryDataProcessor.RunOnce(log);

                await shortQuestionSetDataProcessor.RunOnce(log);

                await filteredQuestionSetDataProcessor.RunOnce(log);

                await jobProfileSkillDataProcessor.RunOnce(log);

                log.LogInformation($"PollFunction completed at: {DateTime.UtcNow}");
            }
            catch (Exception ex)
            {
                log.LogError(ex, $"Running CMS extract function failed. {ex.Message}");
            }
        }
        public static async Task RunWorkflowFromFile(ISiteFinityHttpService service, ILogger logger, string workflowFile, string outputDirectory)
        {
            var workflow = ReadWorkflow(workflowFile);

            logger.LogInformation($"Read workflow file {workflowFile}");

            await RunWorkflow(service, logger, workflow, outputDirectory);
        }
        public ShortTraitDataProcessorTests()
        {
            _siteFinityHttpService = Substitute.For <ISiteFinityHttpService>();
            _shortTraitRepository  = Substitute.For <IShortTraitRepository>();
            _logger = Substitute.For <ILogger>();

            _sut = new ShortTraitDataProcessor(_siteFinityHttpService, _shortTraitRepository);
        }
        public static async Task RunDelete(ISiteFinityHttpService service, string contentType)
        {
            var instances = await service.GetAll <JObject>(contentType);

            foreach (var instance in instances)
            {
                await service.Delete($"{contentType}({instance.Value<string>("Id")})");
            }
        }
 public FilteredQuestionSetDataProcessor(
     IQuestionRepository questionRepository,
     IQuestionSetRepository questionSetRepository,
     ISiteFinityHttpService sitefinity)
 {
     _questionRepository    = questionRepository;
     _questionSetRepository = questionSetRepository;
     _sitefinity            = sitefinity;
 }
        public ShortQuestionSetDataProcessorTests()
        {
            _questionRepository    = Substitute.For <IQuestionRepository>();
            _questionSetRepository = Substitute.For <IQuestionSetRepository>();
            _siteFinityHttpService = Substitute.For <ISiteFinityHttpService>();
            _logger = Substitute.For <ILogger>();

            _sut = new ShortQuestionSetDataProcessor(_siteFinityHttpService, _questionRepository, _questionSetRepository);
        }
 public JobProfileSkillsProcessor(
     ISiteFinityHttpService sitefinity,
     IJobCategoryRepository jobCategoryRepository,
     IOptions <AppSettings> appSettings)
 {
     _sitefinity            = sitefinity;
     _jobCategoryRepository = jobCategoryRepository;
     _appSettings           = appSettings;
 }
 public ShortQuestionSetDataProcessor(
     ISiteFinityHttpService sitefinity,
     IQuestionRepository questionRepository,
     IQuestionSetRepository questionSetRepository)
 {
     _sitefinity            = sitefinity;
     _questionRepository    = questionRepository;
     _questionSetRepository = questionSetRepository;
 }
 public JobCategoryDataProcessor(
     ISiteFinityHttpService sitefinity,
     IOptions <AppSettings> appSettings,
     IJobCategoryRepository jobCategoryRepository)
 {
     _appSettings           = appSettings.Value;
     _sitefinity            = sitefinity;
     _jobCategoryRepository = jobCategoryRepository;
 }
        public JobCategoryDataProcessorTests()
        {
            _siteFinityHttpService = Substitute.For <ISiteFinityHttpService>();
            _jobCategoryRepository = Substitute.For <IJobCategoryRepository>();
            _appSettings           = Substitute.For <IOptions <AppSettings> >();
            _logger = Substitute.For <ILogger>();

            _appSettings.Value.Returns(new AppSettings()
            {
                SiteFinityJobCategoriesTaxonomyId = "Job Profile Category"
            });

            _sut = new JobCategoryDataProcessor(_siteFinityHttpService, _appSettings, _jobCategoryRepository);
        }
コード例 #12
0
        public JobProfileSkillsProcessorTests()
        {
            _siteFinityHttpService = Substitute.For <ISiteFinityHttpService>();
            _jobCategoryRepository = Substitute.For <IJobCategoryRepository>();
            _appSettings           = Substitute.For <IOptions <AppSettings> >();
            _logger = Substitute.For <ILogger>();

            JobCategories =
                JsonConvert.DeserializeObject <List <TaxonomyHierarchy> >(File.ReadAllText("Data/SiteFinityData/job-categories.json"));
            JobProfiles =
                JsonConvert.DeserializeObject <List <SiteFinityJobProfile> >(File.ReadAllText("Data/SiteFinityData/job-profiles.json"));

            _appSettings.Value.Returns(new AppSettings()
            {
                MaxPercentageDistributionOfJobProfiles  = 0.75,
                MaxPercentageOfProfileOccurenceForSkill = 0.75
            });

            _sut = new JobProfileSkillsProcessor(_siteFinityHttpService, _jobCategoryRepository, _appSettings);
        }
        public static async Task RunWorkflow(ISiteFinityHttpService service, ILogger logger,
                                             Workflow workflow, string outputDirectory)
        {
            foreach (var step in workflow.Steps)
            {
                logger.LogInformation($"Running step {step.Action} {step.ContentType}");

                switch (step.Action)
                {
                case Action.Create:
                {
                    var created = await RunCreate(service, logger, step.ContentType, step.Data, step.Relates);

                    logger.LogInformation($"Created {step.ContentType}{Environment.NewLine}{created.ToString(Formatting.Indented)}");
                    break;
                }

                case Action.Delete:
                {
                    await RunDelete(service, step.ContentType);

                    break;
                }

                case Action.Extract:
                {
                    var dir = Directory.CreateDirectory(Path.GetFullPath(outputDirectory));
                    await RunExtract(service, dir.FullName, step.ContentType);

                    logger.LogInformation($"Extracted {step.ContentType}");
                    break;
                }

                default:
                    throw new ArgumentOutOfRangeException($"Unknown action: {step.Action}");
                }

                logger.LogInformation($"Completed step {step.Action} {step.ContentType}");
            }
        }
        private static async Task RunExtract(ISiteFinityHttpService service, string outputDir, string contentType)
        {
            var instances = await service.GetAll <JObject>(contentType);

            File.WriteAllText(Path.Combine(outputDir, $"{contentType.Split('?')[0]}.json"), JsonConvert.SerializeObject(instances, Formatting.Indented));
        }
コード例 #15
0
 public JobProfileRepository(ISearchIndexClient client, ISiteFinityHttpService siteFinityHttpService)
 {
     _client = client;
     _siteFinityHttpService = siteFinityHttpService;
 }
        private static async Task CreateRelations(ISiteFinityHttpService service, ILogger logger, string sourceContentType, string sourceId, Relation[] relations)
        {
            foreach (var relation in relations)
            {
                if (!_relatedTypesCache.TryGetValue(relation.ContentType.ToLower(), out var relatedData))
                {
                    List <JObject> response;
                    if (!relation.IsTaxonomy)
                    {
                        response = await service.GetAll <JObject>(relation.RelatedType.ContentType);
                    }
                    else
                    {
                        var data = await service.GetTaxonomyInstances(relation.ContentType);

                        response = data.Select(s => JObject.FromObject(s)).ToList();
                    }

                    relatedData = response;
                    _relatedTypesCache[relation.ContentType.ToLower()] = relatedData;
                }

                foreach (var jObject in relatedData)
                {
                    if (!jObject.ContainsKey(relation.Property))
                    {
                        logger.LogError(new KeyNotFoundException($"Expected property {relation.Property} on content type {JObject.FromObject(relation.RelatedType).ToString(Formatting.Indented)}"), "Invalid property on relation");
                    }

                    var key = jObject.Value <string>(relation.Property);

                    foreach (var value in relation.Values)
                    {
                        if (String.Equals(key, value, StringComparison.InvariantCultureIgnoreCase))
                        {
                            var id = (string)jObject["Id"];

                            var navProp = !String.IsNullOrWhiteSpace(relation.RelatedType.NavigationProperty)
                                ? relation.RelatedType.NavigationProperty
                                : relation.RelatedType.Type;

                            var refUrl      = $"{sourceContentType}({sourceId})/{navProp}/$ref";
                            var relatedType = relation.IsTaxonomy ? "taxonomies" : relation.RelatedType.ContentType;
                            var oDataId     = service.MakeAbsoluteUri($"{relatedType}({id})");
                            var response    = await service.PostData(refUrl, $"{{ \"@odata.id\": \"{oDataId}\"  }}");

                            try
                            {
                                var result = response.FromJson <JObject>();

                                if (result != null && result.ContainsKey("error"))
                                {
                                    throw new Exception($"Error creating relation {value} -> {id} : {relation.Property} : {relation.ContentType} {result["error"].Value<string>("message")}");
                                }
                            }
                            catch (Exception e)
                            {
                                logger.LogError(e, "Unable to create relation.");
                            }
                        }
                    }
                }
            }
        }
 public ShortTraitDataProcessor(ISiteFinityHttpService sitefinity, IShortTraitRepository shortTraitRepository)
 {
     _sitefinity           = sitefinity;
     _shortTraitRepository = shortTraitRepository;
 }