src/ApiForFhirMigrationTool.Function/SearchParameterMigrationActivity.cs (90 lines of code) (raw):

// ------------------------------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License (MIT). See LICENSE in the repo root for license information. // ------------------------------------------------------------------------------------------------- using ApiForFhirMigrationTool.Function.SearchParameterOperation; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; using Microsoft.DurableTask; using ApiForFhirMigrationTool.Function.Models; using Azure.Data.Tables; using Azure; using ApiForFhirMigrationTool.Function.Configuration; namespace ApiForFhirMigrationTool.Function.Migration { public class SearchParameterMigrationActivity { private readonly ISearchParameterOperation _searchParameterOperation; private readonly ILogger _logger; private readonly MigrationOptions _options; private readonly IAzureTableClientFactory _azureTableClientFactory; private readonly IMetadataStore _azureTableMetadataStore; public SearchParameterMigrationActivity(ISearchParameterOperation searchParameterOperation, IAzureTableClientFactory azureTableClientFactory, IMetadataStore azureTableMetadataStore, MigrationOptions options, ILogger<SearchParameterMigrationActivity> logger) { _searchParameterOperation = searchParameterOperation; _logger = logger; _options = options; _azureTableClientFactory = azureTableClientFactory; _azureTableMetadataStore = azureTableMetadataStore; } [Function(nameof(SearchParameterOrchestration))] public async Task<string> SearchParameterOrchestration( [OrchestrationTrigger] TaskOrchestrationContext context) { ILogger logger = context.CreateReplaySafeLogger(nameof(SearchParameterOrchestration)); logger.LogInformation("Starting Search Parameter activities."); var statusRespose = new HttpResponseMessage(); var statusUrl = string.Empty; var import_body = string.Empty; try { logger.LogInformation("Creating table client"); TableClient chunktableClient = _azureTableClientFactory.Create(_options.ChunkTableName); TableClient exportTableClient = _azureTableClientFactory.Create(_options.ExportTableName); logger.LogInformation("Table client created successfully."); logger?.LogInformation("Querying the chunk table to check if SearchParameter migration is completed."); Pageable<TableEntity> jobListSeacrh = chunktableClient.Query<TableEntity>(filter: ent => ent.GetBoolean("SearchParameterMigration") == false); logger?.LogInformation("SearchParameter migration status retrieved from the chunk table."); if (jobListSeacrh.Count() > 0) { // Run Activity for Search Parameter logger?.LogInformation("Calling SearchParameterMigration function"); await context.CallActivityAsync("SearchParameterMigration"); logger?.LogInformation("SearchParameterMigration function has completed."); TableEntity qEntitynew = _azureTableMetadataStore.GetEntity(chunktableClient, _options.PartitionKey, _options.RowKey); qEntitynew["SearchParameterMigration"] = true; logger?.LogInformation("Starting update of the chunk table."); _azureTableMetadataStore.UpdateEntity(chunktableClient, qEntitynew); logger?.LogInformation("Completed update of the chunk table."); } else { logger?.LogInformation("Search parameter migration is a one-time activity and has already been completed."); } } catch { throw; } logger?.LogInformation("Finished Search Parameter activities."); return "Completed"; } [Function(nameof(SearchParameterMigration))] public async Task SearchParameterMigration([ActivityTrigger] FunctionContext executionContext) { _logger.LogInformation($"SearchParameterMigration Started"); try { // Get search parameters from Gen1 JObject jObjectResponse = await _searchParameterOperation.GetSearchParameters(); // If resource present in bundle then transform it into batch and Post to Gen2 if (jObjectResponse.ContainsKey("entry")) { // Transform to batch and add request object string transformedObject = _searchParameterOperation.TransformObject(jObjectResponse); // Post serach parametes to Gen2 await _searchParameterOperation.PostSearchParameters(transformedObject); } } catch (Exception ex) { _logger.LogError($"SearchParameterMigration() Exception: {ex.Message}"); throw; } _logger.LogInformation($"SearchParameterMigration Finished"); } } }