public async Task <Response> Handle(Query request, CancellationToken cancellationToken) { var providerContext = _providerContextProvider.GetProviderContext(); var apprenticeships = await _sqlQueryDispatcher.ExecuteQuery(new GetApprenticeshipsForProvider() { ProviderId = providerContext.ProviderInfo.ProviderId }); var allRegions = await _regionCache.GetAllRegions(); var rows = apprenticeships .OrderBy(x => x.Standard.StandardCode) .ThenBy(x => x.Standard.Version) .SelectMany(app => CsvApprenticeshipRow.FromModel(app, allRegions)) .ToList(); var fileName = FileNameHelper.SanitizeFileName( $"{providerContext.ProviderInfo.ProviderName}_apprenticeships_{_clock.UtcNow:yyyyMMddHHmm}.csv"); return(new Response() { FileName = fileName, Rows = rows }); }
internal async Task <UploadStatus> RevalidateApprenticeshipUploadIfRequired( ISqlQueryDispatcher sqlQueryDispatcher, Guid apprenticeshipUploadId) { var apprenticeshipUpload = await sqlQueryDispatcher.ExecuteQuery(new GetApprenticeshipUpload() { ApprenticeshipUploadId = apprenticeshipUploadId }); if (apprenticeshipUpload == null) { throw new ArgumentException("Apprenticeship upload does not exist.", nameof(apprenticeshipUploadId)); } var toBeRevalidated = await GetApprenticeshipUploadRowsRequiringRevalidation(sqlQueryDispatcher, apprenticeshipUpload); if (toBeRevalidated.Count == 0) { return(apprenticeshipUpload.UploadStatus); } var rowsCollection = new ApprenticeshipDataUploadRowInfoCollection( toBeRevalidated.Select(r => new ApprenticeshipDataUploadRowInfo(CsvApprenticeshipRow.FromModel(r), r.RowNumber, r.ApprenticeshipId))); var(uploadStatus, _) = await ValidateApprenticeshipUploadRows(sqlQueryDispatcher, apprenticeshipUploadId, apprenticeshipUpload.ApprenticeshipUploadId, rowsCollection); return(uploadStatus); }
public static ParsedCsvApprenticeshipRow FromCsvApprenticeshipRow(CsvApprenticeshipRow row, IEnumerable <Region> allRegions) { var parsedRow = row.Adapt(new ParsedCsvApprenticeshipRow()); parsedRow.ResolvedDeliveryModes = ResolveDeliveryModes(row.DeliveryModes); parsedRow.ResolvedDeliveryMethod = ResolveDeliveryMethod(row.DeliveryMethod, parsedRow.ResolvedDeliveryModes); parsedRow.ResolvedNationalDelivery = ResolveNationalDelivery(row.NationalDelivery, parsedRow.SubRegion, parsedRow.ResolvedDeliveryMethod); parsedRow.ResolvedRadius = ResolveRadius(row.Radius); parsedRow.ResolvedSubRegions = ResolveSubRegions(parsedRow.SubRegion, allRegions); return(parsedRow); }
public async Task ProcessApprenticeshipFile(Guid apprenticeshipUploadId, Stream stream) { using (var dispatcher = _sqlQueryDispatcherFactory.CreateDispatcher(System.Data.IsolationLevel.ReadCommitted)) { var setProcessingResult = await dispatcher.ExecuteQuery(new SetApprenticeshipUploadProcessing() { ApprenticeshipUploadId = apprenticeshipUploadId, ProcessingStartedOn = _clock.UtcNow }); if (setProcessingResult != SetApprenticeshipUploadProcessingResult.Success) { await DeleteBlob(); return; } await dispatcher.Commit(); } List <CsvApprenticeshipRow> rows; using (var streamReader = new StreamReader(stream)) using (var csvReader = CreateCsvReader(streamReader)) { rows = await csvReader.GetRecordsAsync <CsvApprenticeshipRow>().ToListAsync(); } var rowsCollection = CreateApprenticeshipDataUploadRowInfoCollection(); using (var dispatcher = _sqlQueryDispatcherFactory.CreateDispatcher(System.Data.IsolationLevel.ReadCommitted)) { var venueUpload = await dispatcher.ExecuteQuery(new GetApprenticeshipUpload() { ApprenticeshipUploadId = apprenticeshipUploadId }); var providerId = venueUpload.ProviderId; await AcquireExclusiveApprenticeshipUploadLockForProvider(providerId, dispatcher); await ValidateApprenticeshipUploadRows(dispatcher, apprenticeshipUploadId, providerId, rowsCollection); await dispatcher.Commit(); } await DeleteBlob(); Task DeleteBlob() { var blobName = $"{Constants.ApprenticeshipsFolder}/{apprenticeshipUploadId}.csv"; return(_blobContainerClient.DeleteBlobIfExistsAsync(blobName)); } ApprenticeshipDataUploadRowInfoCollection CreateApprenticeshipDataUploadRowInfoCollection() { // N.B. It's important we maintain ordering here; RowNumber needs to match the input var grouped = CsvApprenticeshipRow.GroupRows(rows); var groupApprenticeshipIds = grouped.Select(g => (ApprenticeshipId: Guid.NewGuid(), Rows: g)).ToArray(); var rowInfos = new List <ApprenticeshipDataUploadRowInfo>(rows.Count); foreach (var row in rows) { var apprenticeshipId = groupApprenticeshipIds.Single(g => g.Rows.Contains(row)).ApprenticeshipId; row.ContactPhone = NormalizePhoneNumber(row.ContactPhone); rowInfos.Add(new ApprenticeshipDataUploadRowInfo(row, rowNumber: rowInfos.Count + 2, apprenticeshipId)); } return(new ApprenticeshipDataUploadRowInfoCollection(rowInfos)); } }