using Health.Application.HealthArchives; using Health.Application.Users; namespace Health.WebApi.Endpoints; public static class UserEndpoints { public static void MapUserEndpoints(this WebApplication app) { var group = app.MapGroup("/api/user").RequireAuthorization(); group.MapGet("/profile", async (HttpContext http, IUserService users, CancellationToken ct) => { var profile = await users.GetProfileAsync(GetUserId(http), ct); return Results.Ok(new { code = 0, data = profile, message = (string?)null }); }); group.MapPut("/profile", async (UpdateProfileRequest req, HttpContext http, IUserService users, CancellationToken ct) => { var birthDate = DateOnly.TryParse(req.BirthDate, out var parsed) ? parsed : (DateOnly?)null; var updated = await users.UpdateProfileAsync( GetUserId(http), new UserProfileUpdateRequest(req.Name, req.Gender, birthDate, req.AvatarUrl), ct); if (!updated) return Results.Ok(new { code = 40004, message = "用户不存在" }); var profile = await users.GetProfileAsync(GetUserId(http), ct); return Results.Ok(new { code = 0, data = profile, message = (string?)null }); }); group.MapGet("/health-archive", async (HttpContext http, IHealthArchiveService archives, CancellationToken ct) => { var archive = await archives.GetAsync(GetUserId(http), ct); return Results.Ok(new { code = 0, data = archive, message = (string?)null }); }); group.MapPut("/health-archive", async (UpdateArchiveRequest req, HttpContext http, IHealthArchiveService archives, CancellationToken ct) => { var surgeryDate = DateOnly.TryParse(req.SurgeryDate, out var parsed) ? parsed : (DateOnly?)null; var surgeries = req.Surgeries?.Select(s => new HealthArchiveSurgeryInput( s.Type, DateOnly.TryParse(s.Date, out var date) ? date : null)).ToList(); await archives.UpdateAsync( GetUserId(http), new HealthArchiveUpdateRequest( req.Diagnosis, req.SurgeryType, surgeryDate, req.Allergies, req.DietRestrictions, req.ChronicDiseases, req.FamilyHistory, surgeries, req.SurgeryHistoryStatus), ct); return Results.Ok(new { code = 0, data = new { success = true }, message = (string?)null }); }); group.MapDelete("/account", async (HttpContext http, IUserService users, CancellationToken ct) => { await users.DeleteAccountAsync(GetUserId(http), ct); return Results.Ok(new { code = 0, data = new { success = true }, message = (string?)null }); }); } private static Guid GetUserId(HttpContext http) => Guid.TryParse(http.User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value, out var id) ? id : Guid.Empty; } public sealed record UpdateProfileRequest(string? Name, string? Gender, string? BirthDate, string? AvatarUrl); public sealed record UpdateArchiveRequest( string? Diagnosis, string? SurgeryType, string? SurgeryDate, List? Allergies, List? DietRestrictions, List? ChronicDiseases, string? FamilyHistory, List? Surgeries, string? SurgeryHistoryStatus); public sealed record UpdateArchiveSurgeryRequest(string Type, string? Date);