using IdentityShroud.Core.Contracts; using IdentityShroud.Core.Messages.Realm; using IdentityShroud.Core.Model; using IdentityShroud.Core.Services; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; namespace IdentityShroud.Api; public static class HttpContextExtensions { public static Realm GetValidatedRealm(this HttpContext context) => (Realm)context.Items["RealmEntity"]!; } // api: api/v1/realms/{realmId}/.... // api: api/v1/realms/{realmId}/clients/{clientId} public static class RealmApi { public static void MapRealmEndpoints(IEndpointRouteBuilder erp) { var realmsGroup = erp.MapGroup("/api/v1/realms"); realmsGroup.MapPost("", RealmCreate) .Validate() .WithName("Create Realm") .Produces(StatusCodes.Status201Created); var realmIdGroup = realmsGroup.MapGroup("{realmId}") .AddEndpointFilter(); ClientApi.MapEndpoints(realmIdGroup); } private static async Task, InternalServerError>> RealmCreate(RealmCreateRequest request, [FromServices] IRealmService service) { var response = await service.Create(request); if (response.IsSuccess) return TypedResults.Created($"/realms/{response.Value.Slug}", response.Value); // TODO make helper to convert failure response to a proper HTTP result. return TypedResults.InternalServerError(); } }