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); }
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); } }
public void CreateMethod() { // action var model = new TemporaryExposureKeysResult(); }