public Task Execute(IJobExecutionContext context) { var jobData = QuartzScheduler.GetJobDataConfiguration <MunicipalityCodeJobDataConfiguration>(context.JobDetail); var serviceProvider = context.Scheduler.Context.Get(QuartzScheduler.SERVICE_PROVIDER) as IServiceProvider; ExecuteInternal(unitOfWork => { var content = Download(jobData.Url, GetKapaConfiguration(context)); // roughly 300k var downloadedMunicipalityCodes = Parse(content); var existingMunicipalityCodes = unitOfWork.CreateRepository <IMunicipalityRepository>() .All() .Include(a => a.MunicipalityNames).ThenInclude(b => b.Localization) .ToList(); // add new postal codes and update existing var vmToEntity = serviceProvider.GetRequiredService <ITranslationViewModel>(); vmToEntity.TranslateAll <VmJsonMunicipality, Municipality>(downloadedMunicipalityCodes, unitOfWork); // invalidate not exist postal codes var municipalityCodesToInvalidate = existingMunicipalityCodes.Where(em => !downloadedMunicipalityCodes.Select(a => a.MunicipalityCode).Contains(em.Code)).ToList(); municipalityCodesToInvalidate.ForEach(m => m.IsValid = false); unitOfWork.Save(SaveMode.AllowAnonymous, userName: context.JobDetail.Key.Name); }, context); return(Task.CompletedTask); }
public Task Execute(IJobExecutionContext context) { var serviceProvider = context.Scheduler.Context.Get(QuartzScheduler.SERVICE_PROVIDER) as IServiceProvider; var jobData = QuartzScheduler.GetJobDataConfiguration <FintoDataJobDataConfiguration>(context.JobDetail); ExecuteInternal(() => { var settings = FintoJobExtension.GetSettings(jobData.DownloadType); var typeSettings = FintoJobExtension.SetDownloadDefinition(settings, jobData.DownloadType); var downloadFintoTask = new DownloadFintoDataTask(); downloadFintoTask.DownloadData(settings).Wait(); if (typeSettings.MergeTo == null) { return; } var service = serviceProvider.GetService <ISeedingService>(); service?.SeedOntologyTerms(typeSettings.MergeTo, context.JobDetail.Key.Name); }, context); return(Task.CompletedTask); }
public Task Execute(IJobExecutionContext context) { var jobData = QuartzScheduler.GetJobDataConfiguration <AreaCodeJobDataConfiguration>(context.JobDetail); var serviceProvider = context.Scheduler.Context.Get(QuartzScheduler.SERVICE_PROVIDER) as IServiceProvider; var typesCache = serviceProvider.GetRequiredService <ITypesCache>(); var areaTypeId = typesCache.Get <AreaType>(AreaType.ToString()); ExecuteInternal(unitOfWork => { var kapaConfiguration = GetKapaConfiguration(context); var content = Download(jobData.Url, kapaConfiguration); var downloadedAreas = Parse(content).ToList(); var existingAreas = unitOfWork.CreateRepository <IAreaRepository>() .All() .Where(a => a.AreaTypeId == areaTypeId /* && a.IsValid*/) .Include(a => a.AreaNames).ThenInclude(b => b.Localization) .Include(a => a.AreaMunicipalities).ThenInclude(m => m.Municipality) .ToList(); var vmToEntity = serviceProvider.GetRequiredService <ITranslationViewModel>(); // get municipalities from repository var municipalities = unitOfWork.CreateRepository <IMunicipalityRepository>().All().ToDictionary(m => m.Code, m => m.Id); var missingAreaCodes = downloadedAreas.Where(pc => !existingAreas.Select(epc => epc.Code).Contains(pc.Code)).ToList(); if (missingAreaCodes.Any()) { // add missing municipalities missingAreaCodes.ForEach(mpc => { mpc.Municipalities = GetRegionMunicipalities(jobData.MunicipalityUrl, kapaConfiguration, mpc.Code); mpc.Municipalities.ForEach(m => { mpc.AreaTypeId = areaTypeId; var municipalityId = municipalities.ContainsKey(m) ? municipalities[m] : (Guid?)null; if (municipalityId == null) { throw new Exception($"Municipality of code: {m} doesn't exist."); } mpc.AreaMunicipalities.Add(new VmJsonAreaMunicipality { MunicipalityId = municipalityId.Value }); }); }); var rep = unitOfWork.CreateRepository <IAreaRepository>(); var toSave = vmToEntity.TranslateAll <VmJsonArea, Area>(missingAreaCodes, unitOfWork); toSave.ForEach(a => { a.IsValid = true; rep.Add(a); }); } // invalidate not exist areas var downloadedAreaCodes = downloadedAreas.Select(a => a.Code).ToList(); var areasToInvalidate = existingAreas.Where(ea => !downloadedAreaCodes.Contains(ea.Code)); areasToInvalidate.ForEach(a => a.IsValid = false); // validate existing areas var areasToValidate = existingAreas.Where(ea => !ea.IsValid && downloadedAreaCodes.Contains(ea.Code)).ToList(); areasToValidate.ForEach(a => a.IsValid = true); // handle names var nameRep = unitOfWork.CreateRepository <IAreaNameRepository>(); var namesToAdd = HandleCodeNames(unitOfWork, nameRep, existingAreas.Where(pc => pc.IsValid), downloadedAreas.OfType <IJsonCodeNamesItem>().ToList()); namesToAdd.ForEach(nta => { var itemName = vmToEntity.Translate <VmJsonName, AreaName>(nta, unitOfWork); if (!nta.OwnerReferenceId.HasValue) { return; } itemName.AreaId = nta.OwnerReferenceId.Value; nameRep.Add(itemName); }); // handle municipalities var areaMunicipalityRep = unitOfWork.CreateRepository <IAreaMunicipalityRepository>(); existingAreas.ForEach(ea => { var existingMunicipalities = ea.AreaMunicipalities.ToList(); var downloadedMunicipalities = ParseMunicipalities(Download(ParseKapaConfigurationForMunicipality(jobData.MunicipalityUrl, kapaConfiguration, ea.Code))); // municipalities to delete var municipalitiesToDelete = existingMunicipalities.Where(em => !downloadedMunicipalities.Contains(em.Municipality?.Code)); municipalitiesToDelete.ForEach(am => { areaMunicipalityRep.Remove(am); }); // municipalities to add var municipalitiesToAdd = downloadedMunicipalities.Where(dm => !existingMunicipalities.Select(m => m.Municipality?.Code).Contains(dm)); municipalitiesToAdd.ForEach(m => { if (!municipalities.ContainsKey(m)) { return; } areaMunicipalityRep.Add(new AreaMunicipality { AreaId = ea.Id, MunicipalityId = municipalities[m] }); }); }); // save unitOfWork.Save(SaveMode.AllowAnonymous, userName: context.JobDetail.Key.Name); }, context); return(Task.CompletedTask); }