diff options
-rw-r--r-- | VNLib.Plugins.Extensions.Data/DbStore.cs | 70 | ||||
-rw-r--r-- | VNLib.Plugins.Extensions.Data/Extensions.cs | 1 | ||||
-rw-r--r-- | VNLib.Plugins.Extensions.Data/VNLib.Plugins.Extensions.Data.csproj | 2 | ||||
-rw-r--r-- | VNLib.Plugins.Extensions.Loading.Sql/SqlDbConnectionLoader.cs | 1 | ||||
-rw-r--r-- | VNLib.Plugins.Extensions.Loading.Sql/VNLib.Plugins.Extensions.Loading.Sql.csproj | 5 | ||||
-rw-r--r-- | VNLib.Plugins.Extensions.Loading.Users/VNLib.Plugins.Extensions.Loading.Users.csproj | 24 | ||||
-rw-r--r-- | VNLib.Plugins.Extensions.Loading/ConfigurationExtensions.cs | 2 | ||||
-rw-r--r-- | VNLib.Plugins.Extensions.Loading/LoadingExtensions.cs | 2 | ||||
-rw-r--r-- | VNLib.Plugins.Extensions.Loading/RoutingExtensions.cs | 9 | ||||
-rw-r--r-- | VNLib.Plugins.Extensions.Loading/S3Config.cs | 4 | ||||
-rw-r--r-- | VNLib.Plugins.Extensions.Loading/UserLoading.cs (renamed from VNLib.Plugins.Extensions.Loading.Users/UserLoading.cs) | 63 | ||||
-rw-r--r-- | VNLib.Plugins.Extensions.Loading/VaultSecrets.cs | 7 | ||||
-rw-r--r-- | VNLib.Plugins.Extensions.Validation/VNLib.Plugins.Extensions.Validation.csproj | 2 |
13 files changed, 73 insertions, 119 deletions
diff --git a/VNLib.Plugins.Extensions.Data/DbStore.cs b/VNLib.Plugins.Extensions.Data/DbStore.cs index 19ada7f..bb7cf56 100644 --- a/VNLib.Plugins.Extensions.Data/DbStore.cs +++ b/VNLib.Plugins.Extensions.Data/DbStore.cs @@ -266,44 +266,32 @@ namespace VNLib.Plugins.Extensions.Data ///<inheritdoc/> public virtual async Task<ERRNO> GetCollectionAsync(ICollection<T> collection, string specifier, int limit) { + int previous = collection.Count; //Open new db context await using TransactionalDbContext ctx = NewContext(); //Open transaction await ctx.OpenTransactionAsync(); //Get the single template by its id - IAsyncEnumerable<T> entires = GetCollectionQueryBuilder(ctx, specifier).Take(limit).AsAsyncEnumerable(); - int count = 0; - //Enumrate the template and add them to collection - await foreach (T entry in entires) - { - collection.Add(entry); - count++; - } + await GetCollectionQueryBuilder(ctx, specifier).Take(limit).Select(static e => e).ForEachAsync(collection.Add); //close db and transaction await ctx.CommitTransactionAsync(); //Return the number of elements add to the collection - return count; + return collection.Count - previous; } ///<inheritdoc/> public virtual async Task<ERRNO> GetCollectionAsync(ICollection<T> collection, int limit, params string[] args) { + int previous = collection.Count; //Open new db context await using TransactionalDbContext ctx = NewContext(); //Open transaction await ctx.OpenTransactionAsync(); //Get the single template by its id - IAsyncEnumerable<T> entires = GetCollectionQueryBuilder(ctx, args).Take(limit).AsAsyncEnumerable(); - int count = 0; - //Enumrate the template and add them to collection - await foreach (T entry in entires) - { - collection.Add(entry); - count++; - } + await GetCollectionQueryBuilder(ctx, args).Take(limit).Select(static e => e).ForEachAsync(collection.Add); //close db and transaction await ctx.CommitTransactionAsync(); //Return the number of elements add to the collection - return count; + return collection.Count - previous; } /// <summary> @@ -440,50 +428,44 @@ namespace VNLib.Plugins.Extensions.Data ///<inheritdoc/> public virtual async Task<int> GetPageAsync(ICollection<T> collection, int page, int limit) { + //Store preivous count + int previous = collection.Count; //Open db connection await using TransactionalDbContext ctx = NewContext(); //Open transaction await ctx.OpenTransactionAsync(); //Get a page offset and a limit for the - IAsyncEnumerable<T> records = ctx.Set<T>() - .Skip(page * limit) - .Take(limit) - .AsAsyncEnumerable(); - int count = 0; - //Enumrate the template and add them to collection - await foreach (T record in records) - { - collection.Add(record); - count++; - } + await ctx.Set<T>() + .Skip(page * limit) + .Take(limit) + .Select(static p => p) + .ForEachAsync(collection.Add); + //close db and transaction await ctx.CommitTransactionAsync(); - //Return the number of elements add to the collection - return count; + //Return the number of records added + return collection.Count - previous; } ///<inheritdoc/> public virtual async Task<int> GetPageAsync(ICollection<T> collection, int page, int limit, params string[] constraints) { + //Store preivous count + int previous = collection.Count; //Open new db context await using TransactionalDbContext ctx = NewContext(); //Open transaction await ctx.OpenTransactionAsync(); //Get the single template by its id - IAsyncEnumerable<T> entires = GetPageQueryBuilder(ctx, constraints) - .Skip(page * limit) - .Take(limit) - .AsAsyncEnumerable(); - int count = 0; - //Enumrate the template and add them to collection - await foreach (T entry in entires) - { - collection.Add(entry); - count++; - } + await GetPageQueryBuilder(ctx, constraints) + .Skip(page * limit) + .Take(limit) + .Select(static e => e) + .ForEachAsync(collection.Add); + //close db and transaction await ctx.CommitTransactionAsync(); - //Return the number of elements add to the collection - return count; + //Return the number of records added + return collection.Count - previous; } /// <summary> /// Builds a query to get a collection of records based on an variable length array of parameters diff --git a/VNLib.Plugins.Extensions.Data/Extensions.cs b/VNLib.Plugins.Extensions.Data/Extensions.cs index 3962a6d..5504d06 100644 --- a/VNLib.Plugins.Extensions.Data/Extensions.cs +++ b/VNLib.Plugins.Extensions.Data/Extensions.cs @@ -2,7 +2,6 @@ using System.Linq; using System.Threading.Tasks; using System.Collections.Generic; -using System.Collections.Immutable; using Microsoft.EntityFrameworkCore; diff --git a/VNLib.Plugins.Extensions.Data/VNLib.Plugins.Extensions.Data.csproj b/VNLib.Plugins.Extensions.Data/VNLib.Plugins.Extensions.Data.csproj index 2a87627..b008df4 100644 --- a/VNLib.Plugins.Extensions.Data/VNLib.Plugins.Extensions.Data.csproj +++ b/VNLib.Plugins.Extensions.Data/VNLib.Plugins.Extensions.Data.csproj @@ -31,7 +31,7 @@ <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> - <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.10" /> + <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.11" /> </ItemGroup> <ItemGroup> diff --git a/VNLib.Plugins.Extensions.Loading.Sql/SqlDbConnectionLoader.cs b/VNLib.Plugins.Extensions.Loading.Sql/SqlDbConnectionLoader.cs index f0898a0..4a02f7e 100644 --- a/VNLib.Plugins.Extensions.Loading.Sql/SqlDbConnectionLoader.cs +++ b/VNLib.Plugins.Extensions.Loading.Sql/SqlDbConnectionLoader.cs @@ -11,7 +11,6 @@ using Microsoft.EntityFrameworkCore; using VNLib.Utils.Logging; using VNLib.Utils.Extensions; -using VNLib.Plugins.Extensions.Loading.Configuration; namespace VNLib.Plugins.Extensions.Loading.Sql { diff --git a/VNLib.Plugins.Extensions.Loading.Sql/VNLib.Plugins.Extensions.Loading.Sql.csproj b/VNLib.Plugins.Extensions.Loading.Sql/VNLib.Plugins.Extensions.Loading.Sql.csproj index 5ce0146..9e551aa 100644 --- a/VNLib.Plugins.Extensions.Loading.Sql/VNLib.Plugins.Extensions.Loading.Sql.csproj +++ b/VNLib.Plugins.Extensions.Loading.Sql/VNLib.Plugins.Extensions.Loading.Sql.csproj @@ -14,8 +14,9 @@ </PropertyGroup> <ItemGroup> - <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.10" /> - <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.10" /> + <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="6.0.11" /> + <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.11" /> + <PackageReference Include="MySqlConnector" Version="2.2.0" /> <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="6.0.2" /> </ItemGroup> diff --git a/VNLib.Plugins.Extensions.Loading.Users/VNLib.Plugins.Extensions.Loading.Users.csproj b/VNLib.Plugins.Extensions.Loading.Users/VNLib.Plugins.Extensions.Loading.Users.csproj deleted file mode 100644 index f3e58c6..0000000 --- a/VNLib.Plugins.Extensions.Loading.Users/VNLib.Plugins.Extensions.Loading.Users.csproj +++ /dev/null @@ -1,24 +0,0 @@ -<Project Sdk="Microsoft.NET.Sdk"> - - <PropertyGroup> - <TargetFramework>net6.0</TargetFramework> - <ImplicitUsings>enable</ImplicitUsings> - <Nullable>enable</Nullable> - <PlatformTarget>x64</PlatformTarget> - <Version>1.0.0.1</Version> - <Authors>Vaughn Nugent</Authors> - <Copyright>Copyright © 2022 Vaughn Nugent</Copyright> - <PackageProjectUrl>https://www.vaughnnugent.com/resources</PackageProjectUrl> - <GenerateDocumentationFile>True</GenerateDocumentationFile> - <Platforms>AnyCPU;x64</Platforms> - </PropertyGroup> - - <ItemGroup> - <ProjectReference Include="..\..\..\VNLib\Essentials\VNLib.Plugins.Essentials.csproj" /> - <ProjectReference Include="..\..\Essentials\VNLib.Plugins.Essentials.Users\VNLib.Plugins.Essentials.Users.csproj" /> - <ProjectReference Include="..\..\PluginBase\VNLib.Plugins.PluginBase.csproj" /> - <ProjectReference Include="..\VNLib.Plugins.Extensions.Loading.Sql\VNLib.Plugins.Extensions.Loading.Sql.csproj" /> - <ProjectReference Include="..\VNLib.Plugins.Extensions.Loading\VNLib.Plugins.Extensions.Loading.csproj" /> - </ItemGroup> - -</Project> diff --git a/VNLib.Plugins.Extensions.Loading/ConfigurationExtensions.cs b/VNLib.Plugins.Extensions.Loading/ConfigurationExtensions.cs index 8d2ef8c..17e15e5 100644 --- a/VNLib.Plugins.Extensions.Loading/ConfigurationExtensions.cs +++ b/VNLib.Plugins.Extensions.Loading/ConfigurationExtensions.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using VNLib.Utils.Extensions; -namespace VNLib.Plugins.Extensions.Loading.Configuration +namespace VNLib.Plugins.Extensions.Loading { /// <summary> /// Specifies a configuration variable name in the plugin's configuration diff --git a/VNLib.Plugins.Extensions.Loading/LoadingExtensions.cs b/VNLib.Plugins.Extensions.Loading/LoadingExtensions.cs index 30691ef..9b62e82 100644 --- a/VNLib.Plugins.Extensions.Loading/LoadingExtensions.cs +++ b/VNLib.Plugins.Extensions.Loading/LoadingExtensions.cs @@ -9,8 +9,6 @@ using System.Runtime.CompilerServices; using VNLib.Utils; using VNLib.Utils.Extensions; using VNLib.Plugins.Essentials.Accounts; -using VNLib.Plugins.Extensions.Loading.Configuration; -using VNLib.Utils.Logging; namespace VNLib.Plugins.Extensions.Loading { diff --git a/VNLib.Plugins.Extensions.Loading/RoutingExtensions.cs b/VNLib.Plugins.Extensions.Loading/RoutingExtensions.cs index 3e539e3..bdbe03c 100644 --- a/VNLib.Plugins.Extensions.Loading/RoutingExtensions.cs +++ b/VNLib.Plugins.Extensions.Loading/RoutingExtensions.cs @@ -5,7 +5,6 @@ using System.Reflection; using System.Collections.Generic; using VNLib.Plugins.Extensions.Loading.Events; -using VNLib.Plugins.Extensions.Loading.Configuration; namespace VNLib.Plugins.Extensions.Loading.Routing { @@ -13,7 +12,7 @@ namespace VNLib.Plugins.Extensions.Loading.Routing /// Provides advanced QOL features to plugin loading /// </summary> public static class RoutingExtensions - { + { /// <summary> /// Constructs and routes the specific endpoint type for the current plugin /// </summary> @@ -41,7 +40,7 @@ namespace VNLib.Plugins.Extensions.Loading.Routing } else { - ConstructorInfo? constructor = endpointType.GetConstructor(new Type[] { typeof(PluginBase), typeof(Dictionary<string, JsonElement>) }); + ConstructorInfo? constructor = endpointType.GetConstructor(new Type[] { typeof(PluginBase), typeof(IReadOnlyDictionary<string, JsonElement>) }); //Make sure the constructor exists _ = constructor ?? throw new EntryPointNotFoundException($"No constructor found for {endpointType.Name}"); //Get config variables for the endpoint @@ -76,7 +75,7 @@ namespace VNLib.Plugins.Extensions.Loading.Routing return plugin.Route<T>(configAttr?.ConfigVarName); } - private static void ScheduleIntervals<T>(PluginBase plugin, T endpointInstance, Type epType, IReadOnlyDictionary<string, JsonElement>? endpointLocalConfig) where T: IEndpoint + private static void ScheduleIntervals<T>(PluginBase plugin, T endpointInstance, Type epType, IReadOnlyDictionary<string, JsonElement>? endpointLocalConfig) where T : IEndpoint { List<EventHandle> registered = new(); try @@ -124,7 +123,7 @@ namespace VNLib.Plugins.Extensions.Loading.Routing catch { //Stop all event handles - foreach(EventHandle evh in registered) + foreach (EventHandle evh in registered) { evh.Dispose(); } diff --git a/VNLib.Plugins.Extensions.Loading/S3Config.cs b/VNLib.Plugins.Extensions.Loading/S3Config.cs index 635f739..c8b77fc 100644 --- a/VNLib.Plugins.Extensions.Loading/S3Config.cs +++ b/VNLib.Plugins.Extensions.Loading/S3Config.cs @@ -1,11 +1,11 @@ #nullable enable -namespace VNLib.Plugins.Extensions.Loading.Configuration +namespace VNLib.Plugins.Extensions.Loading { public sealed class S3Config { public string? ServerAddress { get; init; } - public string? ClientId { get; init; } + public string? ClientId { get; init; } public string? ClientSecret { get; init; } public string? BaseBucket { get; init; } public bool? UseSsl { get; init; } diff --git a/VNLib.Plugins.Extensions.Loading.Users/UserLoading.cs b/VNLib.Plugins.Extensions.Loading/UserLoading.cs index 40e0b03..ae55094 100644 --- a/VNLib.Plugins.Extensions.Loading.Users/UserLoading.cs +++ b/VNLib.Plugins.Extensions.Loading/UserLoading.cs @@ -1,11 +1,12 @@ -using System.Text.Json; +using System; +using System.Linq; +using System.Threading; +using System.Collections.Generic; using System.Runtime.CompilerServices; using VNLib.Utils.Logging; using VNLib.Utils.Extensions; - using VNLib.Plugins.Essentials.Users; -using VNLib.Plugins.Extensions.Loading.Sql; namespace VNLib.Plugins.Extensions.Loading.Users { @@ -14,8 +15,9 @@ namespace VNLib.Plugins.Extensions.Loading.Users /// </summary> public static class UserLoading { - public const string USER_TABLE_KEY = "user_table"; - public const string USER_CUSTOM_ASSEMBLY = "user_custom_asm"; + public const string USER_CUSTOM_ASSEMBLY = "user_custom_asm"; + public const string DEFAULT_USER_ASM = "VNLib.Plugins.Essentials.Users.dll"; + public const string ONLOAD_METHOD_NAME = "OnPluginLoading"; private static readonly ConditionalWeakTable<PluginBase, Lazy<IUserManager>> UsersTable = new(); @@ -39,43 +41,42 @@ namespace VNLib.Plugins.Extensions.Loading.Users //lazy callack IUserManager LoadManager() { - IUserManager man; - //Try to load a custom user assembly for exporting IUserManager string? customAsm = pbase.PluginConfig.GetPropString(USER_CUSTOM_ASSEMBLY); //See if host config defined the path customAsm ??= pbase.HostConfig.GetPropString(USER_CUSTOM_ASSEMBLY); + //Finally default + customAsm ??= DEFAULT_USER_ASM; - if (!string.IsNullOrWhiteSpace(customAsm)) + //Try to load a custom assembly + AssemblyLoader<IUserManager> loader = pbase.LoadAssembly<IUserManager>(customAsm); + try { - //Try to load a custom assembly - AssemblyLoader<IUserManager> loader = pbase.LoadAssembly<IUserManager>(customAsm); - try - { - //Return the loaded instance (may raise exception) - man = loader.Resource; - } - catch + //Get the runtime type + Type runtimeType = loader.Resource.GetType(); + + //Get the onplugin load method + Action<object>? onLoadMethod = runtimeType.GetMethods() + .Where(static p => p.IsPublic && !p.IsAbstract && ONLOAD_METHOD_NAME.Equals(p.Name)) + .Select(p => p.CreateDelegate<Action<object>>(loader.Resource)) + .FirstOrDefault(); + + //Call the onplugin load method + onLoadMethod?.Invoke(pbase); + + if (pbase.IsDebug()) { - loader.Dispose(); - throw; + pbase.Log.Verbose("Loading user manager from assembly {name}", runtimeType.AssemblyQualifiedName); } - pbase.Log.Verbose("Loaded custom user managment assembly"); + + //Return the loaded instance (may raise exception) + return loader.Resource; } - else + catch { - //Default table name to - string? userTableName = "Users"; - //Try to get the user-table element from plugin config - if (pbase.PluginConfig.TryGetProperty(USER_TABLE_KEY, out JsonElement userEl)) - { - userTableName = userEl.GetString(); - } - _ = userTableName ?? throw new KeyNotFoundException($"Missing required key '{USER_TABLE_KEY}' in config"); - //Load user-manager - man = new UserManager(pbase.GetConnectionFactory(), userTableName); + loader.Dispose(); + throw; } - return man; } return new Lazy<IUserManager>(LoadManager, LazyThreadSafetyMode.PublicationOnly); } diff --git a/VNLib.Plugins.Extensions.Loading/VaultSecrets.cs b/VNLib.Plugins.Extensions.Loading/VaultSecrets.cs index 3a35a8e..d920740 100644 --- a/VNLib.Plugins.Extensions.Loading/VaultSecrets.cs +++ b/VNLib.Plugins.Extensions.Loading/VaultSecrets.cs @@ -1,23 +1,22 @@ using System; using System.Linq; +using System.Text; using System.Text.Json; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using System.Runtime.CompilerServices; +using System.Security.Cryptography.X509Certificates; using VaultSharp; using VaultSharp.V1.Commons; using VaultSharp.V1.AuthMethods; using VaultSharp.V1.AuthMethods.Token; using VaultSharp.V1.AuthMethods.AppRole; +using VaultSharp.V1.SecretsEngines.PKI; using VNLib.Utils.Logging; using VNLib.Utils.Extensions; -using VNLib.Plugins.Extensions.Loading.Configuration; -using System.Security.Cryptography.X509Certificates; -using VaultSharp.V1.SecretsEngines.PKI; -using System.Text; namespace VNLib.Plugins.Extensions.Loading { diff --git a/VNLib.Plugins.Extensions.Validation/VNLib.Plugins.Extensions.Validation.csproj b/VNLib.Plugins.Extensions.Validation/VNLib.Plugins.Extensions.Validation.csproj index 4ffeb9d..a1d3e83 100644 --- a/VNLib.Plugins.Extensions.Validation/VNLib.Plugins.Extensions.Validation.csproj +++ b/VNLib.Plugins.Extensions.Validation/VNLib.Plugins.Extensions.Validation.csproj @@ -23,7 +23,7 @@ <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> - <PackageReference Include="FluentValidation" Version="11.2.2" /> + <PackageReference Include="FluentValidation" Version="11.3.0" /> </ItemGroup> <ItemGroup> |