// 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);
            }
        }
Пример #2
0
        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);
        }