public static DasProviderResultViewModel FromDasProviderResult(DasProviderResult result) { if (result == null) { throw new ArgumentNullException(nameof(result)); } return(new DasProviderResultViewModel { Success = result.Success, Result = result.Result, Messages = result.Exceptions?.Select(e => e is ProviderExportException && e.InnerException != null ? e.InnerException.Message : e.Message).ToArray() }); }
public async Task <IEnumerable <DasProviderResult> > ApprenticeshipsToDasProviders(List <Apprenticeship> apprenticeships) { try { var timer = Stopwatch.StartNew(); var evt = new EventTelemetry { Name = "ApprenticeshipsToDasProviders" }; var apprenticeshipsByUKPRN = apprenticeships .GroupBy(a => a.ProviderUKPRN) .OrderBy(g => g.Key) .ToArray(); var providers = (await _providerServiceClient.GetAllProviders()) .ToArray(); var feChoices = (await _referenceDataServiceClient.GetAllFeChoiceData()) .ToArray(); evt.Metrics.TryAdd("Apprenticeships", apprenticeships.Count); evt.Metrics.TryAdd("Providers", apprenticeshipsByUKPRN.Length); Console.WriteLine($"[{DateTime.UtcNow:G}] Found {apprenticeships.Count} apprenticeships for {apprenticeshipsByUKPRN.Length} Providers"); var results = new ConcurrentBag <DasProviderResult>(); Parallel.ForEach(apprenticeshipsByUKPRN.Select((g, i) => new { UKPRN = g.Key, Index = i, Apprenticeships = g.Where(a => a.RecordStatus == RecordStatus.Live).ToList() }), p => { try { var provider = ExportProvider( p.UKPRN, p.Index + 1000, providers.Where(pp => pp.UnitedKingdomProviderReferenceNumber == p.UKPRN.ToString()), p.Apprenticeships, feChoices.SingleOrDefault(f => f.UKPRN == p.UKPRN)); results.Add(DasProviderResult.Succeeded(p.UKPRN, provider)); Console.WriteLine($"[{DateTime.UtcNow:G}][INFO] Exported {p.UKPRN} ({p.Index} of {p.Apprenticeships.Count})"); } catch (ExportException ex) { results.Add(DasProviderResult.Failed(p.UKPRN, ex)); _telemetryClient.TrackException(ex); Console.WriteLine($"[{DateTime.UtcNow:G}][ERROR] Failed to export {p.UKPRN} ({p.Index} of {p.Apprenticeships.Count})"); } }); timer.Stop(); var success = results.Count(r => r.Success); var failure = results.Count(r => !r.Success); Console.WriteLine($"[{DateTime.UtcNow:G}] Exported {results.Count(r => r.Success)} Providers in {timer.Elapsed.TotalSeconds} seconds."); if (failure > 0) { Console.WriteLine($"[{DateTime.UtcNow:G}] [WARNING] Encountered {failure} errors that need attention"); } evt.Metrics.TryAdd("Export elapsed time (ms)", timer.ElapsedMilliseconds); evt.Metrics.TryAdd("Export success", success); evt.Metrics.TryAdd("Export failures", failure); _telemetryClient.TrackEvent(evt); return(results.OrderBy(r => r.UKPRN).ToList()); } catch (Exception e) { throw new ProviderServiceException(e); } }