using FozFc.Api.Api.Authorization; using FozFc.Api.Api.Extensions; using FozFc.Api.Application.Auth; using MongoDB.Bson; namespace FozFc.Api.Api.Endpoints; public static class AuthEndpoints { public static IEndpointRouteBuilder MapAuthEndpoints(this IEndpointRouteBuilder app) { var group = app.MapGroup("/api/auth"); group.MapPost("/register", async (RegisterRequest body, IAuthService auth, CancellationToken ct) => BsonResults.Json(await auth.RegisterAsync(body, ct), 201)); group.MapPost("/login", async (LoginRequest body, IAuthService auth, CancellationToken ct) => BsonResults.Json(await auth.LoginAsync(body, ct))); group.MapPost("/google", async (GoogleRequest body, IAuthService auth, CancellationToken ct) => BsonResults.Json(await auth.LoginWithGoogleAsync(body, ct))); group.MapGet("/me", async (HttpContext ctx, IAuthService auth, CancellationToken ct) => { var uid = EndpointGuards.RequireUid(ctx.User); return BsonResults.Json(await auth.GetProfileAsync(uid, ct)); }); group.MapGet("/profile/{uid}", async (string uid, HttpContext ctx, IAuthService auth, CancellationToken ct) => { EndpointGuards.RequireSelfOrAdmin(ctx.User, uid); return BsonResults.Json(await auth.GetProfileAsync(uid, ct)); }); group.MapGet("/role/{uid}", async (string uid, HttpContext ctx, IAuthService auth, CancellationToken ct) => { EndpointGuards.RequireSelfOrAdmin(ctx.User, uid); return BsonResults.Json(new BsonDocument("role", await auth.GetRoleAsync(uid, ct))); }); group.MapPost("/refresh-progress/{uid}", async (string uid, HttpContext ctx, IAuthService auth, CancellationToken ct) => { EndpointGuards.RequireSelfOrAdmin(ctx.User, uid); return BsonResults.Json(await auth.RefreshProgressAsync(uid, ct)); }); group.MapPatch("/password", async (ChangePasswordRequest body, HttpContext ctx, IAuthService auth, CancellationToken ct) => { var uid = EndpointGuards.RequireUid(ctx.User); await auth.ChangePasswordAsync(uid, body, ct); return BsonResults.Ok(); }); return app; } }