public async Task <IActionResult> RunWithRegionAsync(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = "TemporaryExposureKeys/{region}")] HttpRequest req,
            string region)
        {
            // Check Valid Route
            IValidationServerService.ValidateResult validateResult = ValidationServerService.Validate(req);
            if (!validateResult.IsValid)
            {
                return(validateResult.ErrorActionResult);
            }

            if (!long.TryParse(req.Query?["since"], out var sinceEpochSeconds))
            {
                sinceEpochSeconds = new DateTimeOffset(DateTime.UtcNow.AddDays(-14)).ToUnixTimeSeconds();
            }

            var keysResponse = await TekExport.GetKeysAsync((ulong)sinceEpochSeconds, region);

            var result = new TemporaryExposureKeysResult();

            // TODO: Url util
            result.Keys = keysResponse
                          .Select(_ => new TemporaryExposureKeysResult.Key()
            {
                Url = $"{ExportKeyUrl}/{TekExportBlobStorageContainerPrefix}/{_.Region}/{_.BatchNum}.zip"
            });
            result.Timestamp = keysResponse
                               .OrderByDescending(_ => _.TimestampSecondsSinceEpoch)
                               .FirstOrDefault()?.TimestampSecondsSinceEpoch ?? sinceEpochSeconds;
            return(new OkObjectResult(result));
        }
        public void PropertiesTest()
        {
            // preparation
            var model = new TemporaryExposureKeysResult();

            // model property access
            Helper.ModelTestHelper.PropetiesTest(model);
        }
        public void CreateMethod()
        {
            // action
            var model = new TemporaryExposureKeysResult();

            // assert
            Assert.IsNotNull(model);
        }
Beispiel #4
0
        public async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = "TemporaryExposureKeys")] HttpRequest req)
        {
            if (!long.TryParse(req.Query?["since"], out var sinceEpochSeconds))
            {
                sinceEpochSeconds = new DateTimeOffset(DateTime.UtcNow.AddDays(-14)).ToUnixTimeSeconds();
            }

            var keysResponse = await TekExport.GetKeysAsync((ulong)sinceEpochSeconds);

            var result = new TemporaryExposureKeysResult();

            // TODO: Url util
            result.Keys = keysResponse.Select(_ => new TemporaryExposureKeysResult.Key()
            {
                Url = $"{ExportKeyUrl}/{TekExportBlobStorageContainerPrefix}/{_.BatchNum}.tekexport"
            });
            result.Timestamp = keysResponse.Max(_ => _.TimestampSecondsSinceEpoch);
            return(new OkObjectResult(result));
        }
        // 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);
            }
        }
Beispiel #6
0
 public void CreateMethod()
 {
     // action
     var model = new TemporaryExposureKeysResult();
 }