using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using plushealthtech.Mail; namespace plushealthtech.Pages { /// /// Handles the footer "Connect" newsletter form (POST /Subscribe). /// An API-style page handler: success and failure come back as JSON to /// the layout's inline script; Subscribe.cshtml is an empty view that /// exists only so the page model is routed. /// public class SubscribeModel : PageModel { private readonly MailSender _mailSender; private readonly ILogger _logger; public SubscribeModel(MailSender mailSender, ILogger logger) { _mailSender = mailSender; _logger = logger; } [BindProperty] [Required] [EmailAddress] [StringLength(320)] public string Email { get; set; } = string.Empty; public async Task OnPostAsync() { if (!ModelState.IsValid) { return new JsonResult(new { success = false, message = "Please enter a valid email address." }) { StatusCode = StatusCodes.Status400BadRequest }; } var body = string.Join("\n", new List { $"Email: {Email}", string.Empty, "Subscribed from the footer newsletter form (Connect) on the Plus Health Tech website." }); try { await _mailSender.SendAsync($"New newsletter subscription — {Email}", body); return new JsonResult(new { success = true, message = "You're on the list — thanks for subscribing!" }); } catch (Exception ex) { // Log the full exception; never surface SMTP details to the user. _logger.LogError(ex, "Failed to send newsletter subscription for {Email}", Email); return new JsonResult(new { success = false, message = "We couldn't sign you up right now. Please try again later." }) { StatusCode = StatusCodes.Status500InternalServerError }; } } } }