// this will be called when they keys need to be collected from the server public async Task FetchExposureKeyBatchFilesFromServerAsync(Func <IEnumerable <string>, Task> submitBatches, CancellationToken cancellationToken) { // This is "default" by default var rightNow = DateTimeOffset.UtcNow; try { foreach (var serverRegion in AppSettings.Instance.SupportedRegions) { // Find next directory to start checking var dirNumber = userData.ServerBatchNumbers[serverRegion] + 1; // For all the directories while (true) { cancellationToken.ThrowIfCancellationRequested(); // Download all the files for this directory var(batchNumber, downloadedFiles) = await DownloadBatchAsync(serverRegion, dirNumber, cancellationToken); if (batchNumber == 0) { break; } // Process the current directory, if there were any files if (downloadedFiles.Count > 0) { await submitBatches(downloadedFiles); // delete all temporary files foreach (var file in downloadedFiles) { try { File.Delete(file); } catch { // no-op } } } // Update the preferences userData.ServerBatchNumbers[serverRegion] = dirNumber; await userDataService.SetAsync(userData); dirNumber++; } } } catch (Exception ex) { // any expections, bail out and wait for the next time // TODO: log the error on some server! Console.WriteLine(ex); } async Task <(int, List <string>)> DownloadBatchAsync(string region, ulong dirNumber, CancellationToken cancellationToken) { var downloadedFiles = new List <string>(); var batchNumber = 0; long sinceEpochSeconds = new DateTimeOffset(DateTime.UtcNow.AddDays(-14)).ToUnixTimeSeconds(); TemporaryExposureKeysResult tekResult = await httpDataService.GetTemporaryExposureKeys(sinceEpochSeconds, cancellationToken); Console.WriteLine("Fetch Exposure Key"); foreach (var key in tekResult.Keys) { // TODO 取得TimeStamp差分実装を行う cancellationToken.ThrowIfCancellationRequested(); var tmpFile = Path.Combine(FileSystem.CacheDirectory, Guid.NewGuid().ToString() + ".zip"); // Read the batch file stream into a temporary file Console.WriteLine(key.Url); Console.WriteLine(tmpFile); Stream responseStream = await httpDataService.GetTemporaryExposureKey(key.Url, cancellationToken); var fileStream = File.Create(tmpFile); await responseStream.CopyToAsync(fileStream, cancellationToken); downloadedFiles.Add(tmpFile); batchNumber++; } Console.WriteLine(batchNumber.ToString()); Console.WriteLine(downloadedFiles.Count()); return(batchNumber, downloadedFiles); } }
private async Task <(int, List <string>)> DownloadBatchAsync(string region, CancellationToken cancellationToken) { var downloadedFiles = new List <string>(); var batchNumber = 0; var tmpDir = Path.Combine(FileSystem.CacheDirectory, region); try { if (!Directory.Exists(tmpDir)) { Directory.CreateDirectory(tmpDir); } } catch { // catch error return batchnumber 0 / fileList 0 return(batchNumber, downloadedFiles); } long sinceEpochSeconds = new DateTimeOffset(DateTime.UtcNow.AddDays(-14)).ToUnixTimeSeconds(); List <TemporaryExposureKeyExportFileModel> tekList = await httpDataService.GetTemporaryExposureKeyList(region, cancellationToken); if (tekList.Count == 0) { return(batchNumber, downloadedFiles); } Console.WriteLine("Fetch Exposure Key"); Dictionary <string, long> lastTekTimestamp = userData.LastProcessTekTimestamp; foreach (var tekItem in tekList) { long lastCreated = 0; if (lastTekTimestamp.ContainsKey(region)) { lastCreated = lastTekTimestamp[region]; } else { lastTekTimestamp.Add(region, 0); } if (tekItem.Created > lastCreated || lastCreated == 0) { var tmpFile = Path.Combine(tmpDir, Guid.NewGuid().ToString() + ".zip"); Console.WriteLine(Utils.SerializeToJson(tekItem)); Console.WriteLine(tmpFile); Stream responseStream = await httpDataService.GetTemporaryExposureKey(tekItem.Url, cancellationToken); var fileStream = File.Create(tmpFile); try { await responseStream.CopyToAsync(fileStream, cancellationToken); fileStream.Flush(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } lastTekTimestamp[region] = tekItem.Created; downloadedFiles.Add(tmpFile); batchNumber++; } } Console.WriteLine(batchNumber.ToString()); Console.WriteLine(downloadedFiles.Count()); userData.LastProcessTekTimestamp = lastTekTimestamp; await userDataService.SetAsync(userData); return(batchNumber, downloadedFiles); }