示例#1
0
        private async Task <(int, List <string>)> DownloadBatchAsync(string region, CancellationToken cancellationToken)
        {
            loggerService.StartMethod();

            var downloadedFiles = new List <string>();
            var batchNumber     = 0;
            var tmpDir          = Path.Combine(FileSystem.CacheDirectory, region);

            try
            {
                if (!Directory.Exists(tmpDir))
                {
                    Directory.CreateDirectory(tmpDir);
                }
            }
            catch (Exception ex)
            {
                loggerService.Exception("Failed to create directory", ex);
                loggerService.EndMethod();
                // 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)
            {
                loggerService.EndMethod();
                return(batchNumber, downloadedFiles);
            }
            Debug.WriteLine("C19R 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);
                }

                loggerService.Info($"tekItem.Created: {tekItem.Created}");
                if (tekItem.Created > lastCreated || lastCreated == 0)
                {
                    var tmpFile = Path.Combine(tmpDir, Guid.NewGuid().ToString() + ".zip");
                    Debug.WriteLine(Utils.SerializeToJson(tekItem));
                    Debug.WriteLine(tmpFile);

                    loggerService.Info($"Download TEK file. url: {tekItem.Url}");
                    using (Stream responseStream = await httpDataService.GetTemporaryExposureKey(tekItem.Url, cancellationToken))
                        using (var fileStream = File.Create(tmpFile))
                        {
                            try
                            {
                                await responseStream.CopyToAsync(fileStream, cancellationToken);

                                fileStream.Flush();
                            }
                            catch (Exception ex)
                            {
                                loggerService.Exception("Fail to copy", ex);
                            }
                        }
                    lastTekTimestamp[region] = tekItem.Created;
                    downloadedFiles.Add(tmpFile);
                    Debug.WriteLine($"C19R FETCH DIAGKEY {tmpFile}");
                    batchNumber++;
                }
            }
            loggerService.Info($"Batch number: {batchNumber}, Downloaded files: {downloadedFiles.Count()}");
            userData.LastProcessTekTimestamp = lastTekTimestamp;
            await userDataService.SetAsync(userData);

            loggerService.Info($"region: {region}, userData.LastProcessTekTimestamp[{region}]: {userData.LastProcessTekTimestamp[region]}");

            loggerService.EndMethod();

            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);

                    using (Stream responseStream = await httpDataService.GetTemporaryExposureKey(tekItem.Url, cancellationToken))
                        using (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);
        }