From b7b88bc2583c9d9fea9d68a75aca256c0e97a5e7 Mon Sep 17 00:00:00 2001 From: Mathias Beaulieu-Duncan Date: Sun, 22 Dec 2024 11:59:19 -0500 Subject: [PATCH] added icon and readmy for nugets, added gitea pipeline, added AoT compatible for all projects that are not AspNetCore specific --- .DS_Store | Bin 0 -> 6148 bytes .gitea/workflows/publish-nugets.yaml | 0 .../OpenHarbor.CQRS.Abstractions.csproj | 16 +++++++++-- .../ServiceCollectionExtensions.cs | 9 ++++--- ...Harbor.CQRS.AspNetCore.Abstractions.csproj | 18 ++++++++++--- .../Mvc/QueryControllerFeatureProvider.cs | 22 ++++++--------- .../OpenHarbor.CQRS.AspNetCore.csproj | 19 +++++++++++-- ...rbor.CQRS.DynamicQuery.Abstractions.csproj | 17 +++++++++--- ...Harbor.CQRS.DynamicQuery.AspNetCore.csproj | 15 ++++++++--- .../OpenHarbor.CQRS.DynamicQuery.csproj | 17 +++++++++--- .../ServiceCollectionExtensions.cs | 25 +++++++++--------- .../OpenHarbor.CQRS.FluentValidation.csproj | 17 +++++++++--- .../ServiceCollectionExtensions.cs | 12 +++++---- OpenHarbor.CQRS/.DS_Store | Bin 0 -> 6148 bytes OpenHarbor.CQRS/OpenHarbor.CQRS.csproj | 16 +++++++++-- icon.png | Bin 0 -> 5966 bytes 16 files changed, 147 insertions(+), 56 deletions(-) create mode 100644 .DS_Store create mode 100644 .gitea/workflows/publish-nugets.yaml create mode 100644 OpenHarbor.CQRS/.DS_Store create mode 100644 icon.png diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c02464cefbebb4ca26a4c4d153f42ce214ea1dfd GIT binary patch literal 6148 zcmeH~%}N6?5XUENwOfkVgM!`yUW>L?#o}dYD|i#Tq6d|_ON%b9o6-+^D22W23;7~G zk26UsmMR_u!7>ArUpARZ$bXk)0|25nY?lEF0N|h#Q#mZYFzP3tvy^Qi3O&XN_|Ss@ z6qaoNK>>Pqt8fZk=s*mg-`_UW;S8GK1*3j9h*W@)uR%8o`-4*HO{CJ9rRA)Xb@I-Q zcdtg?z#k0zHNSU7Pv=TS!L;rN7hz}ADy-F2Jn+M~)6)rIyMrOumtoviqnaAV?Y_?S zOox+ma;?JVcw8=3sztefcrYo-ado#;lzWwf$t35jZ|xj4TMyA=te%b50zX4-E0$Bd zVC9EpK6$-3Qt=%|PDhz$Gg$#vfE8FU1?)EGa7C{ z`hBGS43P}$beAAXOV=_n#2z$ZQjsQA*eixG>DVr9oNJjFnsg9)W*o=PEbI+M=-IJd z>TnRQA(yNGD=@1-+B_EM{6GHw{y&? - netstandard2.1 - https://avatars.githubusercontent.com/u/52874619?v=4 + net8.0 + true David Lebee, Mathias Beaulieu-Duncan default + Open Harbor + icon.png + README.md + https://git.openharbor.io/Open-Harbor/dotnet-cqrs + git + true + MIT + + + + + diff --git a/OpenHarbor.CQRS.Abstractions/ServiceCollectionExtensions.cs b/OpenHarbor.CQRS.Abstractions/ServiceCollectionExtensions.cs index df2bd5f..efc4fec 100644 --- a/OpenHarbor.CQRS.Abstractions/ServiceCollectionExtensions.cs +++ b/OpenHarbor.CQRS.Abstractions/ServiceCollectionExtensions.cs @@ -1,11 +1,12 @@ -using Microsoft.Extensions.DependencyInjection; +using System.Diagnostics.CodeAnalysis; +using Microsoft.Extensions.DependencyInjection; using OpenHarbor.CQRS.Abstractions.Discovery; namespace OpenHarbor.CQRS.Abstractions; public static class ServiceCollectionExtensions { - public static IServiceCollection AddQuery(this IServiceCollection services) + public static IServiceCollection AddQuery(this IServiceCollection services) where TQuery : class where TQueryHandler : class, IQueryHandler { @@ -19,7 +20,7 @@ public static class ServiceCollectionExtensions return services; } - public static IServiceCollection AddCommand(this IServiceCollection services) + public static IServiceCollection AddCommand(this IServiceCollection services) where TCommand : class where TCommandHandler : class, ICommandHandler { @@ -33,7 +34,7 @@ public static class ServiceCollectionExtensions return services; } - public static IServiceCollection AddCommand(this IServiceCollection services) + public static IServiceCollection AddCommand(this IServiceCollection services) where TCommand : class where TCommandHandler : class, ICommandHandler { diff --git a/OpenHarbor.CQRS.AspNetCore.Abstractions/OpenHarbor.CQRS.AspNetCore.Abstractions.csproj b/OpenHarbor.CQRS.AspNetCore.Abstractions/OpenHarbor.CQRS.AspNetCore.Abstractions.csproj index dabc93e..72b45cf 100644 --- a/OpenHarbor.CQRS.AspNetCore.Abstractions/OpenHarbor.CQRS.AspNetCore.Abstractions.csproj +++ b/OpenHarbor.CQRS.AspNetCore.Abstractions/OpenHarbor.CQRS.AspNetCore.Abstractions.csproj @@ -1,8 +1,20 @@ - netstandard2.1 - https://avatars.githubusercontent.com/u/52874619?v=4 - David Lebee, Mathias Beaulieu-Duncan + net8.0 + true + false default + Open Harbor + icon.png + README.md + https://git.openharbor.io/Open-Harbor/dotnet-cqrs + git + true + MIT + + + + + diff --git a/OpenHarbor.CQRS.AspNetCore/Mvc/QueryControllerFeatureProvider.cs b/OpenHarbor.CQRS.AspNetCore/Mvc/QueryControllerFeatureProvider.cs index de73095..60d7af0 100644 --- a/OpenHarbor.CQRS.AspNetCore/Mvc/QueryControllerFeatureProvider.cs +++ b/OpenHarbor.CQRS.AspNetCore/Mvc/QueryControllerFeatureProvider.cs @@ -8,28 +8,22 @@ using OpenHarbor.CQRS.AspNetCore.Abstractions.Attributes; namespace OpenHarbor.CQRS.AspNetCore.Mvc; -public class QueryControllerFeatureProvider : IApplicationFeatureProvider +public class QueryControllerFeatureProvider(ServiceProvider serviceProvider) + : IApplicationFeatureProvider { - private readonly ServiceProvider _serviceProvider; - - public QueryControllerFeatureProvider(ServiceProvider serviceProvider) + public void PopulateFeature(IEnumerable parts, ControllerFeature feature) { - _serviceProvider = serviceProvider; - } - - public void PopulateFeature(IEnumerable parts, ControllerFeature feature) - { - var queryDiscovery = this._serviceProvider.GetRequiredService(); - foreach (var f in queryDiscovery.GetQueries()) + var queryDiscovery = serviceProvider.GetRequiredService(); + foreach (var queryMeta in queryDiscovery.GetQueries()) { - var ignoreAttribute = f.QueryType.GetCustomAttribute(); + var ignoreAttribute = queryMeta.QueryType.GetCustomAttribute(); if (ignoreAttribute != null) continue; - if (f.Category != "BasicQuery") + if (queryMeta.Category != "BasicQuery") continue; - var controllerType = typeof(QueryController<,>).MakeGenericType(f.QueryType, f.QueryResultType); + var controllerType = typeof(QueryController<,>).MakeGenericType(queryMeta.QueryType, queryMeta.QueryResultType); var controllerTypeInfo = controllerType.GetTypeInfo(); feature.Controllers.Add(controllerTypeInfo); } diff --git a/OpenHarbor.CQRS.AspNetCore/OpenHarbor.CQRS.AspNetCore.csproj b/OpenHarbor.CQRS.AspNetCore/OpenHarbor.CQRS.AspNetCore.csproj index 07fd196..b7d588c 100644 --- a/OpenHarbor.CQRS.AspNetCore/OpenHarbor.CQRS.AspNetCore.csproj +++ b/OpenHarbor.CQRS.AspNetCore/OpenHarbor.CQRS.AspNetCore.csproj @@ -2,11 +2,22 @@ net8.0 - https://avatars.githubusercontent.com/u/52874619?v=4 + false David Lebee, Mathias Beaulieu-Duncan - true + Open Harbor + icon.png + README.md + https://git.openharbor.io/Open-Harbor/dotnet-cqrs + git + true + MIT + + + + + @@ -16,4 +27,8 @@ + + + + diff --git a/OpenHarbor.CQRS.DynamicQuery.Abstractions/OpenHarbor.CQRS.DynamicQuery.Abstractions.csproj b/OpenHarbor.CQRS.DynamicQuery.Abstractions/OpenHarbor.CQRS.DynamicQuery.Abstractions.csproj index bf65d87..f055a35 100644 --- a/OpenHarbor.CQRS.DynamicQuery.Abstractions/OpenHarbor.CQRS.DynamicQuery.Abstractions.csproj +++ b/OpenHarbor.CQRS.DynamicQuery.Abstractions/OpenHarbor.CQRS.DynamicQuery.Abstractions.csproj @@ -1,12 +1,23 @@  - netstandard2.1 + netstandard2.1;net8.0 + true enable - https://avatars.githubusercontent.com/u/52874619?v=4 - David Lebee, Mathias Beaulieu-Duncan default + Open Harbor + icon.png + README.md + https://git.openharbor.io/Open-Harbor/dotnet-cqrs + git + true + MIT + + + + + diff --git a/OpenHarbor.CQRS.DynamicQuery.AspNetCore/OpenHarbor.CQRS.DynamicQuery.AspNetCore.csproj b/OpenHarbor.CQRS.DynamicQuery.AspNetCore/OpenHarbor.CQRS.DynamicQuery.AspNetCore.csproj index 6b2d249..f1ebc5b 100644 --- a/OpenHarbor.CQRS.DynamicQuery.AspNetCore/OpenHarbor.CQRS.DynamicQuery.AspNetCore.csproj +++ b/OpenHarbor.CQRS.DynamicQuery.AspNetCore/OpenHarbor.CQRS.DynamicQuery.AspNetCore.csproj @@ -1,12 +1,21 @@ net8.0 - https://www.gravatar.com/avatar/9cecda5822fc5d4d2e61ec03da571b3d - David Lebee, Mathias Beaulieu-Duncan + false Open Harbor - true + icon.png + README.md + https://git.openharbor.io/Open-Harbor/dotnet-cqrs + git + true + MIT + + + + + diff --git a/OpenHarbor.CQRS.DynamicQuery/OpenHarbor.CQRS.DynamicQuery.csproj b/OpenHarbor.CQRS.DynamicQuery/OpenHarbor.CQRS.DynamicQuery.csproj index 19fe117..c5b47cd 100644 --- a/OpenHarbor.CQRS.DynamicQuery/OpenHarbor.CQRS.DynamicQuery.csproj +++ b/OpenHarbor.CQRS.DynamicQuery/OpenHarbor.CQRS.DynamicQuery.csproj @@ -1,11 +1,22 @@  - netstandard2.1 - https://avatars.githubusercontent.com/u/52874619?v=4 - David Lebee, Mathias Beaulieu-Duncan + net8.0 + true default + Open Harbor + icon.png + README.md + https://git.openharbor.io/Open-Harbor/dotnet-cqrs + git + true + MIT + + + + + diff --git a/OpenHarbor.CQRS.DynamicQuery/ServiceCollectionExtensions.cs b/OpenHarbor.CQRS.DynamicQuery/ServiceCollectionExtensions.cs index f97f2c4..df38e41 100644 --- a/OpenHarbor.CQRS.DynamicQuery/ServiceCollectionExtensions.cs +++ b/OpenHarbor.CQRS.DynamicQuery/ServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; +using System.Diagnostics.CodeAnalysis; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using OpenHarbor.CQRS.Abstractions; using OpenHarbor.CQRS.Abstractions.Discovery; @@ -35,7 +36,7 @@ public static class ServiceCollectionExtensions return services; } - public static IServiceCollection AddDynamicQueryWithProvider(this IServiceCollection services, string name = null) + public static IServiceCollection AddDynamicQueryWithProvider(this IServiceCollection services, string name = null) where TQueryableProvider : class, IQueryableProvider where TSource : class { @@ -44,7 +45,7 @@ public static class ServiceCollectionExtensions return services; } - public static IServiceCollection AddDynamicQueryWithParamsAndProvider(this IServiceCollection services, string name = null) + public static IServiceCollection AddDynamicQueryWithParamsAndProvider(this IServiceCollection services, string name = null) where TQueryableProvider : class, IQueryableProvider where TParams : class where TSource : class @@ -84,19 +85,19 @@ public static class ServiceCollectionExtensions return services; } - public static IServiceCollection AddAlterQueryable(this IServiceCollection services) + public static IServiceCollection AddAlterQueryable(this IServiceCollection services) where TService : class, IAlterQueryableService { return services.AddTransient, TService>(); } - public static IServiceCollection AddAlterQueryable(this IServiceCollection services) + public static IServiceCollection AddAlterQueryable(this IServiceCollection services) where TService : class, IAlterQueryableService { return services.AddTransient, TService>(); } - public static IServiceCollection AddAlterQueryableWithParams + public static IServiceCollection AddAlterQueryableWithParams (this IServiceCollection services) where TParams : class where TService : class, IAlterQueryableService @@ -104,7 +105,7 @@ public static class ServiceCollectionExtensions return services.AddTransient, TService>(); } - public static IServiceCollection AddAlterQueryableWithParams + public static IServiceCollection AddAlterQueryableWithParams (this IServiceCollection services) where TParams : class where TService : class, IAlterQueryableService @@ -112,7 +113,7 @@ public static class ServiceCollectionExtensions return services.AddTransient, TService>(); } - public static IServiceCollection AddDynamicQueryInterceptor(this IServiceCollection services) + public static IServiceCollection AddDynamicQueryInterceptor(this IServiceCollection services) where TInterceptor : class, IQueryInterceptor { services.TryAddTransient(); @@ -120,7 +121,7 @@ public static class ServiceCollectionExtensions new DynamicQueryInterceptorProvider(typeof(TInterceptor))); } - public static IServiceCollection AddDynamicQueryInterceptors(this IServiceCollection services) + public static IServiceCollection AddDynamicQueryInterceptors(this IServiceCollection services) where T1 : class, IQueryInterceptor where T2 : class, IQueryInterceptor { @@ -130,7 +131,7 @@ public static class ServiceCollectionExtensions new DynamicQueryInterceptorProvider(typeof(T1), typeof(T2))); } - public static IServiceCollection AddDynamicQueryInterceptors(this IServiceCollection services) + public static IServiceCollection AddDynamicQueryInterceptors(this IServiceCollection services) where T1 : class, IQueryInterceptor where T2 : class, IQueryInterceptor where T3 : class, IQueryInterceptor @@ -142,7 +143,7 @@ public static class ServiceCollectionExtensions new DynamicQueryInterceptorProvider(typeof(T1), typeof(T2), typeof(T3))); } - public static IServiceCollection AddDynamicQueryInterceptors(this IServiceCollection services) + public static IServiceCollection AddDynamicQueryInterceptors(this IServiceCollection services) where T1 : class, IQueryInterceptor where T2 : class, IQueryInterceptor where T3 : class, IQueryInterceptor @@ -156,7 +157,7 @@ public static class ServiceCollectionExtensions new DynamicQueryInterceptorProvider(typeof(T1), typeof(T2), typeof(T3), typeof(T4))); } - public static IServiceCollection AddDynamicQueryInterceptors(this IServiceCollection services) + public static IServiceCollection AddDynamicQueryInterceptors(this IServiceCollection services) where T1 : class, IQueryInterceptor where T2 : class, IQueryInterceptor where T3 : class, IQueryInterceptor diff --git a/OpenHarbor.CQRS.FluentValidation/OpenHarbor.CQRS.FluentValidation.csproj b/OpenHarbor.CQRS.FluentValidation/OpenHarbor.CQRS.FluentValidation.csproj index 9109223..8a1a976 100644 --- a/OpenHarbor.CQRS.FluentValidation/OpenHarbor.CQRS.FluentValidation.csproj +++ b/OpenHarbor.CQRS.FluentValidation/OpenHarbor.CQRS.FluentValidation.csproj @@ -1,11 +1,22 @@ - netstandard2.1 - https://avatars.githubusercontent.com/u/52874619?v=4 - David Lebee, Mathias Beaulieu-Duncan + net8.0 + true default + Open Harbor + icon.png + README.md + https://git.openharbor.io/Open-Harbor/dotnet-cqrs + git + true + MIT + + + + + diff --git a/OpenHarbor.CQRS.FluentValidation/ServiceCollectionExtensions.cs b/OpenHarbor.CQRS.FluentValidation/ServiceCollectionExtensions.cs index 2058d59..a2e1d5d 100644 --- a/OpenHarbor.CQRS.FluentValidation/ServiceCollectionExtensions.cs +++ b/OpenHarbor.CQRS.FluentValidation/ServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ -using FluentValidation; +using System.Diagnostics.CodeAnalysis; +using FluentValidation; using Microsoft.Extensions.DependencyInjection; using OpenHarbor.CQRS.Abstractions; @@ -6,14 +7,14 @@ namespace OpenHarbor.CQRS.FluentValidation; public static class ServiceCollectionExtensions { - private static IServiceCollection AddFluentValidator(this IServiceCollection services) + private static IServiceCollection AddFluentValidator(this IServiceCollection services) where TValidator : class, IValidator { services.AddTransient, TValidator>(); return services; } - public static IServiceCollection AddCommand(this IServiceCollection services) + public static IServiceCollection AddCommand(this IServiceCollection services) where TCommand : class where TCommandHandler : class, ICommandHandler where TValidator : class, IValidator @@ -22,7 +23,7 @@ public static class ServiceCollectionExtensions .AddFluentValidator(); } - public static IServiceCollection AddCommand(this IServiceCollection services) + public static IServiceCollection AddCommand(this IServiceCollection services) where TCommand : class where TCommandHandler : class, ICommandHandler where TValidator : class, IValidator @@ -31,13 +32,14 @@ public static class ServiceCollectionExtensions .AddFluentValidator(); } - public static IServiceCollection AddQuery(this IServiceCollection services) + public static IServiceCollection AddQuery(this IServiceCollection services) where TQuery : class where TQueryHandler : class, IQueryHandler where TValidator : class, IValidator { services.AddQuery() .AddFluentValidator(); + return services; } } \ No newline at end of file diff --git a/OpenHarbor.CQRS/.DS_Store b/OpenHarbor.CQRS/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..cbb698820b56fad98f8800771c2ec601fb83f6d6 GIT binary patch literal 6148 zcmeHK%}T>S5Z<-brW7Fu1-&hJEtpy@7B3;z7cim+m70*E!I&*gY7V84yS|Vw;`2DO zy8(+ii`W_1{pNQ!`$6`HF~+@l)MLzMj9JhSIVv@R?%L3XNk-&2Mm7x-8G`i@PEG8u z1Acphg)C-iSbYEfB+hcj`Q#go=H^z*YFQoY-hYyXp9lFo^McteT31pgVWkJ*bv!A? z_RhIX^B_(qGgS~r6G*wciPK0Ho}8yqrfPj1u-aC8Z0|1?J*PkHij&j9vMUzDBd05l z`-A1OZS5W$o?VWglb2M!X+Am7tz_F^1@EAk<-Gc{G?D2ec&h9wi;x%~28aP-V67Q2 z$AZ;aYZhqn!~ii+#{ljR0ve)gu+*rw4(RaujPWKS3h4NjKokaDgQZ4@fN)(3s7twd zVsKp!eqr)lgQZ4Y&bXQx#xXNjj~A|H2ftA1jJq1CCkBXtRR$W`wDJ7EfM2Hek-u6( z7BN5!{4)l4bL5XaSd=+ie=HBrS^@0=8Vcr>sDOaJatQzf_mMpn)Nz42 - netstandard2.1 - https://avatars.githubusercontent.com/u/52874619?v=4 + net8.0 + true David Lebee, Mathias Beaulieu-Duncan default + Open Harbor + icon.png + README.md + https://git.openharbor.io/Open-Harbor/dotnet-cqrs + git + true + MIT + + + + + diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a8f02f01f3962c33e4020854a9203fe2667e7e13 GIT binary patch literal 5966 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