public async Task ExecuteAsync(CancellationToken cancellationToken = default) { try { await Migrate(cancellationToken); var settings = (await _Settings.GetSettingAsync <MigrationSettings>()); if (settings is null) { // If it is null, then it's the first run: let's skip all the migrations by migration flags to true settings = new MigrationSettings() { MigratedInvoiceTextSearchPages = int.MaxValue }; foreach (var prop in settings.GetType().GetProperties().Where(p => p.CanWrite && p.PropertyType == typeof(bool))) { prop.SetValue(settings, true); } settings.CheckedFirstRun = false; await _Settings.UpdateSetting(settings); } if (!settings.PaymentMethodCriteria) { await MigratePaymentMethodCriteria(); settings.PaymentMethodCriteria = true; await _Settings.UpdateSetting(settings); } if (!settings.DeprecatedLightningConnectionStringCheck) { await DeprecatedLightningConnectionStringCheck(); settings.DeprecatedLightningConnectionStringCheck = true; await _Settings.UpdateSetting(settings); } if (!settings.UnreachableStoreCheck) { await UnreachableStoreCheck(); settings.UnreachableStoreCheck = true; await _Settings.UpdateSetting(settings); } if (!settings.ConvertMultiplierToSpread) { await ConvertMultiplierToSpread(); settings.ConvertMultiplierToSpread = true; await _Settings.UpdateSetting(settings); } if (!settings.ConvertNetworkFeeProperty) { await ConvertNetworkFeeProperty(); settings.ConvertNetworkFeeProperty = true; await _Settings.UpdateSetting(settings); } if (!settings.ConvertCrowdfundOldSettings) { await ConvertCrowdfundOldSettings(); settings.ConvertCrowdfundOldSettings = true; await _Settings.UpdateSetting(settings); } if (!settings.ConvertWalletKeyPathRoots) { await ConvertConvertWalletKeyPathRoots(); settings.ConvertWalletKeyPathRoots = true; await _Settings.UpdateSetting(settings); } if (!settings.CheckedFirstRun) { var themeSettings = await _Settings.GetSettingAsync <ThemeSettings>() ?? new ThemeSettings(); var admin = await _userManager.GetUsersInRoleAsync(Roles.ServerAdmin); themeSettings.FirstRun = admin.Count == 0; await _Settings.UpdateSetting(themeSettings); settings.CheckedFirstRun = true; await _Settings.UpdateSetting(settings); } if (!settings.TransitionToStoreBlobAdditionalData) { await TransitionToStoreBlobAdditionalData(); settings.TransitionToStoreBlobAdditionalData = true; await _Settings.UpdateSetting(settings); } if (!settings.TransitionInternalNodeConnectionString) { await TransitionInternalNodeConnectionString(); settings.TransitionInternalNodeConnectionString = true; await _Settings.UpdateSetting(settings); } if (!settings.MigrateU2FToFIDO2) { await MigrateU2FToFIDO2(); settings.MigrateU2FToFIDO2 = true; await _Settings.UpdateSetting(settings); } if (!settings.MigrateHotwalletProperty) { await MigrateHotwalletProperty(); settings.MigrateHotwalletProperty = true; await _Settings.UpdateSetting(settings); } if (!settings.MigrateAppCustomOption) { await MigrateAppCustomOption(); settings.MigrateAppCustomOption = true; await _Settings.UpdateSetting(settings); } if (!settings.MigratePayoutDestinationId) { await MigratePayoutDestinationId(); settings.MigratePayoutDestinationId = true; await _Settings.UpdateSetting(settings); } if (!settings.AddInitialUserBlob) { await AddInitialUserBlob(); settings.AddInitialUserBlob = true; await _Settings.UpdateSetting(settings); } if (!settings.LighingAddressSettingRename) { await MigrateLighingAddressSettingRename(); settings.LighingAddressSettingRename = true; await _Settings.UpdateSetting(settings); } if (!settings.LighingAddressDatabaseMigration) { await MigrateLighingAddressDatabaseMigration(); settings.LighingAddressDatabaseMigration = true; } if (!settings.AddStoreToPayout) { await MigrateAddStoreToPayout(); settings.AddStoreToPayout = true; await _Settings.UpdateSetting(settings); } if (!settings.MigrateEmailServerDisableTLSCerts) { await MigrateEmailServerDisableTLSCerts(); settings.MigrateEmailServerDisableTLSCerts = true; await _Settings.UpdateSetting(settings); } } catch (Exception ex) { _logger.LogError(ex, "Error on the MigrationStartupTask"); throw; } }