diff --git a/Application/EdFi.Ods.AdminApi.AdminConsole/Features/Instances/CompleteInstance.cs b/Application/EdFi.Ods.AdminApi.AdminConsole/Features/Instances/CompleteInstance.cs index 9ce7cb837..25a34f277 100644 --- a/Application/EdFi.Ods.AdminApi.AdminConsole/Features/Instances/CompleteInstance.cs +++ b/Application/EdFi.Ods.AdminApi.AdminConsole/Features/Instances/CompleteInstance.cs @@ -47,9 +47,9 @@ public class CompleteInstanceRequest public class Validator : AbstractValidator { private readonly string _databaseEngine; - public Validator(IOptions options) + public Validator(IOptionsMonitor options) { - _databaseEngine = options.Value.DatabaseEngine ?? throw new NotFoundException("AppSettings", "DatabaseEngine"); + _databaseEngine = options.CurrentValue.DatabaseEngine ?? throw new NotFoundException("AppSettings", "DatabaseEngine"); RuleFor(x => x.ConnectionString) .NotEmpty() diff --git a/Application/EdFi.Ods.AdminApi.AdminConsole/Infrastructure/Services/Instances/Commands/CompleteInstanceCommand.cs b/Application/EdFi.Ods.AdminApi.AdminConsole/Infrastructure/Services/Instances/Commands/CompleteInstanceCommand.cs index 6afb244b3..2791045ef 100644 --- a/Application/EdFi.Ods.AdminApi.AdminConsole/Infrastructure/Services/Instances/Commands/CompleteInstanceCommand.cs +++ b/Application/EdFi.Ods.AdminApi.AdminConsole/Infrastructure/Services/Instances/Commands/CompleteInstanceCommand.cs @@ -25,16 +25,16 @@ public interface ICompleteInstanceCommand } public class CompleteInstanceCommand( - IOptions options, - IOptions adminConsoleOptions, + IOptionsMonitor options, + IOptionsMonitor adminConsoleOptions, IOptionsMonitor testingSettings, IUsersContext context, IQueriesRepository instanceQuery, ICommandRepository instanceCommand, IAdminConsoleTenantsService adminConsoleTenantsService) : ICompleteInstanceCommand { - private readonly AppSettings _options = options.Value; - private readonly AdminConsoleSettings _adminConsoleOptions = adminConsoleOptions.Value; + private readonly AppSettings _options = options.CurrentValue; + private readonly AdminConsoleSettings _adminConsoleOptions = adminConsoleOptions.CurrentValue; private readonly TestingSettings _testingSettings = testingSettings.CurrentValue; private readonly IUsersContext _context = context; private readonly IQueriesRepository _instanceQuery = instanceQuery; @@ -54,7 +54,7 @@ public async Task Execute(int id, string connectionString) if (adminConsoleInstance.Status == InstanceStatus.Completed) return adminConsoleInstance; - var newOdsInstance = InstanceCommon.NewOdsInstance(adminConsoleInstance); + var newOdsInstance = InstanceCommon.NewOdsInstance(adminConsoleInstance); newOdsInstance.ConnectionString = connectionString; var apiClientOdsInstance = new ApiClientOdsInstance() @@ -62,7 +62,7 @@ public async Task Execute(int id, string connectionString) ApiClient = newApiClient, OdsInstance = newOdsInstance }; - + _context.ApiClients.Add(newApiClient); _context.OdsInstances.Add(newOdsInstance); _context.ApiClientOdsInstances.Add(apiClientOdsInstance); @@ -82,7 +82,7 @@ public async Task Execute(int id, string connectionString) await _instanceCommand.UpdateAsync(adminConsoleInstance); await _instanceCommand.SaveChangesAsync(); - _testingSettings.CheckIfHasToThrowException(); + _testingSettings.CheckIfHasToThrowException(); scope.Complete(); @@ -101,8 +101,8 @@ private async Task UpdateOAuthAndResourceUrlForInstanceAsync(Instance instance) } string finalUri = discoveryUrl; - if (_options.MultiTenancy && (documentDictionary.TryGetValue("name", out var tenantName) && tenantName is string name) - && !name.Equals("default") + if (_options.MultiTenancy && (documentDictionary.TryGetValue("name", out var tenantName) && tenantName is string name) + && !name.Equals("default") && !discoveryUrl.Contains(name)) { var baseUri = new Uri(discoveryUrl); diff --git a/Application/EdFi.Ods.AdminApi.AdminConsole/Infrastructure/Services/Instances/Commands/RenameInstanceCommand.cs b/Application/EdFi.Ods.AdminApi.AdminConsole/Infrastructure/Services/Instances/Commands/RenameInstanceCommand.cs index 30ee6c57b..1da3e5013 100644 --- a/Application/EdFi.Ods.AdminApi.AdminConsole/Infrastructure/Services/Instances/Commands/RenameInstanceCommand.cs +++ b/Application/EdFi.Ods.AdminApi.AdminConsole/Infrastructure/Services/Instances/Commands/RenameInstanceCommand.cs @@ -23,12 +23,12 @@ public interface IRenameInstanceCommand } public class RenameInstanceCommand( - IOptions adminConsoleOptions, + IOptionsMonitor adminConsoleOptions, IUsersContext context, IQueriesRepository instanceQuery, ICommandRepository instanceCommand) : IRenameInstanceCommand { - private readonly AdminConsoleSettings _adminConsoleOptions = adminConsoleOptions.Value; + private readonly AdminConsoleSettings _adminConsoleOptions = adminConsoleOptions.CurrentValue; private readonly IUsersContext _context = context; private readonly IQueriesRepository _instanceQuery = instanceQuery; private readonly ICommandRepository _instanceCommand = instanceCommand; diff --git a/Application/EdFi.Ods.AdminApi.Common/Infrastructure/MultiTenancy/TenantIdentificationMiddleware.cs b/Application/EdFi.Ods.AdminApi.Common/Infrastructure/MultiTenancy/TenantIdentificationMiddleware.cs index 3d93f1458..d4aa4630f 100644 --- a/Application/EdFi.Ods.AdminApi.Common/Infrastructure/MultiTenancy/TenantIdentificationMiddleware.cs +++ b/Application/EdFi.Ods.AdminApi.Common/Infrastructure/MultiTenancy/TenantIdentificationMiddleware.cs @@ -16,17 +16,17 @@ namespace EdFi.Ods.AdminApi.Common.Infrastructure.MultiTenancy; public partial class TenantResolverMiddleware( ITenantConfigurationProvider tenantConfigurationProvider, IContextProvider tenantConfigurationContextProvider, - IOptions options, - IOptions swaggerOptions) : IMiddleware + IOptionsMonitor options, + IOptionsMonitor swaggerOptions) : IMiddleware { private readonly ITenantConfigurationProvider _tenantConfigurationProvider = tenantConfigurationProvider; private readonly IContextProvider _tenantConfigurationContextProvider = tenantConfigurationContextProvider; - private readonly IOptions _options = options; - private readonly IOptions _swaggerOptions = swaggerOptions; + private readonly IOptionsMonitor _options = options; + private readonly IOptionsMonitor _swaggerOptions = swaggerOptions; public async Task InvokeAsync(HttpContext context, RequestDelegate next) { - var multiTenancyEnabled = _options.Value.MultiTenancy; + var multiTenancyEnabled = _options.CurrentValue.MultiTenancy; var validationErrorMessage = "Please provide valid tenant id. Tenant id can only contain alphanumeric and -"; if (multiTenancyEnabled) @@ -50,9 +50,9 @@ public async Task InvokeAsync(HttpContext context, RequestDelegate next) ThrowTenantValidationError(validationErrorMessage); } } - else if (_swaggerOptions.Value.EnableSwagger && RequestFromSwagger()) + else if (_swaggerOptions.CurrentValue.EnableSwagger && RequestFromSwagger()) { - var defaultTenant = _swaggerOptions.Value.DefaultTenant; + var defaultTenant = _swaggerOptions.CurrentValue.DefaultTenant; if (!string.IsNullOrEmpty(defaultTenant) && IsValidTenantId(defaultTenant)) { if (!string.IsNullOrEmpty(defaultTenant) && @@ -72,7 +72,7 @@ public async Task InvokeAsync(HttpContext context, RequestDelegate next) } else { - if (_options.Value.EnableAdminConsoleAPI) + if (_options.CurrentValue.EnableAdminConsoleAPI) { if (!context.Request.Path.Value!.Contains("adminconsole/tenants") && context.Request.Method != "GET" && diff --git a/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/AddApiClientCommandTests.cs b/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/AddApiClientCommandTests.cs index e4db60d34..6874097bf 100644 --- a/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/AddApiClientCommandTests.cs +++ b/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/AddApiClientCommandTests.cs @@ -19,7 +19,7 @@ namespace EdFi.Ods.AdminApi.DBTests.Database.CommandTests; [TestFixture] internal class AddApiClientCommandTests : PlatformUsersContextTestBase { - private IOptions _options { get; set; } + private IOptionsMonitor _options { get; set; } private int applicationId { get; set; } [SetUp] @@ -27,7 +27,7 @@ public virtual async Task SetUp() { AppSettings appSettings = new AppSettings(); appSettings.PreventDuplicateApplications = false; - _options = Options.Create(appSettings); + _options = new TestOptionsMonitor(appSettings); await Task.Yield(); var vendor = new Vendor diff --git a/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/AddApplicationCommandTests.cs b/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/AddApplicationCommandTests.cs index 8eb214cda..86e5810a4 100644 --- a/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/AddApplicationCommandTests.cs +++ b/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/AddApplicationCommandTests.cs @@ -21,14 +21,14 @@ namespace EdFi.Ods.AdminApi.DBTests.Database.CommandTests; [TestFixture] public class AddApplicationCommandTests : PlatformUsersContextTestBase { - private IOptions _options { get; set; } + private IOptionsMonitor _options { get; set; } [OneTimeSetUp] public virtual async Task FixtureSetup() { AppSettings appSettings = new AppSettings(); appSettings.PreventDuplicateApplications = false; - _options = Options.Create(appSettings); + _options = new TestOptionsMonitor(appSettings); await Task.Yield(); } @@ -209,7 +209,7 @@ public void ShouldFailToAddDuplicatedApplication() { AppSettings appSettings = new AppSettings(); appSettings.PreventDuplicateApplications = true; - IOptions options = Options.Create(appSettings); + IOptionsMonitor options = new TestOptionsMonitor(appSettings); const string OdsInstanceName = "Test Instance"; var vendor = new Vendor { @@ -269,7 +269,7 @@ public void ShouldFailToAddDuplicatedApplicationNullFields() { AppSettings appSettings = new AppSettings(); appSettings.PreventDuplicateApplications = true; - IOptions options = Options.Create(appSettings); + IOptionsMonitor options = new TestOptionsMonitor(appSettings); var vendor = new Vendor { VendorNamespacePrefixes = new List { new VendorNamespacePrefix { NamespacePrefix = "http://tests.com" } }, @@ -312,7 +312,7 @@ public void ShouldExecuteWithDuplicatedNamesDifferentVendor() { AppSettings appSettings = new AppSettings(); appSettings.PreventDuplicateApplications = true; - IOptions options = Options.Create(appSettings); + IOptionsMonitor options = new TestOptionsMonitor(appSettings); var vendor = new Vendor { VendorNamespacePrefixes = new List { new VendorNamespacePrefix { NamespacePrefix = "http://tests.com" } }, diff --git a/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/EditApiClientCommandTests.cs b/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/EditApiClientCommandTests.cs index a23c415b1..3e7f95592 100644 --- a/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/EditApiClientCommandTests.cs +++ b/Application/EdFi.Ods.AdminApi.DBTests/Database/CommandTests/EditApiClientCommandTests.cs @@ -11,11 +11,9 @@ using EdFi.Ods.AdminApi.Common.Infrastructure; using EdFi.Ods.AdminApi.Common.Settings; using EdFi.Ods.AdminApi.Infrastructure.Database.Commands; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using NUnit.Framework; using Shouldly; -using Profile = EdFi.Admin.DataAccess.Models.Profile; using VendorUser = EdFi.Admin.DataAccess.Models.User; namespace EdFi.Ods.AdminApi.DBTests.Database.CommandTests; @@ -30,14 +28,14 @@ internal class EditApiClientCommandTests : PlatformUsersContextTestBase private OdsInstance _odsInstance; private ApiClientOdsInstance _apiClientOdsInstance; - private IOptions _options { get; set; } + private IOptionsMonitor _options { get; set; } [SetUp] public virtual async Task SetUp() { AppSettings appSettings = new AppSettings(); appSettings.PreventDuplicateApplications = false; - _options = Options.Create(appSettings); + _options = new TestOptionsMonitor(appSettings); await Task.Yield(); } diff --git a/Application/EdFi.Ods.AdminApi.DBTests/Database/QueryTests/GetAllApplicationsQuery.cs b/Application/EdFi.Ods.AdminApi.DBTests/Database/QueryTests/GetAllApplicationsQuery.cs index 1fe2be072..34944b739 100644 --- a/Application/EdFi.Ods.AdminApi.DBTests/Database/QueryTests/GetAllApplicationsQuery.cs +++ b/Application/EdFi.Ods.AdminApi.DBTests/Database/QueryTests/GetAllApplicationsQuery.cs @@ -1,8 +1,8 @@ -// SPDX-License-Identifier: Apache-2.0 -// Licensed to the Ed-Fi Alliance under one or more agreements. -// The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. -// See the LICENSE and NOTICES files in the project root for more information. - +// SPDX-License-Identifier: Apache-2.0 +// Licensed to the Ed-Fi Alliance under one or more agreements. +// The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +// See the LICENSE and NOTICES files in the project root for more information. + using System; using System.Collections.Generic; using System.Linq; @@ -10,57 +10,57 @@ using EdFi.Admin.DataAccess.Models; using EdFi.Ods.AdminApi.Common.Infrastructure; using EdFi.Ods.AdminApi.Common.Settings; -using EdFi.Ods.AdminApi.Infrastructure.Database.Queries; +using EdFi.Ods.AdminApi.Infrastructure.Database.Queries; using Microsoft.Extensions.Options; -using NUnit.Framework; +using NUnit.Framework; using Shouldly; -using VendorUser = EdFi.Admin.DataAccess.Models.User; - +using VendorUser = EdFi.Admin.DataAccess.Models.User; + + +namespace EdFi.Ods.AdminApi.DBTests.Database.QueryTests; -namespace EdFi.Ods.AdminApi.DBTests.Database.QueryTests; - -[TestFixture] -public class GetAllApplicationsQueryTests : PlatformUsersContextTestBase +[TestFixture] +public class GetAllApplicationsQueryTests : PlatformUsersContextTestBase { - private IOptions _options { get; set; } - - [SetUp] - public virtual async Task FixtureSetup() - { + private IOptionsMonitor _options { get; set; } + + [SetUp] + public virtual async Task FixtureSetup() + { _options = Testing.GetAppSettings(); - _options.Value.PreventDuplicateApplications = false; - LoadApplications(3); - await Task.Yield(); + _options.CurrentValue.PreventDuplicateApplications = false; + LoadApplications(3); + await Task.Yield(); } - - [Test] - public void ShouldGetAllApplications() + + [Test] + public void ShouldGetAllApplications() { var result = new List(); - Transaction(usersContext => - { + Transaction(usersContext => + { var query = new GetAllApplicationsQuery(usersContext, _options); result = query.Execute( - new CommonQueryParams(), null, null, null, null).ToList(); + new CommonQueryParams(), null, null, null, null).ToList(); }); result.Count.ShouldBeGreaterThan(0); } - [Test] - public void ShouldGetAllApplications_With_Offset_and_Limit() + [Test] + public void ShouldGetAllApplications_With_Offset_and_Limit() { var offset = 1; var limit = 2; - Transaction(usersContext => - { + Transaction(usersContext => + { var query = new GetAllApplicationsQuery(usersContext, _options); var result = query.Execute( - new CommonQueryParams(offset, limit), null, null, null, null); - - result.Count.ShouldBeGreaterThan(0); - result.Count.ShouldBe(2); + new CommonQueryParams(offset, limit), null, null, null, null); + + result.Count.ShouldBeGreaterThan(0); + result.Count.ShouldBe(2); }); } @@ -110,5 +110,5 @@ private void LoadApplications(int count = 1) Save(odsInstance, vendor, application, apiClient, apiClientOdsIntance); } - } -} + } +} diff --git a/Application/EdFi.Ods.AdminApi.DBTests/Database/QueryTests/GetApiClientByIdQueryTests.cs b/Application/EdFi.Ods.AdminApi.DBTests/Database/QueryTests/GetApiClientByIdQueryTests.cs index 9b12c8730..5ac7cb0cc 100644 --- a/Application/EdFi.Ods.AdminApi.DBTests/Database/QueryTests/GetApiClientByIdQueryTests.cs +++ b/Application/EdFi.Ods.AdminApi.DBTests/Database/QueryTests/GetApiClientByIdQueryTests.cs @@ -22,14 +22,14 @@ namespace EdFi.Ods.AdminApi.DBTests.Database.QueryTests; [TestFixture] internal class GetApiClientByIdQueryTests : PlatformUsersContextTestBase { - private IOptions _options { get; set; } + private IOptionsMonitor _options { get; set; } private int secondApiClientId = 0; [SetUp] public virtual async Task FixtureSetup() { _options = Testing.GetAppSettings(); - _options.Value.PreventDuplicateApplications = false; + _options.CurrentValue.PreventDuplicateApplications = false; LoadApiClients(); await Task.Yield(); } diff --git a/Application/EdFi.Ods.AdminApi.DBTests/Database/QueryTests/GetApiClientsByApplicationIdQueryTests.cs b/Application/EdFi.Ods.AdminApi.DBTests/Database/QueryTests/GetApiClientsByApplicationIdQueryTests.cs index 921e1615d..e7412e270 100644 --- a/Application/EdFi.Ods.AdminApi.DBTests/Database/QueryTests/GetApiClientsByApplicationIdQueryTests.cs +++ b/Application/EdFi.Ods.AdminApi.DBTests/Database/QueryTests/GetApiClientsByApplicationIdQueryTests.cs @@ -21,14 +21,14 @@ namespace EdFi.Ods.AdminApi.DBTests.Database.QueryTests; [TestFixture] public class GetApiClientsByApplicationIdQueryTests : PlatformUsersContextTestBase { - private IOptions _options { get; set; } + private IOptionsMonitor _options { get; set; } private int applicationId = 0; [SetUp] public virtual async Task FixtureSetup() { _options = Testing.GetAppSettings(); - _options.Value.PreventDuplicateApplications = false; + _options.CurrentValue.PreventDuplicateApplications = false; LoadApiClients(); await Task.Yield(); } diff --git a/Application/EdFi.Ods.AdminApi.DBTests/TestOptionsMonitor.cs b/Application/EdFi.Ods.AdminApi.DBTests/TestOptionsMonitor.cs new file mode 100644 index 000000000..4b812e0be --- /dev/null +++ b/Application/EdFi.Ods.AdminApi.DBTests/TestOptionsMonitor.cs @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: Apache-2.0 +// Licensed to the Ed-Fi Alliance under one or more agreements. +// The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +// See the LICENSE and NOTICES files in the project root for more information. + +using System; +using EdFi.Ods.AdminApi.Common.Settings; +using Microsoft.Extensions.Options; + +namespace EdFi.Ods.AdminApi.DBTests; + +internal class TestOptionsMonitor : IOptionsMonitor +{ + private readonly AppSettings _currentValue; + + public TestOptionsMonitor(AppSettings currentValue) + { + _currentValue = currentValue; + } + + public AppSettings CurrentValue => _currentValue; + + public AppSettings Get(string name) + => _currentValue; + + public IDisposable OnChange(Action listener) + => null; +} diff --git a/Application/EdFi.Ods.AdminApi.DBTests/Testing.cs b/Application/EdFi.Ods.AdminApi.DBTests/Testing.cs index 092efdc42..bb692c9ed 100644 --- a/Application/EdFi.Ods.AdminApi.DBTests/Testing.cs +++ b/Application/EdFi.Ods.AdminApi.DBTests/Testing.cs @@ -3,9 +3,9 @@ // The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. // See the LICENSE and NOTICES files in the project root for more information. -using EdFi.Ods.AdminApi.Common.Settings; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; +using EdFi.Ods.AdminApi.Common.Settings; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Options; namespace EdFi.Ods.AdminApi.DBTests; @@ -25,26 +25,25 @@ public static IConfiguration Configuration() public static string AdminConnectionString { get { return Configuration().GetConnectionString("EdFi_Admin"); } } - public static string SecurityConnectionString { get { return Configuration().GetConnectionString("EdFi_Security"); } } - - public static int DefaultPageSizeOffset => Configuration().GetSection("AppSettings").GetValue("DefaultPageSizeOffset"); - - public static int DefaultPageSizeLimit => Configuration().GetSection("AppSettings").GetValue("DefaultPageSizeLimit"); - - public static DbContextOptions GetDbContextOptions(string connectionString) - { - var builder = new DbContextOptionsBuilder(); - builder.UseSqlServer(connectionString); - return builder.Options; - } - - public static IOptions GetAppSettings() - { - AppSettings appSettings = new AppSettings(); + public static string SecurityConnectionString { get { return Configuration().GetConnectionString("EdFi_Security"); } } + + public static int DefaultPageSizeOffset => Configuration().GetSection("AppSettings").GetValue("DefaultPageSizeOffset"); + + public static int DefaultPageSizeLimit => Configuration().GetSection("AppSettings").GetValue("DefaultPageSizeLimit"); + + public static DbContextOptions GetDbContextOptions(string connectionString) + { + var builder = new DbContextOptionsBuilder(); + builder.UseSqlServer(connectionString); + return builder.Options; + } + + public static IOptionsMonitor GetAppSettings() + { + AppSettings appSettings = new AppSettings(); appSettings.DefaultPageSizeOffset = DefaultPageSizeOffset; appSettings.DefaultPageSizeLimit = DefaultPageSizeLimit; - IOptions options = Options.Create(appSettings); - return options; - } - + IOptionsMonitor options = new TestOptionsMonitor(appSettings); + return options; + } } diff --git a/Application/EdFi.Ods.AdminApi.UnitTests/Infrastructure/WebApplicationBuilderExtensionsTests.cs b/Application/EdFi.Ods.AdminApi.UnitTests/Infrastructure/WebApplicationBuilderExtensionsTests.cs index 4c78fbfd6..339d06e14 100644 --- a/Application/EdFi.Ods.AdminApi.UnitTests/Infrastructure/WebApplicationBuilderExtensionsTests.cs +++ b/Application/EdFi.Ods.AdminApi.UnitTests/Infrastructure/WebApplicationBuilderExtensionsTests.cs @@ -33,14 +33,14 @@ public void ConfigureRateLimiting_WhenDisabled_ShouldConfigureNoLimiter() // Assert var services = builder.Services.BuildServiceProvider(); - var options = services.GetRequiredService>().Value; + var options = services.GetRequiredService>().CurrentValue; options.ShouldNotBeNull(); // Build an app to test the global limiter var app = builder.Build(); var httpContext = new DefaultHttpContext(); - var globalLimiter = app.Services.GetRequiredService>().Value.GlobalLimiter; + var globalLimiter = app.Services.GetRequiredService>().CurrentValue.GlobalLimiter; globalLimiter.ShouldNotBeNull(); @@ -60,7 +60,7 @@ public void ConfigureRateLimiting_WhenEnabled_ShouldConfigureRejectionStatusCode // Assert var services = builder.Services.BuildServiceProvider(); - var options = services.GetRequiredService>().Value; + var options = services.GetRequiredService>().CurrentValue; options.ShouldNotBeNull(); options.RejectionStatusCode.ShouldBe(429); @@ -80,13 +80,13 @@ public void ConfigureRateLimiting_WithEndpointRules_ShouldConfigureEndpointSpeci // Assert var services = builder.Services.BuildServiceProvider(); - var options = services.GetRequiredService>().Value; + var options = services.GetRequiredService>().CurrentValue; options.ShouldNotBeNull(); // Build an app to test the endpoint limiters var app = builder.Build(); - var globalLimiter = app.Services.GetRequiredService>().Value.GlobalLimiter; + var globalLimiter = app.Services.GetRequiredService>().CurrentValue.GlobalLimiter; globalLimiter.ShouldNotBeNull(); diff --git a/Application/EdFi.Ods.AdminApi/AdminConsole/Configurations/AdminConsoleExtension.cs b/Application/EdFi.Ods.AdminApi/AdminConsole/Configurations/AdminConsoleExtension.cs index d504e110b..aa7524c11 100644 --- a/Application/EdFi.Ods.AdminApi/AdminConsole/Configurations/AdminConsoleExtension.cs +++ b/Application/EdFi.Ods.AdminApi/AdminConsole/Configurations/AdminConsoleExtension.cs @@ -16,9 +16,9 @@ public static class AdminConsoleExtension { public static void UseCorsForAdminConsole(this WebApplication app) { - var adminConsoleSettings = app.Services.GetService>(); + var adminConsoleSettings = app.Services.GetService>(); - if (adminConsoleSettings != null && adminConsoleSettings.Value.CorsSettings.EnableCors) + if (adminConsoleSettings != null && adminConsoleSettings.CurrentValue.CorsSettings.EnableCors) app.UseCors(AdminConsoleConstants.CorsPolicyName); } diff --git a/Application/EdFi.Ods.AdminApi/AdminConsole/Configurations/ServicesBuilderExtension.cs b/Application/EdFi.Ods.AdminApi/AdminConsole/Configurations/ServicesBuilderExtension.cs index 788b4cb0a..1d5ec7ffa 100644 --- a/Application/EdFi.Ods.AdminApi/AdminConsole/Configurations/ServicesBuilderExtension.cs +++ b/Application/EdFi.Ods.AdminApi/AdminConsole/Configurations/ServicesBuilderExtension.cs @@ -31,7 +31,7 @@ public static void AddAdminConsoleServices(this WebApplicationBuilder builder) builder.Services.Configure(builder.Configuration.GetSection("AdminConsoleSettings")); builder.Services.AddAutoMapper(typeof(AdminConsoleMappingProfile)); - builder.Services.AddTransient(sp => sp.GetService>()!.Value); + builder.Services.AddTransient(sp => sp.GetService>()!.CurrentValue); builder.Services.AddTransient(); builder.Services.AddTransient(); diff --git a/Application/EdFi.Ods.AdminApi/AdminConsole/InitializationService.cs b/Application/EdFi.Ods.AdminApi/AdminConsole/InitializationService.cs index d65cf9f10..44f452d4b 100644 --- a/Application/EdFi.Ods.AdminApi/AdminConsole/InitializationService.cs +++ b/Application/EdFi.Ods.AdminApi/AdminConsole/InitializationService.cs @@ -35,11 +35,11 @@ public class InitializationService : IAdminConsoleInitializationService { private readonly IUsersContext _usersContext; private readonly IGetApplicationByNameAndClaimsetQuery _getApplicationByNameAndClaimset; - private readonly IOptions _options; + private readonly IOptionsMonitor _options; public InitializationService(IUsersContext usersContext, IGetApplicationByNameAndClaimsetQuery getApplicationByNameAndClaimset, - IOptions options) + IOptionsMonitor options) { _usersContext = usersContext; _getApplicationByNameAndClaimset = getApplicationByNameAndClaimset; diff --git a/Application/EdFi.Ods.AdminApi/Features/ApiClients/AddApiClient.cs b/Application/EdFi.Ods.AdminApi/Features/ApiClients/AddApiClient.cs index d1a93fdd7..c06a560b4 100644 --- a/Application/EdFi.Ods.AdminApi/Features/ApiClients/AddApiClient.cs +++ b/Application/EdFi.Ods.AdminApi/Features/ApiClients/AddApiClient.cs @@ -27,7 +27,7 @@ public void MapEndpoints(IEndpointRouteBuilder endpoints) .BuildForVersions(AdminApiVersions.V2); } - public static async Task Handle(Validator validator, IAddApiClientCommand addApiClientCommand, IMapper mapper, IUsersContext db, AddApiClientRequest request, IOptions options) + public static async Task Handle(Validator validator, IAddApiClientCommand addApiClientCommand, IMapper mapper, IUsersContext db, AddApiClientRequest request, IOptionsMonitor options) { await validator.GuardAsync(request); GuardAgainstInvalidEntityReferences(request, db); diff --git a/Application/EdFi.Ods.AdminApi/Features/Applications/AddApplication.cs b/Application/EdFi.Ods.AdminApi/Features/Applications/AddApplication.cs index cbfae7270..984195019 100644 --- a/Application/EdFi.Ods.AdminApi/Features/Applications/AddApplication.cs +++ b/Application/EdFi.Ods.AdminApi/Features/Applications/AddApplication.cs @@ -28,7 +28,7 @@ public void MapEndpoints(IEndpointRouteBuilder endpoints) .BuildForVersions(AdminApiVersions.V2); } - public static async Task Handle(Validator validator, IAddApplicationCommand addApplicationCommand, IMapper mapper, IUsersContext db, AddApplicationRequest request, IOptions options) + public static async Task Handle(Validator validator, IAddApplicationCommand addApplicationCommand, IMapper mapper, IUsersContext db, AddApplicationRequest request, IOptionsMonitor options) { await validator.GuardAsync(request); GuardAgainstInvalidEntityReferences(request, db); diff --git a/Application/EdFi.Ods.AdminApi/Features/Applications/ReadApplication.cs b/Application/EdFi.Ods.AdminApi/Features/Applications/ReadApplication.cs index c5f3cc600..5bb18ceec 100644 --- a/Application/EdFi.Ods.AdminApi/Features/Applications/ReadApplication.cs +++ b/Application/EdFi.Ods.AdminApi/Features/Applications/ReadApplication.cs @@ -35,7 +35,7 @@ public void MapEndpoints(IEndpointRouteBuilder endpoints) internal static async Task GetApplications( IGetAllApplicationsQuery getAllApplicationsQuery, IMapper mapper, - IOptions settings, + IOptionsMonitor settings, Validator validator, [AsParameters] CommonQueryParams commonQueryParams, int? id, string? applicationName, string? claimsetName, string? ids) { diff --git a/Application/EdFi.Ods.AdminApi/Features/Applications/ResetApplicationCredentials.cs b/Application/EdFi.Ods.AdminApi/Features/Applications/ResetApplicationCredentials.cs index fb1fd0aa9..a8a41437e 100644 --- a/Application/EdFi.Ods.AdminApi/Features/Applications/ResetApplicationCredentials.cs +++ b/Application/EdFi.Ods.AdminApi/Features/Applications/ResetApplicationCredentials.cs @@ -26,9 +26,9 @@ public void MapEndpoints(IEndpointRouteBuilder endpoints) .BuildForVersions(AdminApiVersions.V2); } - public static async Task HandleResetCredentials(RegenerateApplicationApiClientSecretCommand resetSecretCommand, IOptions settings, IMapper mapper, int id) + public static async Task HandleResetCredentials(RegenerateApplicationApiClientSecretCommand resetSecretCommand, IOptionsMonitor settings, IMapper mapper, int id) { - if (!settings.Value.EnableApplicationResetEndpoint) + if (!settings.CurrentValue.EnableApplicationResetEndpoint) throw new FluentValidation.ValidationException(new[] { new ValidationFailure(nameof(Application), $"This endpoint has been disabled on application settings.") }); var resetApplicationSecret = await Task.Run(() => resetSecretCommand.Execute(id)); diff --git a/Application/EdFi.Ods.AdminApi/Features/OdsInstanceDerivative/AddOdsInstanceDerivative.cs b/Application/EdFi.Ods.AdminApi/Features/OdsInstanceDerivative/AddOdsInstanceDerivative.cs index a6c9f63b2..0aa100a95 100644 --- a/Application/EdFi.Ods.AdminApi/Features/OdsInstanceDerivative/AddOdsInstanceDerivative.cs +++ b/Application/EdFi.Ods.AdminApi/Features/OdsInstanceDerivative/AddOdsInstanceDerivative.cs @@ -33,7 +33,7 @@ public static async Task Handle(Validator validator, IAddOdsInstanceDer var addedOdsInstanceDerivative = addOdsInstanceDerivativeCommand.Execute(request); return Results.Created($"/odsInstanceDerivatives/{addedOdsInstanceDerivative.OdsInstanceDerivativeId}", null); } - + [SwaggerSchema(Title = "AddOdsInstanceDerivativeRequest")] public class AddOdsInstanceDerivativeRequest : IAddOdsInstanceDerivativeModel { @@ -51,11 +51,11 @@ public class Validator : AbstractValidator private readonly IGetOdsInstanceDerivativesQuery _getOdsInstanceDerivativesQuery; private readonly string _databaseEngine; - public Validator(IGetOdsInstanceQuery getOdsInstanceQuery, IGetOdsInstanceDerivativesQuery getOdsInstanceDerivativesQuery, IOptions options) + public Validator(IGetOdsInstanceQuery getOdsInstanceQuery, IGetOdsInstanceDerivativesQuery getOdsInstanceDerivativesQuery, IOptionsMonitor options) { _getOdsInstanceQuery = getOdsInstanceQuery; _getOdsInstanceDerivativesQuery = getOdsInstanceDerivativesQuery; - _databaseEngine = options.Value.DatabaseEngine ?? throw new NotFoundException("AppSettings", "DatabaseEngine"); + _databaseEngine = options.CurrentValue.DatabaseEngine ?? throw new NotFoundException("AppSettings", "DatabaseEngine"); RuleFor(m => m.DerivativeType).NotEmpty(); diff --git a/Application/EdFi.Ods.AdminApi/Features/OdsInstanceDerivative/EditOdsInstanceDerivative.cs b/Application/EdFi.Ods.AdminApi/Features/OdsInstanceDerivative/EditOdsInstanceDerivative.cs index 38b6f21b2..f1f3e9326 100644 --- a/Application/EdFi.Ods.AdminApi/Features/OdsInstanceDerivative/EditOdsInstanceDerivative.cs +++ b/Application/EdFi.Ods.AdminApi/Features/OdsInstanceDerivative/EditOdsInstanceDerivative.cs @@ -63,11 +63,11 @@ public class Validator : AbstractValidator private readonly IGetOdsInstanceQuery _getOdsInstanceQuery; private readonly IGetOdsInstanceDerivativesQuery _getOdsInstanceDerivativesQuery; private readonly string _databaseEngine; - public Validator(IGetOdsInstanceQuery getOdsInstanceQuery, IGetOdsInstanceDerivativesQuery getOdsInstanceDerivativesQuery, IOptions options) + public Validator(IGetOdsInstanceQuery getOdsInstanceQuery, IGetOdsInstanceDerivativesQuery getOdsInstanceDerivativesQuery, IOptionsMonitor options) { _getOdsInstanceQuery = getOdsInstanceQuery; _getOdsInstanceDerivativesQuery = getOdsInstanceDerivativesQuery; - _databaseEngine = options.Value.DatabaseEngine ?? throw new NotFoundException("AppSettings", "DatabaseEngine"); + _databaseEngine = options.CurrentValue.DatabaseEngine ?? throw new NotFoundException("AppSettings", "DatabaseEngine"); RuleFor(m => m.DerivativeType).NotEmpty(); diff --git a/Application/EdFi.Ods.AdminApi/Features/OdsInstances/AddOdsInstance.cs b/Application/EdFi.Ods.AdminApi/Features/OdsInstances/AddOdsInstance.cs index 8f1ef39dc..ddcca7df1 100644 --- a/Application/EdFi.Ods.AdminApi/Features/OdsInstances/AddOdsInstance.cs +++ b/Application/EdFi.Ods.AdminApi/Features/OdsInstances/AddOdsInstance.cs @@ -34,11 +34,11 @@ public static async Task Handle( IAddOdsInstanceCommand addOdsInstanceCommand, IMapper mapper, ISymmetricStringEncryptionProvider encryptionProvider, - IOptions options, + IOptionsMonitor options, AddOdsInstanceRequest request) { await validator.GuardAsync(request); - string encryptionKey = options.Value.EncryptionKey ?? throw new InvalidOperationException("EncryptionKey can't be null."); + string encryptionKey = options.CurrentValue.EncryptionKey ?? throw new InvalidOperationException("EncryptionKey can't be null."); request.ConnectionString = encryptionProvider.Encrypt(request.ConnectionString, Convert.FromBase64String(encryptionKey)); var addedProfile = addOdsInstanceCommand.Execute(request); return Results.Created($"/odsInstances/{addedProfile.OdsInstanceId}", null); @@ -60,10 +60,10 @@ public class Validator : AbstractValidator { private readonly IGetOdsInstancesQuery _getOdsInstancesQuery; private readonly string _databaseEngine; - public Validator(IGetOdsInstancesQuery getOdsInstancesQuery, IOptions options) + public Validator(IGetOdsInstancesQuery getOdsInstancesQuery, IOptionsMonitor options) { _getOdsInstancesQuery = getOdsInstancesQuery; - _databaseEngine = options.Value.DatabaseEngine ?? throw new NotFoundException("AppSettings", "DatabaseEngine"); + _databaseEngine = options.CurrentValue.DatabaseEngine ?? throw new NotFoundException("AppSettings", "DatabaseEngine"); RuleFor(m => m.Name) .NotEmpty() diff --git a/Application/EdFi.Ods.AdminApi/Features/OdsInstances/EditOdsInstance.cs b/Application/EdFi.Ods.AdminApi/Features/OdsInstances/EditOdsInstance.cs index 13c0a71e4..68a1fc347 100644 --- a/Application/EdFi.Ods.AdminApi/Features/OdsInstances/EditOdsInstance.cs +++ b/Application/EdFi.Ods.AdminApi/Features/OdsInstances/EditOdsInstance.cs @@ -35,14 +35,14 @@ public static async Task Handle( IEditOdsInstanceCommand editOdsInstanceCommand, IMapper mapper, ISymmetricStringEncryptionProvider encryptionProvider, - IOptions options, + IOptionsMonitor options, EditOdsInstanceRequest request, int id) { request.Id = id; await validator.GuardAsync(request); - string encryptionKey = options.Value.EncryptionKey ?? throw new InvalidOperationException("EncryptionKey can't be null."); + string encryptionKey = options.CurrentValue.EncryptionKey ?? throw new InvalidOperationException("EncryptionKey can't be null."); if (!string.IsNullOrEmpty(request.ConnectionString)) request.ConnectionString = encryptionProvider.Encrypt(request.ConnectionString, Convert.FromBase64String(encryptionKey)); else diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Commands/AddApiClientCommand.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Commands/AddApiClientCommand.cs index 1adba6ba5..678d7f109 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Commands/AddApiClientCommand.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Commands/AddApiClientCommand.cs @@ -13,14 +13,14 @@ namespace EdFi.Ods.AdminApi.Infrastructure.Database.Commands; public interface IAddApiClientCommand { - AddApiClientResult Execute(IAddApiClientModel apiClientModel, IOptions options); + AddApiClientResult Execute(IAddApiClientModel apiClientModel, IOptionsMonitor options); } public class AddApiClientCommand(IUsersContext usersContext) : IAddApiClientCommand { private readonly IUsersContext _usersContext = usersContext; - public AddApiClientResult Execute(IAddApiClientModel apiClientModel, IOptions options) + public AddApiClientResult Execute(IAddApiClientModel apiClientModel, IOptionsMonitor options) { var application = _usersContext.Applications .Include(a => a.Vendor) diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Commands/AddApplicationCommand.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Commands/AddApplicationCommand.cs index 22ba8241b..84128c1d0 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Commands/AddApplicationCommand.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Commands/AddApplicationCommand.cs @@ -18,7 +18,7 @@ namespace EdFi.Ods.AdminApi.Infrastructure.Database.Commands; public interface IAddApplicationCommand { - AddApplicationResult Execute(IAddApplicationModel applicationModel, IOptions options); + AddApplicationResult Execute(IAddApplicationModel applicationModel, IOptionsMonitor options); } public class AddApplicationCommand : IAddApplicationCommand @@ -30,9 +30,9 @@ public AddApplicationCommand(IUsersContext usersContext) _usersContext = usersContext; } - public AddApplicationResult Execute(IAddApplicationModel applicationModel, IOptions options) + public AddApplicationResult Execute(IAddApplicationModel applicationModel, IOptionsMonitor options) { - if (options.Value.PreventDuplicateApplications) + if (options.CurrentValue.PreventDuplicateApplications) { ValidateApplicationExistsQuery validateApplicationExists = new ValidateApplicationExistsQuery(_usersContext); bool applicationExists = validateApplicationExists.Execute(applicationModel); diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAllActionsQuery.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAllActionsQuery.cs index c75de7cbc..bc44456bc 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAllActionsQuery.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAllActionsQuery.cs @@ -25,14 +25,14 @@ public interface IGetAllActionsQuery public class GetAllActionsQuery : IGetAllActionsQuery { private readonly ISecurityContext _securityContext; - private readonly IOptions _options; + private readonly IOptionsMonitor _options; private readonly Dictionary>> _orderByColumnActions; - public GetAllActionsQuery(ISecurityContext securityContext, IOptions options) + public GetAllActionsQuery(ISecurityContext securityContext, IOptionsMonitor options) { _securityContext = securityContext; _options = options; - var isSQLServerEngine = _options.Value.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); + var isSQLServerEngine = _options.CurrentValue.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); _orderByColumnActions = new Dictionary>> (StringComparer.OrdinalIgnoreCase) { diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAllApplicationsQuery.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAllApplicationsQuery.cs index c841f32db..bfbea7a84 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAllApplicationsQuery.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAllApplicationsQuery.cs @@ -24,14 +24,14 @@ public interface IGetAllApplicationsQuery public class GetAllApplicationsQuery : IGetAllApplicationsQuery { private readonly IUsersContext _context; - private readonly IOptions _options; + private readonly IOptionsMonitor _options; private readonly Dictionary>> _orderByColumnApplications; - public GetAllApplicationsQuery(IUsersContext context, IOptions options) + public GetAllApplicationsQuery(IUsersContext context, IOptionsMonitor options) { _context = context; _options = options; - var isSQLServerEngine = _options.Value.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); + var isSQLServerEngine = _options.CurrentValue.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); _orderByColumnApplications = new Dictionary>> (StringComparer.OrdinalIgnoreCase) { diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAllClaimSetsQuery.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAllClaimSetsQuery.cs index 41ecac824..48813732e 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAllClaimSetsQuery.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAllClaimSetsQuery.cs @@ -25,20 +25,20 @@ public interface IGetAllClaimSetsQuery public class GetAllClaimSetsQuery : IGetAllClaimSetsQuery { private readonly ISecurityContext _securityContext; - private readonly IOptions _options; + private readonly IOptionsMonitor _options; private readonly Dictionary>> _orderByColumnClaimSet; - public GetAllClaimSetsQuery(ISecurityContext securityContext, IOptions options) + public GetAllClaimSetsQuery(ISecurityContext securityContext, IOptionsMonitor options) { - _securityContext = securityContext; - _options = options; - var isSQLServerEngine = _options.Value.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); - _orderByColumnClaimSet = new Dictionary>> - (StringComparer.OrdinalIgnoreCase) - { - #pragma warning disable CS8603 // Possible null reference return. - { SortingColumns.DefaultNameColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.Name, DatabaseEngineEnum.SqlServerCollation) : x.Name }, - #pragma warning restore CS8603 // Possible null reference return. - { SortingColumns.DefaultIdColumn, x => x.Id } + _securityContext = securityContext; + _options = options; + var isSQLServerEngine = _options.CurrentValue.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); + _orderByColumnClaimSet = new Dictionary>> + (StringComparer.OrdinalIgnoreCase) + { + #pragma warning disable CS8603 // Possible null reference return. + { SortingColumns.DefaultNameColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.Name, DatabaseEngineEnum.SqlServerCollation) : x.Name }, + #pragma warning restore CS8603 // Possible null reference return. + { SortingColumns.DefaultIdColumn, x => x.Id } }; } @@ -57,8 +57,8 @@ public IReadOnlyList Execute() } public IReadOnlyList Execute(CommonQueryParams commonQueryParams, int? id, string? name) - { - Expression> columnToOrderBy = _orderByColumnClaimSet.GetColumnToOrderBy(commonQueryParams.OrderBy); + { + Expression> columnToOrderBy = _orderByColumnClaimSet.GetColumnToOrderBy(commonQueryParams.OrderBy); return _securityContext.ClaimSets .Where(c => id == null || c.ClaimSetId == id) diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAuthStrategiesQuery.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAuthStrategiesQuery.cs index f07efa67e..ee0a056da 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAuthStrategiesQuery.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetAuthStrategiesQuery.cs @@ -25,36 +25,36 @@ public interface IGetAuthStrategiesQuery public class GetAuthStrategiesQuery : IGetAuthStrategiesQuery { private readonly ISecurityContext _context; - private readonly IOptions _options; + private readonly IOptionsMonitor _options; private readonly Dictionary>> _orderByColumnAuthorizationStrategies; - public GetAuthStrategiesQuery(ISecurityContext context, IOptions options) + public GetAuthStrategiesQuery(ISecurityContext context, IOptionsMonitor options) { - _context = context; - _options = options; - var isSQLServerEngine = _options.Value.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); - - _orderByColumnAuthorizationStrategies = new Dictionary>> - (StringComparer.OrdinalIgnoreCase) - { - { SortingColumns.DefaultNameColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.AuthorizationStrategyName, DatabaseEngineEnum.SqlServerCollation) : x.AuthorizationStrategyName }, - { SortingColumns.AuthorizationStrategyDisplayNameColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.DisplayName, DatabaseEngineEnum.SqlServerCollation) : x.DisplayName }, - { SortingColumns.DefaultIdColumn, x => x.AuthorizationStrategyId } + _context = context; + _options = options; + var isSQLServerEngine = _options.CurrentValue.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); + + _orderByColumnAuthorizationStrategies = new Dictionary>> + (StringComparer.OrdinalIgnoreCase) + { + { SortingColumns.DefaultNameColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.AuthorizationStrategyName, DatabaseEngineEnum.SqlServerCollation) : x.AuthorizationStrategyName }, + { SortingColumns.AuthorizationStrategyDisplayNameColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.DisplayName, DatabaseEngineEnum.SqlServerCollation) : x.DisplayName }, + { SortingColumns.DefaultIdColumn, x => x.AuthorizationStrategyId } }; } public List Execute() - { + { return _context.AuthorizationStrategies.OrderBy(v => v.AuthorizationStrategyName).ToList(); } public List Execute(CommonQueryParams commonQueryParams) - { - Expression> columnToOrderBy = _orderByColumnAuthorizationStrategies.GetColumnToOrderBy(commonQueryParams.OrderBy); - - return _context.AuthorizationStrategies - .OrderByColumn(columnToOrderBy, commonQueryParams.IsDescending) - .Paginate(commonQueryParams.Offset, commonQueryParams.Limit, _options) - .ToList(); + { + Expression> columnToOrderBy = _orderByColumnAuthorizationStrategies.GetColumnToOrderBy(commonQueryParams.OrderBy); + + return _context.AuthorizationStrategies + .OrderByColumn(columnToOrderBy, commonQueryParams.IsDescending) + .Paginate(commonQueryParams.Offset, commonQueryParams.Limit, _options) + .ToList(); } } - + diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetOdsInstanceContextsQuery.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetOdsInstanceContextsQuery.cs index 305480cd1..a208e170f 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetOdsInstanceContextsQuery.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetOdsInstanceContextsQuery.cs @@ -12,8 +12,8 @@ using EdFi.Ods.AdminApi.Infrastructure.Extensions; using EdFi.Ods.AdminApi.Infrastructure.Helpers; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; - +using Microsoft.Extensions.Options; + namespace EdFi.Ods.AdminApi.Infrastructure.Database.Queries; @@ -26,37 +26,37 @@ public interface IGetOdsInstanceContextsQuery public class GetOdsInstanceContextsQuery : IGetOdsInstanceContextsQuery { private readonly IUsersContext _usersContext; - private readonly IOptions _options; + private readonly IOptionsMonitor _options; private readonly Dictionary>> _orderByColumnOds; - public GetOdsInstanceContextsQuery(IUsersContext usersContext, IOptions options) + public GetOdsInstanceContextsQuery(IUsersContext usersContext, IOptionsMonitor options) { - _usersContext = usersContext; - _options = options; - var isSQLServerEngine = _options.Value.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); - _orderByColumnOds = new Dictionary>> - (StringComparer.OrdinalIgnoreCase) - { - { SortingColumns.OdsInstanceContextKeyColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.ContextKey, DatabaseEngineEnum.SqlServerCollation) : x.ContextKey }, - { SortingColumns.OdsInstanceContextValueColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.ContextValue, DatabaseEngineEnum.SqlServerCollation) : x.ContextValue }, - { SortingColumns.DefaultIdColumn, x => x.OdsInstanceContextId } + _usersContext = usersContext; + _options = options; + var isSQLServerEngine = _options.CurrentValue.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); + _orderByColumnOds = new Dictionary>> + (StringComparer.OrdinalIgnoreCase) + { + { SortingColumns.OdsInstanceContextKeyColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.ContextKey, DatabaseEngineEnum.SqlServerCollation) : x.ContextKey }, + { SortingColumns.OdsInstanceContextValueColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.ContextValue, DatabaseEngineEnum.SqlServerCollation) : x.ContextValue }, + { SortingColumns.DefaultIdColumn, x => x.OdsInstanceContextId } }; } public List Execute() { - return _usersContext.OdsInstanceContexts - .Include(oid => oid.OdsInstance) + return _usersContext.OdsInstanceContexts + .Include(oid => oid.OdsInstance) .OrderBy(p => p.ContextKey).ToList(); } public List Execute(CommonQueryParams commonQueryParams) - { - Expression> columnToOrderBy = _orderByColumnOds.GetColumnToOrderBy(commonQueryParams.OrderBy); + { + Expression> columnToOrderBy = _orderByColumnOds.GetColumnToOrderBy(commonQueryParams.OrderBy); - return _usersContext.OdsInstanceContexts - .Include(oid => oid.OdsInstance) - .OrderByColumn(columnToOrderBy, commonQueryParams.IsDescending) - .Paginate(commonQueryParams.Offset, commonQueryParams.Limit, _options) + return _usersContext.OdsInstanceContexts + .Include(oid => oid.OdsInstance) + .OrderByColumn(columnToOrderBy, commonQueryParams.IsDescending) + .Paginate(commonQueryParams.Offset, commonQueryParams.Limit, _options) .ToList(); } } diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetOdsInstanceDerivativesQuery.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetOdsInstanceDerivativesQuery.cs index 4bf1e7964..41808745d 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetOdsInstanceDerivativesQuery.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetOdsInstanceDerivativesQuery.cs @@ -12,8 +12,8 @@ using EdFi.Ods.AdminApi.Infrastructure.Extensions; using EdFi.Ods.AdminApi.Infrastructure.Helpers; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; - +using Microsoft.Extensions.Options; + namespace EdFi.Ods.AdminApi.Infrastructure.Database.Queries; public interface IGetOdsInstanceDerivativesQuery @@ -25,37 +25,37 @@ public interface IGetOdsInstanceDerivativesQuery public class GetOdsInstanceDerivativesQuery : IGetOdsInstanceDerivativesQuery { private readonly IUsersContext _usersContext; - private readonly IOptions _options; + private readonly IOptionsMonitor _options; private readonly Dictionary>> _orderByColumnOds; - public GetOdsInstanceDerivativesQuery(IUsersContext usersContext, IOptions options) + public GetOdsInstanceDerivativesQuery(IUsersContext usersContext, IOptionsMonitor options) { - _usersContext = usersContext; - _options = options; - var DatabaseEngine = _options.Value.DatabaseEngine ??= DatabaseEngineEnum.SqlServer; - var isSQLServerEngine = DatabaseEngine.Equals(DatabaseEngineEnum.SqlServer, StringComparison.OrdinalIgnoreCase); - _orderByColumnOds = new Dictionary>> - (StringComparer.OrdinalIgnoreCase) - { - { SortingColumns.OdsInstanceDerivativeTypeColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.DerivativeType, DatabaseEngineEnum.SqlServerCollation) : x.DerivativeType }, - { SortingColumns.OdsInstanceDerivativeOdsInstanceIdColumn, x => x.OdsInstance.OdsInstanceId }, - { SortingColumns.DefaultIdColumn, x => x.OdsInstanceDerivativeId } + _usersContext = usersContext; + _options = options; + var DatabaseEngine = _options.CurrentValue.DatabaseEngine ??= DatabaseEngineEnum.SqlServer; + var isSQLServerEngine = DatabaseEngine.Equals(DatabaseEngineEnum.SqlServer, StringComparison.OrdinalIgnoreCase); + _orderByColumnOds = new Dictionary>> + (StringComparer.OrdinalIgnoreCase) + { + { SortingColumns.OdsInstanceDerivativeTypeColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.DerivativeType, DatabaseEngineEnum.SqlServerCollation) : x.DerivativeType }, + { SortingColumns.OdsInstanceDerivativeOdsInstanceIdColumn, x => x.OdsInstance.OdsInstanceId }, + { SortingColumns.DefaultIdColumn, x => x.OdsInstanceDerivativeId } }; } public List Execute() { - return [.. _usersContext.OdsInstanceDerivatives - .Include(oid => oid.OdsInstance) + return [.. _usersContext.OdsInstanceDerivatives + .Include(oid => oid.OdsInstance) .OrderBy(p => p.DerivativeType)]; } public List Execute(CommonQueryParams commonQueryParams) - { - Expression> columnToOrderBy = _orderByColumnOds.GetColumnToOrderBy(commonQueryParams.OrderBy); + { + Expression> columnToOrderBy = _orderByColumnOds.GetColumnToOrderBy(commonQueryParams.OrderBy); - return [.. _usersContext.OdsInstanceDerivatives - .Include(oid => oid.OdsInstance) - .OrderByColumn(columnToOrderBy, commonQueryParams.IsDescending) + return [.. _usersContext.OdsInstanceDerivatives + .Include(oid => oid.OdsInstance) + .OrderByColumn(columnToOrderBy, commonQueryParams.IsDescending) .Paginate(commonQueryParams.Offset, commonQueryParams.Limit, _options)]; } } diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetOdsInstancesQuery.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetOdsInstancesQuery.cs index 6e997d740..3e8786cc0 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetOdsInstancesQuery.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetOdsInstancesQuery.cs @@ -26,21 +26,21 @@ public interface IGetOdsInstancesQuery public class GetOdsInstancesQuery : IGetOdsInstancesQuery { private readonly IUsersContext _usersContext; - private readonly IOptions _options; + private readonly IOptionsMonitor _options; private readonly Dictionary>> _orderByColumnOds; - public GetOdsInstancesQuery(IUsersContext userContext, IOptions options) + public GetOdsInstancesQuery(IUsersContext userContext, IOptionsMonitor options) { - _usersContext = userContext; - _options = options; - var isSQLServerEngine = _options.Value.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); - _orderByColumnOds = new Dictionary>> - (StringComparer.OrdinalIgnoreCase) - { - { SortingColumns.DefaultNameColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.Name, DatabaseEngineEnum.SqlServerCollation) : x.Name }, - { SortingColumns.OdsInstanceInstanceTypeColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.InstanceType, DatabaseEngineEnum.SqlServerCollation) : x.InstanceType }, - { SortingColumns.DefaultIdColumn, x => x.OdsInstanceId } - }; + _usersContext = userContext; + _options = options; + var isSQLServerEngine = _options.CurrentValue.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); + _orderByColumnOds = new Dictionary>> + (StringComparer.OrdinalIgnoreCase) + { + { SortingColumns.DefaultNameColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.Name, DatabaseEngineEnum.SqlServerCollation) : x.Name }, + { SortingColumns.OdsInstanceInstanceTypeColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.InstanceType, DatabaseEngineEnum.SqlServerCollation) : x.InstanceType }, + { SortingColumns.DefaultIdColumn, x => x.OdsInstanceId } + }; } public List Execute() @@ -49,15 +49,15 @@ public List Execute() } public List Execute(CommonQueryParams commonQueryParams, int? id, string? name, string? instanceType) - { - Expression> columnToOrderBy = _orderByColumnOds.GetColumnToOrderBy(commonQueryParams.OrderBy); + { + Expression> columnToOrderBy = _orderByColumnOds.GetColumnToOrderBy(commonQueryParams.OrderBy); return _usersContext.OdsInstances .Where(o => id == null || o.OdsInstanceId == id) .Where(o => name == null || o.Name == name) .Where(o => instanceType == null || o.InstanceType == instanceType) .OrderByColumn(columnToOrderBy, commonQueryParams.IsDescending) - .Paginate(commonQueryParams.Offset, commonQueryParams.Limit, _options) + .Paginate(commonQueryParams.Offset, commonQueryParams.Limit, _options) .ToList(); } } diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetProfilesQuery.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetProfilesQuery.cs index 56cde4160..cc5724bee 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetProfilesQuery.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetProfilesQuery.cs @@ -25,18 +25,18 @@ public interface IGetProfilesQuery public class GetProfilesQuery : IGetProfilesQuery { private readonly IUsersContext _usersContext; - private readonly IOptions _options; + private readonly IOptionsMonitor _options; private readonly Dictionary>> _orderByColumnProfiles; - public GetProfilesQuery(IUsersContext usersContext, IOptions options) + public GetProfilesQuery(IUsersContext usersContext, IOptionsMonitor options) { - _usersContext = usersContext; - _options = options; - var isSQLServerEngine = _options.Value.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); - _orderByColumnProfiles = new Dictionary>> - (StringComparer.OrdinalIgnoreCase) - { - { SortingColumns.DefaultNameColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.ProfileName, DatabaseEngineEnum.SqlServerCollation) : x.ProfileName }, - { SortingColumns.DefaultIdColumn, x => x.ProfileId } + _usersContext = usersContext; + _options = options; + var isSQLServerEngine = _options.CurrentValue.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); + _orderByColumnProfiles = new Dictionary>> + (StringComparer.OrdinalIgnoreCase) + { + { SortingColumns.DefaultNameColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.ProfileName, DatabaseEngineEnum.SqlServerCollation) : x.ProfileName }, + { SortingColumns.DefaultIdColumn, x => x.ProfileId } }; } @@ -45,14 +45,14 @@ public List Execute() return _usersContext.Profiles.OrderBy(p => p.ProfileName).ToList(); } public List Execute(CommonQueryParams commonQueryParams, int? id, string? name) - { - Expression> columnToOrderBy = _orderByColumnProfiles.GetColumnToOrderBy(commonQueryParams.OrderBy); + { + Expression> columnToOrderBy = _orderByColumnProfiles.GetColumnToOrderBy(commonQueryParams.OrderBy); return _usersContext.Profiles .Where(p => id == null || p.ProfileId == id) .Where(p => name == null || p.ProfileName == name) - .OrderByColumn(columnToOrderBy, commonQueryParams.IsDescending) - .Paginate(commonQueryParams.Offset, commonQueryParams.Limit, _options) + .OrderByColumn(columnToOrderBy, commonQueryParams.IsDescending) + .Paginate(commonQueryParams.Offset, commonQueryParams.Limit, _options) .ToList(); } } diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetResourceClaimActionAuthorizationStrategiesQuery.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetResourceClaimActionAuthorizationStrategiesQuery.cs index 6a545ede2..14b0b7d73 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetResourceClaimActionAuthorizationStrategiesQuery.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetResourceClaimActionAuthorizationStrategiesQuery.cs @@ -23,10 +23,10 @@ public interface IGetResourceClaimActionAuthorizationStrategiesQuery public class GetResourceClaimActionAuthorizationStrategiesQuery : IGetResourceClaimActionAuthorizationStrategiesQuery { private readonly ISecurityContext _securityContext; - private readonly IOptions _options; + private readonly IOptionsMonitor _options; private readonly Dictionary>> _orderByColumns; - public GetResourceClaimActionAuthorizationStrategiesQuery(ISecurityContext securityContext, IOptions options) + public GetResourceClaimActionAuthorizationStrategiesQuery(ISecurityContext securityContext, IOptionsMonitor options) { _securityContext = securityContext; _options = options; diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetResourceClaimActionsQuery.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetResourceClaimActionsQuery.cs index addee807e..0f454ea16 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetResourceClaimActionsQuery.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetResourceClaimActionsQuery.cs @@ -24,14 +24,14 @@ public interface IGetResourceClaimActionsQuery public class GetResourceClaimActionsQuery : IGetResourceClaimActionsQuery { private readonly ISecurityContext _securityContext; - private readonly IOptions _options; + private readonly IOptionsMonitor _options; private readonly Dictionary>> _orderByColumns; - public GetResourceClaimActionsQuery(ISecurityContext securityContext, IOptions options) + public GetResourceClaimActionsQuery(ISecurityContext securityContext, IOptionsMonitor options) { _securityContext = securityContext; _options = options; - var isSQLServerEngine = _options.Value.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); + var isSQLServerEngine = _options.CurrentValue.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); _orderByColumns = new Dictionary>> (StringComparer.OrdinalIgnoreCase) { diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetResourceClaimsQuery.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetResourceClaimsQuery.cs index febc1ca53..94dc27554 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetResourceClaimsQuery.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetResourceClaimsQuery.cs @@ -24,21 +24,21 @@ public interface IGetResourceClaimsQuery public class GetResourceClaimsQuery : IGetResourceClaimsQuery { private readonly ISecurityContext _securityContext; - private readonly IOptions _options; - private static readonly Dictionary>> _orderByColumnResourceClaims = - new Dictionary>> - (StringComparer.OrdinalIgnoreCase) - { - { SortingColumns.DefaultNameColumn, x => x.ResourceName }, - { SortingColumns.ResourceClaimParentNameColumn, x => x.ParentResourceClaim.ResourceName }, -#pragma warning disable CS8603 // Possible null reference return. - { SortingColumns.ResourceClaimParentIdColumn, x => x.ParentResourceClaimId }, -#pragma warning restore CS8603 // Possible null reference return. - { SortingColumns.DefaultIdColumn, x => x.ResourceClaimId } + private readonly IOptionsMonitor _options; + private static readonly Dictionary>> _orderByColumnResourceClaims = + new Dictionary>> + (StringComparer.OrdinalIgnoreCase) + { + { SortingColumns.DefaultNameColumn, x => x.ResourceName }, + { SortingColumns.ResourceClaimParentNameColumn, x => x.ParentResourceClaim.ResourceName }, +#pragma warning disable CS8603 // Possible null reference return. + { SortingColumns.ResourceClaimParentIdColumn, x => x.ParentResourceClaimId }, +#pragma warning restore CS8603 // Possible null reference return. + { SortingColumns.DefaultIdColumn, x => x.ResourceClaimId } }; - public GetResourceClaimsQuery(ISecurityContext securityContext, IOptions options) + public GetResourceClaimsQuery(ISecurityContext securityContext, IOptionsMonitor options) { - _securityContext = securityContext; + _securityContext = securityContext; _options = options; } @@ -48,26 +48,26 @@ public IEnumerable Execute() } public IEnumerable Execute(CommonQueryParams commonQueryParams, int? id, string? name) - { + { return Query(commonQueryParams) .Where(c => id == null || c.Id == id) - .Where(c => name == null || c.Name == name) + .Where(c => name == null || c.Name == name) .ToList(); } private IEnumerable Query(CommonQueryParams? commonQueryParams = null) - { + { Expression> columnToOrderBy = _orderByColumnResourceClaims.GetColumnToOrderBy(commonQueryParams != null ? commonQueryParams.Value.OrderBy : string.Empty); var resources = new List(); - var parentResources = _securityContext.ResourceClaims - .Where(x => x.ParentResourceClaim == null) - .OrderByColumn(columnToOrderBy, commonQueryParams.GetValueOrDefault().IsDescending); - - if (commonQueryParams != null) - parentResources = parentResources.Paginate(commonQueryParams.Value.Offset, commonQueryParams.Value.Limit, _options); - - var childResources = _securityContext.ResourceClaims.Where(x => x.ParentResourceClaim != null).ToList(); + var parentResources = _securityContext.ResourceClaims + .Where(x => x.ParentResourceClaim == null) + .OrderByColumn(columnToOrderBy, commonQueryParams.GetValueOrDefault().IsDescending); + + if (commonQueryParams != null) + parentResources = parentResources.Paginate(commonQueryParams.Value.Offset, commonQueryParams.Value.Limit, _options); + + var childResources = _securityContext.ResourceClaims.Where(x => x.ParentResourceClaim != null).ToList(); foreach (var parentResource in parentResources.ToList()) { diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetVendorsQuery.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetVendorsQuery.cs index 608f15d7c..24338c3fd 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetVendorsQuery.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Database/Queries/GetVendorsQuery.cs @@ -1,38 +1,38 @@ -// SPDX-License-Identifier: Apache-2.0 -// Licensed to the Ed-Fi Alliance under one or more agreements. -// The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. -// See the LICENSE and NOTICES files in the project root for more information. - -using System.Linq.Expressions; -using EdFi.Admin.DataAccess.Contexts; -using EdFi.Admin.DataAccess.Models; -using EdFi.Ods.AdminApi.Common.Infrastructure; -using EdFi.Ods.AdminApi.Common.Infrastructure.Helpers; -using EdFi.Ods.AdminApi.Common.Settings; -using EdFi.Ods.AdminApi.Infrastructure; -using EdFi.Ods.AdminApi.Infrastructure.Extensions; -using EdFi.Ods.AdminApi.Infrastructure.Helpers; -using Microsoft.EntityFrameworkCore; +// SPDX-License-Identifier: Apache-2.0 +// Licensed to the Ed-Fi Alliance under one or more agreements. +// The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +// See the LICENSE and NOTICES files in the project root for more information. + +using System.Linq.Expressions; +using EdFi.Admin.DataAccess.Contexts; +using EdFi.Admin.DataAccess.Models; +using EdFi.Ods.AdminApi.Common.Infrastructure; +using EdFi.Ods.AdminApi.Common.Infrastructure.Helpers; +using EdFi.Ods.AdminApi.Common.Settings; +using EdFi.Ods.AdminApi.Infrastructure; +using EdFi.Ods.AdminApi.Infrastructure.Extensions; +using EdFi.Ods.AdminApi.Infrastructure.Helpers; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; -namespace EdFi.Ods.AdminApi.Infrastructure.Database.Queries; - -public interface IGetVendorsQuery -{ - List Execute(); +namespace EdFi.Ods.AdminApi.Infrastructure.Database.Queries; + +public interface IGetVendorsQuery +{ + List Execute(); List Execute(CommonQueryParams commonQueryParams, int? id, string? company, string? namespacePrefixes, string? contactName, string? contactEmailAddress); -} - -public class GetVendorsQuery : IGetVendorsQuery -{ - private readonly IUsersContext _context; - private readonly IOptions _options; - private readonly Dictionary>> _orderByColumnVendors; - public GetVendorsQuery(IUsersContext context, IOptions options) - { +} + +public class GetVendorsQuery : IGetVendorsQuery +{ + private readonly IUsersContext _context; + private readonly IOptionsMonitor _options; + private readonly Dictionary>> _orderByColumnVendors; + public GetVendorsQuery(IUsersContext context, IOptionsMonitor options) + { _context = context; _options = options; - var isSQLServerEngine = _options.Value.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); + var isSQLServerEngine = _options.CurrentValue.DatabaseEngine?.ToLowerInvariant() == DatabaseEngineEnum.SqlServer.ToLowerInvariant(); _orderByColumnVendors = new Dictionary>> (StringComparer.OrdinalIgnoreCase) { @@ -43,11 +43,11 @@ public GetVendorsQuery(IUsersContext context, IOptions options) #pragma warning restore CS8602 // Dereference of a possibly null reference. { SortingColumns.VendorNamespacePrefixesColumn, x => isSQLServerEngine ? EF.Functions.Collate(x.VendorNamespacePrefixes.OrderBy(p => p.NamespacePrefix).First().NamespacePrefix, DatabaseEngineEnum.SqlServerCollation) : x.VendorNamespacePrefixes.OrderBy(p => p.NamespacePrefix).First().NamespacePrefix }, { SortingColumns.DefaultIdColumn, x => x.VendorId } - }; - } - - public List Execute() - { + }; + } + + public List Execute() + { return _context.Vendors .Include(v => v.Applications) .ThenInclude(a => a.Profiles) @@ -57,13 +57,13 @@ public List Execute() .ThenInclude(a => a.ApiClients) .Include(v => v.Users) .Include(v => v.VendorNamespacePrefixes) - .OrderBy(v => v.VendorName).Where(v => !VendorExtensions.ReservedNames.Contains(v.VendorName.Trim())).ToList(); + .OrderBy(v => v.VendorName).Where(v => !VendorExtensions.ReservedNames.Contains(v.VendorName.Trim())).ToList(); } - - public List Execute(CommonQueryParams commonQueryParams, int? id, string? company, string? namespacePrefixes, string? contactName, string? contactEmailAddress) + + public List Execute(CommonQueryParams commonQueryParams, int? id, string? company, string? namespacePrefixes, string? contactName, string? contactEmailAddress) { Expression> columnToOrderBy = _orderByColumnVendors.GetColumnToOrderBy(commonQueryParams.OrderBy); - + return _context.Vendors .Include(v => v.Applications) .ThenInclude(a => a.Profiles) @@ -81,6 +81,6 @@ public List Execute(CommonQueryParams commonQueryParams, int? id, string .Where(c => c.Users.Any(u => contactEmailAddress == null || u.Email == contactEmailAddress)) .OrderByColumn(columnToOrderBy, commonQueryParams.IsDescending) .Paginate(commonQueryParams.Offset, commonQueryParams.Limit, _options) - .ToList(); + .ToList(); } -} +} diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Documentation/SwaggerDefaultParameterFilter.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Documentation/SwaggerDefaultParameterFilter.cs index d269c4f96..6cb19c831 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Documentation/SwaggerDefaultParameterFilter.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Documentation/SwaggerDefaultParameterFilter.cs @@ -15,9 +15,9 @@ namespace EdFi.Ods.AdminApi.Infrastructure.Documentation; public class SwaggerDefaultParameterFilter : IOperationFilter { - private readonly IOptions _settings; + private readonly IOptionsMonitor _settings; - public SwaggerDefaultParameterFilter(IOptions settings) + public SwaggerDefaultParameterFilter(IOptionsMonitor settings) { _settings = settings; } @@ -29,25 +29,25 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context) if (parameter.Name.ToLower().Equals("offset")) { parameter.Description = "Indicates how many items should be skipped before returning results."; - parameter.Schema.Default = new OpenApiString(_settings.Value.DefaultPageSizeOffset.ToString()); + parameter.Schema.Default = new OpenApiString(_settings.CurrentValue.DefaultPageSizeOffset.ToString()); } else if (parameter.Name.ToLower().Equals("limit")) { parameter.Description = "Indicates the maximum number of items that should be returned in the results."; - parameter.Schema.Default = new OpenApiString(_settings.Value.DefaultPageSizeLimit.ToString()); - } - else if (parameter.Name.ToLower().Equals("orderby")) - { - parameter.Description = "Indicates the property name by which the results will be sorted."; - parameter.Schema.Default = new OpenApiString(string.Empty); - } - else if (parameter.Name.ToLower().Equals("direction")) - { - var description = "Indicates whether the result should be sorted in descending order (DESC) or ascending order (ASC)."; - parameter.Schema.Title = description; - parameter.Description = description; - parameter.Schema.Enum = new List { new OpenApiString(SortingDirectionHelper.Direction.Ascending.ToString()), new OpenApiString(SortingDirectionHelper.Direction.Descending.ToString()) }; - parameter.Schema.Default = new OpenApiString(SortingDirectionHelper.Direction.Descending.ToString()); + parameter.Schema.Default = new OpenApiString(_settings.CurrentValue.DefaultPageSizeLimit.ToString()); + } + else if (parameter.Name.ToLower().Equals("orderby")) + { + parameter.Description = "Indicates the property name by which the results will be sorted."; + parameter.Schema.Default = new OpenApiString(string.Empty); + } + else if (parameter.Name.ToLower().Equals("direction")) + { + var description = "Indicates whether the result should be sorted in descending order (DESC) or ascending order (ASC)."; + parameter.Schema.Title = description; + parameter.Description = description; + parameter.Schema.Enum = new List { new OpenApiString(SortingDirectionHelper.Direction.Ascending.ToString()), new OpenApiString(SortingDirectionHelper.Direction.Descending.ToString()) }; + parameter.Schema.Default = new OpenApiString(SortingDirectionHelper.Direction.Descending.ToString()); } } diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Extensions/QueryExtensions.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Extensions/QueryExtensions.cs index feec9900c..41d93709f 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Extensions/QueryExtensions.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Extensions/QueryExtensions.cs @@ -1,16 +1,16 @@ -// SPDX-License-Identifier: Apache-2.0 -// Licensed to the Ed-Fi Alliance under one or more agreements. -// The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. -// See the LICENSE and NOTICES files in the project root for more information. - -using System.Linq.Expressions; -using EdFi.Ods.AdminApi.Common.Settings; -using Microsoft.Extensions.Options; - -namespace EdFi.Ods.AdminApi.Infrastructure.Extensions -{ - public static class QueryExtensions - { +// SPDX-License-Identifier: Apache-2.0 +// Licensed to the Ed-Fi Alliance under one or more agreements. +// The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +// See the LICENSE and NOTICES files in the project root for more information. + +using System.Linq.Expressions; +using EdFi.Ods.AdminApi.Common.Settings; +using Microsoft.Extensions.Options; + +namespace EdFi.Ods.AdminApi.Infrastructure.Extensions +{ + public static class QueryExtensions + { /// /// Ordering the IQueryable base in the expression /// @@ -37,13 +37,13 @@ public static IQueryable OrderByColumn(this IQueryable source, Expressi /// /// App Setting values /// Paginated list - public static IQueryable Paginate(this IQueryable source, int? offset, int? limit, IOptions settings) + public static IQueryable Paginate(this IQueryable source, int? offset, int? limit, IOptionsMonitor settings) { try { - offset ??= settings.Value.DefaultPageSizeOffset; + offset ??= settings.CurrentValue.DefaultPageSizeOffset; - limit ??= settings.Value.DefaultPageSizeLimit; + limit ??= settings.CurrentValue.DefaultPageSizeLimit; return source.Skip(offset.Value).Take(limit.Value); } @@ -52,6 +52,6 @@ public static IQueryable Paginate(this IQueryable source, int? offset, // If this throws an exception simply don't paginate. return source; } - } - } -} + } + } +} diff --git a/Application/EdFi.Ods.AdminApi/Infrastructure/Helpers/IEnumerableExtensions.cs b/Application/EdFi.Ods.AdminApi/Infrastructure/Helpers/IEnumerableExtensions.cs index 22de7dd1f..860d5132d 100644 --- a/Application/EdFi.Ods.AdminApi/Infrastructure/Helpers/IEnumerableExtensions.cs +++ b/Application/EdFi.Ods.AdminApi/Infrastructure/Helpers/IEnumerableExtensions.cs @@ -26,22 +26,22 @@ public static string ToDelimiterSeparated(this IEnumerable inputStrings, return listOfStrings.Count != 0 ? string.Join(separator, listOfStrings) : string.Empty; - } - - public static IEnumerable Paginate(this IEnumerable source, int? offset, int? limit, IOptions settings) - { - try - { - offset ??= settings.Value.DefaultPageSizeOffset; - - limit ??= settings.Value.DefaultPageSizeLimit; - - return source.Skip(offset.Value).Take(limit.Value); - } - catch (Exception) - { - // If this throws an exception simply don't paginate. - return source; - } + } + + public static IEnumerable Paginate(this IEnumerable source, int? offset, int? limit, IOptionsMonitor settings) + { + try + { + offset ??= settings.CurrentValue.DefaultPageSizeOffset; + + limit ??= settings.CurrentValue.DefaultPageSizeLimit; + + return source.Skip(offset.Value).Take(limit.Value); + } + catch (Exception) + { + // If this throws an exception simply don't paginate. + return source; + } } } diff --git a/Application/EdFi.Ods.AdminConsole.DBTests/Database/CommandTests/CompleteInstanceCommandTests.cs b/Application/EdFi.Ods.AdminConsole.DBTests/Database/CommandTests/CompleteInstanceCommandTests.cs index fad2f174d..300d90aad 100644 --- a/Application/EdFi.Ods.AdminConsole.DBTests/Database/CommandTests/CompleteInstanceCommandTests.cs +++ b/Application/EdFi.Ods.AdminConsole.DBTests/Database/CommandTests/CompleteInstanceCommandTests.cs @@ -38,15 +38,15 @@ public async Task ShouldCompleteInstanceAsync() string connectionString = "Host=localhost;Port=5432;Username=postgres;Password=admin;Database=\"Ods_Test Complete Instance " + guid.ToString() + "\";Pooling=False"; var vendor = addVendorCommand.Execute(new AddVendorRequest { - Company = Testing.GetAdminConsoleSettings().Value.VendorCompany, + Company = Testing.GetAdminConsoleSettings().CurrentValue.VendorCompany, NamespacePrefixes = "joe@test.com", - ContactName = Testing.GetAdminConsoleSettings().Value.VendorCompany, + ContactName = Testing.GetAdminConsoleSettings().CurrentValue.VendorCompany, ContactEmailAddress = "test" }); var application = addApplicationCommand.Execute(new AddApplicationRequest { - ApplicationName = Testing.GetAdminConsoleSettings().Value.ApplicationName, + ApplicationName = Testing.GetAdminConsoleSettings().CurrentValue.ApplicationName, ClaimSetName = "test", ProfileIds = null, VendorId = vendor?.VendorId ?? 0 @@ -105,15 +105,15 @@ public async Task ShouldNotCompleteInstance_NotFoundException() var vendor = addVendorCommand.Execute(new AddVendorRequest { - Company = Testing.GetAdminConsoleSettings().Value.VendorCompany, + Company = Testing.GetAdminConsoleSettings().CurrentValue.VendorCompany, NamespacePrefixes = "joe@test.com", - ContactName = Testing.GetAdminConsoleSettings().Value.VendorCompany, + ContactName = Testing.GetAdminConsoleSettings().CurrentValue.VendorCompany, ContactEmailAddress = "test" }); var application = addApplicationCommand.Execute(new AddApplicationRequest { - ApplicationName = Testing.GetAdminConsoleSettings().Value.ApplicationName, + ApplicationName = Testing.GetAdminConsoleSettings().CurrentValue.ApplicationName, ClaimSetName = "test", ProfileIds = null, VendorId = vendor?.VendorId ?? 0 @@ -167,15 +167,15 @@ public async Task ShouldNotCompleteInstance_WhenAnExceptionIsThrownInTransaction var vendor = addVendorCommand.Execute(new AddVendorRequest { - Company = Testing.GetAdminConsoleSettings().Value.VendorCompany, + Company = Testing.GetAdminConsoleSettings().CurrentValue.VendorCompany, NamespacePrefixes = "joe@test.com", - ContactName = Testing.GetAdminConsoleSettings().Value.VendorCompany, + ContactName = Testing.GetAdminConsoleSettings().CurrentValue.VendorCompany, ContactEmailAddress = "test" }); var application = addApplicationCommand.Execute(new AddApplicationRequest { - ApplicationName = Testing.GetAdminConsoleSettings().Value.ApplicationName, + ApplicationName = Testing.GetAdminConsoleSettings().CurrentValue.ApplicationName, ClaimSetName = "test", ProfileIds = null, VendorId = vendor?.VendorId ?? 0 diff --git a/Application/EdFi.Ods.AdminConsole.DBTests/Database/CommandTests/RenameInstanceCommandTests.cs b/Application/EdFi.Ods.AdminConsole.DBTests/Database/CommandTests/RenameInstanceCommandTests.cs index 099e91f05..093c13e70 100644 --- a/Application/EdFi.Ods.AdminConsole.DBTests/Database/CommandTests/RenameInstanceCommandTests.cs +++ b/Application/EdFi.Ods.AdminConsole.DBTests/Database/CommandTests/RenameInstanceCommandTests.cs @@ -38,15 +38,15 @@ public async Task ShouldRenameInstance() var guid = Guid.NewGuid(); var vendor = addVendorCommand.Execute(new AddVendorRequest { - Company = Testing.GetAdminConsoleSettings().Value.VendorCompany, + Company = Testing.GetAdminConsoleSettings().CurrentValue.VendorCompany, NamespacePrefixes = "joe@test.com", - ContactName = Testing.GetAdminConsoleSettings().Value.VendorCompany, + ContactName = Testing.GetAdminConsoleSettings().CurrentValue.VendorCompany, ContactEmailAddress = "test" }); _ = addApplicationCommand.Execute(new AddApplicationRequest { - ApplicationName = Testing.GetAdminConsoleSettings().Value.ApplicationName, + ApplicationName = Testing.GetAdminConsoleSettings().CurrentValue.ApplicationName, ClaimSetName = "test", ProfileIds = null, VendorId = vendor?.VendorId ?? 0 @@ -108,15 +108,15 @@ public async Task ShouldNotRenameInstance_NotFoundException() var vendor = addVendorCommand.Execute(new AddVendorRequest { - Company = Testing.GetAdminConsoleSettings().Value.VendorCompany, + Company = Testing.GetAdminConsoleSettings().CurrentValue.VendorCompany, NamespacePrefixes = "joe@test.com", - ContactName = Testing.GetAdminConsoleSettings().Value.VendorCompany, + ContactName = Testing.GetAdminConsoleSettings().CurrentValue.VendorCompany, ContactEmailAddress = "test" }); var application = addApplicationCommand.Execute(new AddApplicationRequest { - ApplicationName = Testing.GetAdminConsoleSettings().Value.ApplicationName, + ApplicationName = Testing.GetAdminConsoleSettings().CurrentValue.ApplicationName, ClaimSetName = "test", ProfileIds = null, VendorId = vendor?.VendorId ?? 0 diff --git a/Application/EdFi.Ods.AdminConsole.DBTests/Database/Queries/GetInstanceByIdQueryTests.cs b/Application/EdFi.Ods.AdminConsole.DBTests/Database/Queries/GetInstanceByIdQueryTests.cs index 93129e51f..91a56cbb8 100644 --- a/Application/EdFi.Ods.AdminConsole.DBTests/Database/Queries/GetInstanceByIdQueryTests.cs +++ b/Application/EdFi.Ods.AdminConsole.DBTests/Database/Queries/GetInstanceByIdQueryTests.cs @@ -24,7 +24,7 @@ namespace EdFi.Ods.AdminConsole.DBTests.Database.CommandTests; [TestFixture] public class GetInstanceByIdQueryTests : PlatformUsersContextTestBase { - private IOptions _options { get; set; } + private IOptionsMonitor _options { get; set; } [OneTimeSetUp] public virtual async Task FixtureSetup() @@ -55,7 +55,7 @@ await TransactionAsync(async dbContext => var command = new AddInstanceCommand(repository); result = await command.Execute(newInstance); - + var queryRepository = new QueriesRepository(dbContext); var query = new GetInstanceByIdQuery(queryRepository); var instance = await query.Execute(result.Id); diff --git a/Application/EdFi.Ods.AdminConsole.DBTests/TestAdminConsoleOptionsMonitor.cs b/Application/EdFi.Ods.AdminConsole.DBTests/TestAdminConsoleOptionsMonitor.cs new file mode 100644 index 000000000..a7b5faa96 --- /dev/null +++ b/Application/EdFi.Ods.AdminConsole.DBTests/TestAdminConsoleOptionsMonitor.cs @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: Apache-2.0 +// Licensed to the Ed-Fi Alliance under one or more agreements. +// The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +// See the LICENSE and NOTICES files in the project root for more information. + +using System; +using EdFi.Ods.AdminApi.Common.Settings; +using Microsoft.Extensions.Options; + +namespace EdFi.Ods.AdminConsole.DBTests; + +internal class TestAdminConsoleOptionsMonitor : IOptionsMonitor +{ + private readonly AdminConsoleSettings _currentValue; + + public TestAdminConsoleOptionsMonitor(AdminConsoleSettings currentValue) + { + _currentValue = currentValue; + } + + public AdminConsoleSettings CurrentValue => _currentValue; + + public AdminConsoleSettings Get(string name) + => _currentValue; + + public IDisposable OnChange(Action listener) + => null; +} diff --git a/Application/EdFi.Ods.AdminConsole.DBTests/TestOptionsMonitor.cs b/Application/EdFi.Ods.AdminConsole.DBTests/TestOptionsMonitor.cs new file mode 100644 index 000000000..16c212799 --- /dev/null +++ b/Application/EdFi.Ods.AdminConsole.DBTests/TestOptionsMonitor.cs @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: Apache-2.0 +// Licensed to the Ed-Fi Alliance under one or more agreements. +// The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +// See the LICENSE and NOTICES files in the project root for more information. + +using System; +using EdFi.Ods.AdminApi.Common.Settings; +using Microsoft.Extensions.Options; + +namespace EdFi.Ods.AdminConsole.DBTests; + +internal class TestOptionsMonitor : IOptionsMonitor +{ + private readonly AppSettings _currentValue; + + public TestOptionsMonitor(AppSettings currentValue) + { + _currentValue = currentValue; + } + + public AppSettings CurrentValue => _currentValue; + + public AppSettings Get(string name) + => _currentValue; + + public IDisposable OnChange(Action listener) + => null; +} diff --git a/Application/EdFi.Ods.AdminConsole.DBTests/Testing.cs b/Application/EdFi.Ods.AdminConsole.DBTests/Testing.cs index 47c4f7e7a..2aece36e6 100644 --- a/Application/EdFi.Ods.AdminConsole.DBTests/Testing.cs +++ b/Application/EdFi.Ods.AdminConsole.DBTests/Testing.cs @@ -32,18 +32,18 @@ public static IConfiguration Configuration() public static DbContextOptions GetDbContextOptions(string connectionString) { var builder = new DbContextOptionsBuilder(); - builder.UseSqlServer(connectionString); + builder.UseSqlServer(connectionString); return builder.Options; } - public static IOptions GetAppSettings() + public static IOptionsMonitor GetAppSettings() { AppSettings appSettings = new() { - DatabaseEngine = DatabaseEngineEnum.PostgreSql.ToString(), + DatabaseEngine = DatabaseEngineEnum.PostgreSql.ToString(), IgnoresCertificateErrors = true }; - return Options.Create(appSettings); + return new TestOptionsMonitor(appSettings); } public static IOptionsSnapshot GetOptionsSnapshot() @@ -58,7 +58,7 @@ public static IOptionsSnapshot GetOptionsSnapshot() EncryptionKey = "TDMyNH0lJmo7aDRnNXYoSmAwSXQpV09nbitHSWJTKn0=", MultiTenancy = true, PreventDuplicateApplications = true, - EnableAdminConsoleAPI = true, + EnableAdminConsoleAPI = true, IgnoresCertificateErrors = true, }, SwaggerSettings = new SwaggerSettings(), @@ -93,10 +93,10 @@ public static IOptionsSnapshot GetOptionsSnapshot() EdFiApiDiscoveryUrl = "https://api.ed-fi.org/v7.2/api/" } } - }, - Testing = new TestingSettings - { - InjectException = false + }, + Testing = new TestingSettings + { + InjectException = false } }; @@ -105,22 +105,22 @@ public static IOptionsSnapshot GetOptionsSnapshot() return optionsSnapshot; } - public static IOptions GetAdminConsoleSettings() + public static IOptionsMonitor GetAdminConsoleSettings() { AdminConsoleSettings appSettings = new() { VendorCompany = "Ed-Fi Administrative Tools", ApplicationName = "Ed-Fi Health Check" }; - return Options.Create(appSettings); - } - + return new TestAdminConsoleOptionsMonitor(appSettings); + } + public static IOptionsMonitor GetTestingSettings(bool injectException = false) { TestingSettings testingSettings = new() { InjectException = injectException, - }; + }; var optionsMonitor = A.Fake>(); A.CallTo(() => optionsMonitor.CurrentValue).Returns(testingSettings); return optionsMonitor;