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