using FozFc.Api.Api.Extensions; using FozFc.Api.Application.Common; using FozFc.Api.Domain; using FozFc.Api.Infrastructure.Mongo; using MongoDB.Bson; namespace FozFc.Api.Api.Endpoints; public sealed record ContactRequest(string? Name, string? Email, string? Subject, string? Message, string? RecaptchaToken); public static class ContactEndpoints { public static IEndpointRouteBuilder MapContactEndpoints(this IEndpointRouteBuilder app) { // Public contact form submission -> stored in contact_messages. app.MapPost("/api/contact-submit", async (ContactRequest body, IDocumentRepository repo, CancellationToken ct) => { if (string.IsNullOrWhiteSpace(body.Name) || string.IsNullOrWhiteSpace(body.Email) || string.IsNullOrWhiteSpace(body.Message)) throw ApiException.BadRequest("Name, email and message are required."); var document = new BsonDocument { { "_id", DocumentRepository.NewId() }, { "name", body.Name }, { "email", body.Email }, { "subject", body.Subject ?? "" }, { "message", body.Message }, { "status", "new" }, { "createdAt", DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ") }, }; await repo.InsertAsync(Collections.ContactMessages, document, ct); return BsonResults.Json(new BsonDocument("success", true)); }); return app; } }