diff --git a/Htmx.ApiDemo/Htmx.ApiDemo.sln b/Htmx.ApiDemo/Htmx.ApiDemo.sln deleted file mode 100644 index 9f398a0..0000000 --- a/Htmx.ApiDemo/Htmx.ApiDemo.sln +++ /dev/null @@ -1,24 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.5.2.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Htmx.ApiDemo", "Htmx.ApiDemo.csproj", "{38A5EDEF-D21B-8D4E-D1F2-DDFE0335BD22}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {38A5EDEF-D21B-8D4E-D1F2-DDFE0335BD22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {38A5EDEF-D21B-8D4E-D1F2-DDFE0335BD22}.Debug|Any CPU.Build.0 = Debug|Any CPU - {38A5EDEF-D21B-8D4E-D1F2-DDFE0335BD22}.Release|Any CPU.ActiveCfg = Release|Any CPU - {38A5EDEF-D21B-8D4E-D1F2-DDFE0335BD22}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {B66FEAA2-59A2-4489-9AEB-ED875EEE5D3E} - EndGlobalSection -EndGlobal diff --git a/Htmx.ApiDemo/Program.cs b/Htmx.ApiDemo/Program.cs index 452e41e..63d9d09 100644 --- a/Htmx.ApiDemo/Program.cs +++ b/Htmx.ApiDemo/Program.cs @@ -1,8 +1,8 @@ using Htmx.ApiDemo; using Htmx.ApiDemo.Data; -using Immediate.Apis; -using Immediate.Apis.Shared; +using Immediate.Handlers; using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using MongoDB.Bson; using MongoDB.Bson.Serialization; @@ -102,45 +102,46 @@ app.Use(async (context, next) => await next(); }); -// Explicit MapGet/MapPost so RequestDelegateGenerator can intercept and emit -// NativeAOT-safe endpoint code. Handlers return ValueTask which the -// generator knows how to handle: it emits `await result.ExecuteAsync(httpContext)`. -app.MapGet("/", static ( +// Explicit MapGet/MapPost with explicit lambda return type ValueTask. +// The explicit return type annotation lets RequestDelegateGenerator see IResult +// directly (without needing to resolve the generated Handler.HandleAsync type), +// so it emits `await result.ExecuteAsync(httpContext)` instead of JSON serialization. +app.MapGet("/", static ValueTask ( [AsParameters] Htmx.ApiDemo.Templates.GetIndexHandler.Command cmd, Htmx.ApiDemo.Templates.GetIndexHandler.Handler handler, CancellationToken token) => handler.HandleAsync(cmd, token)); -app.MapGet("/greet/{username}/{count?}/{id?}", static ( +app.MapGet("/greet/{username}/{count?}/{id?}", static ValueTask ( [AsParameters] Htmx.ApiDemo.Templates.GetGreetingHandler.Query query, Htmx.ApiDemo.Templates.GetGreetingHandler.Handler handler, CancellationToken token) => handler.HandleAsync(query, token)); -app.MapGet("/login", static ( +app.MapGet("/login", static ValueTask ( [AsParameters] Htmx.ApiDemo.Templates.GetLoginHandler.Query query, Htmx.ApiDemo.Templates.GetLoginHandler.Handler handler, CancellationToken token) => handler.HandleAsync(query, token)); -app.MapPost("/login", static ( +app.MapPost("/login", static ValueTask ( [AsParameters] Htmx.ApiDemo.Templates.PostLoginHandler.Command cmd, Htmx.ApiDemo.Templates.PostLoginHandler.Handler handler, CancellationToken token) => handler.HandleAsync(cmd, token)); -app.MapGet("/register", static ( +app.MapGet("/register", static ValueTask ( [AsParameters] Htmx.ApiDemo.Templates.GetRegisterHandler.Query query, Htmx.ApiDemo.Templates.GetRegisterHandler.Handler handler, CancellationToken token) => handler.HandleAsync(query, token)); -app.MapPost("/register", static ( +app.MapPost("/register", static ValueTask ( [AsParameters] Htmx.ApiDemo.Templates.PostRegisterHandler.Command cmd, Htmx.ApiDemo.Templates.PostRegisterHandler.Handler handler, CancellationToken token) => handler.HandleAsync(cmd, token)); -app.MapPost("/logout", static ( +app.MapPost("/logout", static ValueTask ( [AsParameters] Htmx.ApiDemo.Templates.PostLogoutHandler.Command cmd, Htmx.ApiDemo.Templates.PostLogoutHandler.Handler handler, CancellationToken token) => handler.HandleAsync(cmd, token)); -app.MapGet("/ui-demo", static ( +app.MapGet("/ui-demo", static ValueTask ( [AsParameters] Htmx.ApiDemo.Templates.GetUiDemoHandler.Query query, Htmx.ApiDemo.Templates.GetUiDemoHandler.Handler handler, CancellationToken token) => handler.HandleAsync(query, token)); diff --git a/Htmx.ApiDemo/Templates/Logout.cs b/Htmx.ApiDemo/Templates/Logout.cs index 5333284..0b91947 100644 --- a/Htmx.ApiDemo/Templates/Logout.cs +++ b/Htmx.ApiDemo/Templates/Logout.cs @@ -1,6 +1,8 @@ +using Htmx.ApiDemo; using Htmx.ApiDemo.Data; using Immediate.Apis.Shared; using Immediate.Handlers.Shared; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace Htmx.ApiDemo.Templates; @@ -13,16 +15,13 @@ public static partial class PostLogoutHandler // and antiforgery token in the form is validated by the middleware. public class Command; - private static async ValueTask HandleAsync( + private static async ValueTask HandleAsync( [AsParameters] Command _, AuthService authService, IHttpContextAccessor httpContextAccessor, CancellationToken token) { await authService.SignOutAsync(); - - var ctx = httpContextAccessor.HttpContext - ?? throw new InvalidOperationException("HttpContext is not available."); - ctx.Response.Redirect("/login"); + return new HtmxResult("/login"); } } diff --git a/debug-secrets.ps1 b/debug-secrets.ps1 deleted file mode 100644 index e69de29..0000000