From 8e9b0872d6e58e5eb6e7e092dba779165bbafa8f Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Sat, 8 Jan 2022 00:24:04 +0100 Subject: [PATCH] gonna do some fixes for routing and other stuff --- zero.Api/ZeroBuilderExtensions.cs | 25 +--------- .../ServiceCollectionExtensions.cs | 21 +------- .../Plugins/ZeroPluginInitializer.cs | 48 ------------------- zero.Core/Media/MediaCreator.cs | 11 ++--- .../{Entities => Models}/IRouteModel.cs | 2 +- .../Routing/{Entities => Models}/Link.cs | 0 .../{Entities => Models}/LinkPreview.cs | 0 .../{Entities => Models}/LinkTarget.cs | 0 .../Routing/{Entities => Models}/Route.cs | 0 .../{Entities => Models}/RouteEndpoint.cs | 0 .../{Entities => Models}/RouteRedirect.cs | 0 .../{Entities => Models}/RouteResponse.cs | 0 .../{Entities => Models}/RoutingContext.cs | 0 zero.Core/ZeroApplicationBuilder.cs | 24 ++++------ zero.Core/ZeroBuilder.cs | 20 ++++---- zero.Core/zero.Core.csproj | 2 +- zero.Web/ViewHelpers/ZeroMediaHelper.cs | 41 ++++++++++++++-- zero.Web/ZeroPageModel.cs | 30 ++++++++++++ 18 files changed, 93 insertions(+), 131 deletions(-) delete mode 100644 zero.Core/Architecture/Plugins/ZeroPluginInitializer.cs rename zero.Core/Routing/{Entities => Models}/IRouteModel.cs (98%) rename zero.Core/Routing/{Entities => Models}/Link.cs (100%) rename zero.Core/Routing/{Entities => Models}/LinkPreview.cs (100%) rename zero.Core/Routing/{Entities => Models}/LinkTarget.cs (100%) rename zero.Core/Routing/{Entities => Models}/Route.cs (100%) rename zero.Core/Routing/{Entities => Models}/RouteEndpoint.cs (100%) rename zero.Core/Routing/{Entities => Models}/RouteRedirect.cs (100%) rename zero.Core/Routing/{Entities => Models}/RouteResponse.cs (100%) rename zero.Core/Routing/{Entities => Models}/RoutingContext.cs (100%) create mode 100644 zero.Web/ZeroPageModel.cs diff --git a/zero.Api/ZeroBuilderExtensions.cs b/zero.Api/ZeroBuilderExtensions.cs index fb8819f4..ab078eb6 100644 --- a/zero.Api/ZeroBuilderExtensions.cs +++ b/zero.Api/ZeroBuilderExtensions.cs @@ -1,30 +1,9 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace zero.Api; +namespace zero.Api; public static class ZeroBuilderExtensions { - public static ZeroBuilder AddApi(this ZeroBuilder builder) where T : ZeroApiPlugin, IZeroPlugin, new() - { - return builder.AddApi(_ => { }); - } - public static ZeroBuilder AddApi(this ZeroBuilder builder) { - return builder.AddApi(); - } - - public static ZeroBuilder AddApi(this ZeroBuilder builder, Action options) where T : ZeroApiPlugin, IZeroPlugin, new() - { - return builder.AddPlugin(services => - { - T plugin = new(); - plugin.PostConfigureServices = (services, configuration) => - { - services.Configure(opts => options(opts)); - }; - - return plugin; - }); + return builder.AddPlugin(); } } \ No newline at end of file diff --git a/zero.Backoffice/ServiceCollectionExtensions.cs b/zero.Backoffice/ServiceCollectionExtensions.cs index ec0089f5..4985b668 100644 --- a/zero.Backoffice/ServiceCollectionExtensions.cs +++ b/zero.Backoffice/ServiceCollectionExtensions.cs @@ -4,27 +4,8 @@ namespace zero.Backoffice; public static class ServiceCollectionExtensions { - public static ZeroBuilder AddBackoffice(this ZeroBuilder builder) where T : ZeroBackofficePlugin, IZeroPlugin, new() - { - return builder.AddBackoffice(_ => { }); - } - public static ZeroBuilder AddBackoffice(this ZeroBuilder builder) { - return builder.AddBackoffice(); - } - - public static ZeroBuilder AddBackoffice(this ZeroBuilder builder, Action options) where T : ZeroBackofficePlugin, IZeroPlugin, new() - { - return builder.AddPlugin(services => - { - T plugin = new(); - plugin.PostConfigureServices = (services, configuration) => - { - services.Configure(opts => options(opts)); - }; - - return plugin; - }); + return builder.AddPlugin(); } } \ No newline at end of file diff --git a/zero.Core/Architecture/Plugins/ZeroPluginInitializer.cs b/zero.Core/Architecture/Plugins/ZeroPluginInitializer.cs deleted file mode 100644 index 2ac4332e..00000000 --- a/zero.Core/Architecture/Plugins/ZeroPluginInitializer.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; - -namespace zero.Architecture; - -internal class ZeroPluginInitializer -{ - /// - /// Adds a zero plugin - /// - public static void AddPlugin(IServiceCollection services, IConfiguration configuration) where T : class, IZeroPlugin, new() - { - AssemblyDiscovery.Current.AddAssembly(typeof(T).Assembly); - services.AddSingleton(); - AddPluginServices(services, configuration); - } - - - /// - /// Adds a zero plugin - /// - public static void AddPlugin(IServiceCollection services, IConfiguration configuration, Func implementationFactory) where T : class, IZeroPlugin, new() - { - AssemblyDiscovery.Current.AddAssembly(typeof(T).Assembly); - services.AddSingleton(implementationFactory); - AddPluginServices(services, configuration); - } - - - /// - /// Creates a temporary instance of the plugin to add additional services - /// - /// - static void AddPluginServices(IServiceCollection services, IConfiguration configuration) where T : class, IZeroPlugin, new() - { - try - { - T plugin = new(); - - plugin.ConfigureServices(services, configuration); - //services.Configure(opts => plugin.Configure(opts)); - } - catch - { - throw new Exception($"Plugin \"{nameof(T)}\" needs an additional parameterless constructor as ConfigureServices() is called before the DI container is built"); - } - } -} \ No newline at end of file diff --git a/zero.Core/Media/MediaCreator.cs b/zero.Core/Media/MediaCreator.cs index aae521aa..f6166214 100644 --- a/zero.Core/Media/MediaCreator.cs +++ b/zero.Core/Media/MediaCreator.cs @@ -1,6 +1,6 @@ using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.Formats.Png; -using SixLabors.ImageSharp.Formats.Webp; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using System.IO; @@ -63,7 +63,7 @@ public class MediaCreator : IMediaCreator if (isImage) { - using Image image = await Image.LoadAsync(fileInfo.AbsolutePath, cancellationToken); + using Image image = await Image.LoadAsync(fileInfo.AbsolutePath); model.ImageMeta = GetImageMetadata(image); string extension = Path.GetExtension(model.Path); @@ -74,15 +74,14 @@ public class MediaCreator : IMediaCreator imageFrame.Mutate(x => x.Resize(opts)); using MemoryStream stream = new(); - await imageFrame.SaveAsync(stream, new WebpEncoder() + await imageFrame.SaveAsync(stream, new JpegEncoder() { - FilterStrength = 30, - Quality = 50 + Quality = 80 }, cancellationToken); stream.Position = 0; - string thumbFilename = normalizedFilename.TrimEnd(extension) + "." + Safenames.File(key) + ".webp"; + string thumbFilename = normalizedFilename.TrimEnd(extension) + "." + Safenames.File(key) + ".jpg"; string path = directory + '/' + thumbFilename; await FileSystem.CreateFile(path, stream, cancellationToken: cancellationToken); diff --git a/zero.Core/Routing/Entities/IRouteModel.cs b/zero.Core/Routing/Models/IRouteModel.cs similarity index 98% rename from zero.Core/Routing/Entities/IRouteModel.cs rename to zero.Core/Routing/Models/IRouteModel.cs index 4f6bf6f6..e190d3c6 100644 --- a/zero.Core/Routing/Entities/IRouteModel.cs +++ b/zero.Core/Routing/Models/IRouteModel.cs @@ -8,4 +8,4 @@ public interface IRouteModel public class RouteModel : IRouteModel { public Route Route { get; set; } -} +} \ No newline at end of file diff --git a/zero.Core/Routing/Entities/Link.cs b/zero.Core/Routing/Models/Link.cs similarity index 100% rename from zero.Core/Routing/Entities/Link.cs rename to zero.Core/Routing/Models/Link.cs diff --git a/zero.Core/Routing/Entities/LinkPreview.cs b/zero.Core/Routing/Models/LinkPreview.cs similarity index 100% rename from zero.Core/Routing/Entities/LinkPreview.cs rename to zero.Core/Routing/Models/LinkPreview.cs diff --git a/zero.Core/Routing/Entities/LinkTarget.cs b/zero.Core/Routing/Models/LinkTarget.cs similarity index 100% rename from zero.Core/Routing/Entities/LinkTarget.cs rename to zero.Core/Routing/Models/LinkTarget.cs diff --git a/zero.Core/Routing/Entities/Route.cs b/zero.Core/Routing/Models/Route.cs similarity index 100% rename from zero.Core/Routing/Entities/Route.cs rename to zero.Core/Routing/Models/Route.cs diff --git a/zero.Core/Routing/Entities/RouteEndpoint.cs b/zero.Core/Routing/Models/RouteEndpoint.cs similarity index 100% rename from zero.Core/Routing/Entities/RouteEndpoint.cs rename to zero.Core/Routing/Models/RouteEndpoint.cs diff --git a/zero.Core/Routing/Entities/RouteRedirect.cs b/zero.Core/Routing/Models/RouteRedirect.cs similarity index 100% rename from zero.Core/Routing/Entities/RouteRedirect.cs rename to zero.Core/Routing/Models/RouteRedirect.cs diff --git a/zero.Core/Routing/Entities/RouteResponse.cs b/zero.Core/Routing/Models/RouteResponse.cs similarity index 100% rename from zero.Core/Routing/Entities/RouteResponse.cs rename to zero.Core/Routing/Models/RouteResponse.cs diff --git a/zero.Core/Routing/Entities/RoutingContext.cs b/zero.Core/Routing/Models/RoutingContext.cs similarity index 100% rename from zero.Core/Routing/Entities/RoutingContext.cs rename to zero.Core/Routing/Models/RoutingContext.cs diff --git a/zero.Core/ZeroApplicationBuilder.cs b/zero.Core/ZeroApplicationBuilder.cs index f9d8cd33..8d61db74 100644 --- a/zero.Core/ZeroApplicationBuilder.cs +++ b/zero.Core/ZeroApplicationBuilder.cs @@ -14,15 +14,19 @@ public class ZeroApplicationBuilder : IZeroApplicationBuilder App = app; App.UseStaticFiles(); //App.UseExceptionHandler("/zero/api/error"); - - // TODO - // UseRouting() + UseMiddleware() works for Backoffice (Frontend can't resolve route as context not available yet) - // UseMiddleware() + UseRouting() works for Frontend (Backoffice can't resolve context and falls back to the shared context...) App.UseMiddleware(); App.UseRouting(); App.UseAuthentication(); App.UseAuthorization(); + ZeroBuilder.Modules.Configure(app, null, app.ApplicationServices); + + foreach (IZeroPlugin plugin in ZeroBuilder.Plugins) + { + plugin.Configure(app, null, app.ApplicationServices); + } + + //ZeroModuleInitializer.ConfigureAll(app.ApplicationServices.GetRequiredService()); } @@ -50,16 +54,4 @@ public interface IZeroApplicationBuilder void WithEndpoints(Action endpoints); IZeroApplicationBuilder WithMiddleware(Action configure); -} - - -public class ZeroApplicationBuilderContext -{ - -} - - -public class ZeroEndpointBuilderContext -{ - } \ No newline at end of file diff --git a/zero.Core/ZeroBuilder.cs b/zero.Core/ZeroBuilder.cs index ce5ca729..7ad1873e 100644 --- a/zero.Core/ZeroBuilder.cs +++ b/zero.Core/ZeroBuilder.cs @@ -13,11 +13,13 @@ public class ZeroBuilder public virtual IMvcBuilder Mvc { get; } - protected ZeroModuleCollection Modules { get; } = new(); + internal static ZeroModuleCollection Modules { get; private set; } = new(); readonly IConfiguration Configuration; readonly IZeroStartupOptions StartupOptions; + internal static HashSet Plugins { get; private set; } = new(); + public ZeroBuilder(IServiceCollection services, IConfiguration configuration, Action setupAction) { @@ -76,17 +78,11 @@ public class ZeroBuilder /// public ZeroBuilder AddPlugin() where T : class, IZeroPlugin, new() { - ZeroPluginInitializer.AddPlugin(Services, Configuration); - return this; - } - - - /// - /// Adds a zero plugin - /// - public ZeroBuilder AddPlugin(Func implementationFactory) where T : class, IZeroPlugin, new() - { - ZeroPluginInitializer.AddPlugin(Services, Configuration, implementationFactory); + T plugin = new T(); + plugin.ConfigureServices(Services, Configuration); + AssemblyDiscovery.Current.AddAssembly(typeof(T).Assembly); + Services.AddSingleton(); + Plugins.Add(plugin); return this; } } diff --git a/zero.Core/zero.Core.csproj b/zero.Core/zero.Core.csproj index 2bc70eb2..b3f763f2 100644 --- a/zero.Core/zero.Core.csproj +++ b/zero.Core/zero.Core.csproj @@ -25,7 +25,7 @@ - + diff --git a/zero.Web/ViewHelpers/ZeroMediaHelper.cs b/zero.Web/ViewHelpers/ZeroMediaHelper.cs index b7be6bf3..ac6588b0 100644 --- a/zero.Web/ViewHelpers/ZeroMediaHelper.cs +++ b/zero.Web/ViewHelpers/ZeroMediaHelper.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using zero.Extensions; +using zero.Media; using zero.Persistence; namespace zero.Web.ViewHelpers; @@ -13,6 +14,8 @@ public class ZeroMediaHelper : IZeroMediaHelper public IZeroMediaHelper Core { get; private set; } + protected IMediaManagement MediaManagement { get; private set; } + protected bool Global { get; set; } /// @@ -21,13 +24,14 @@ public class ZeroMediaHelper : IZeroMediaHelper ConcurrentDictionary Cache { get; set; } = new(); - public ZeroMediaHelper(IZeroStore store, bool global = false) + public ZeroMediaHelper(IZeroStore store, IMediaManagement mediaManagement, bool global = false) { Store = store; + MediaManagement = mediaManagement; if (!global) { - Core = new ZeroMediaHelper(store, true); + Core = new ZeroMediaHelper(store, MediaManagement, true); } } @@ -87,15 +91,44 @@ public class ZeroMediaHelper : IZeroMediaHelper public async Task GetUrl(string id, bool isAbsolute = false) { Media.Media media = await GetById(id); - return media?.Path.TrimStart("url://"); + + if (media == null) + { + return null; + } + + if (media.Path.StartsWith("url://")) + { + return media.Path.TrimStart("url://"); + } + + return MediaManagement.GetPublicFilePath(media); } /// public async Task> GetUrls(string[] ids, bool isAbsolute = false) { + Dictionary result = new(); Dictionary medias = await GetByIds(ids); - return medias.ToDictionary(x => x.Key, x => x.Value?.Path.TrimStart("url://")); + + foreach ((string id, Media.Media media) in medias) + { + if (media == null) + { + result.Add(id, null); + } + else if (media.Path.StartsWith("url://")) + { + result.Add(id, media.Path.TrimStart("url://")); + } + else + { + result.Add(id, MediaManagement.GetPublicFilePath(media)); + } + } + + return result; } } diff --git a/zero.Web/ZeroPageModel.cs b/zero.Web/ZeroPageModel.cs new file mode 100644 index 00000000..39eec6ba --- /dev/null +++ b/zero.Web/ZeroPageModel.cs @@ -0,0 +1,30 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.DependencyInjection; +using zero.Applications; +using zero.Context; +using zero.Routing; + +namespace zero.Web; + +public abstract class ZeroPageModel : ZeroPageModel where T : class, IRouteModel +{ + /// + /// Resolved route + /// + public virtual T Route => _route ?? (_route = HttpContext.Features.Get() as T); + T _route; +} + +public abstract class ZeroPageModel : PageModel +{ + /// + /// Get acces to the zero context for this request + /// + public IZeroContext ZeroContext => _zeroContext ?? (_zeroContext = HttpContext?.RequestServices?.GetService()); + IZeroContext _zeroContext; + + /// + /// Resolved application + /// + public virtual Application Application => ZeroContext?.Application; +} \ No newline at end of file