using Microsoft.AspNetCore.Mvc; using Registration.API.RequestModels; using Registration.API.Services; using Registration.API.Validation; using Registration.Domain.Models; namespace Registration.API.Controllers; [Route("api/[controller]")] [ApiController] public class VolunteerController(IVbytesVolunteerRelayService relayService) : ControllerBase { private readonly IVbytesVolunteerRelayService _relayService = relayService; [HttpPost("register")] public async Task RegisterVolunteer([FromBody] VolunteerRegistrationRequest request, CancellationToken cancellationToken) { var normalizedPhone = request.PhoneNumber.NormalizePhone(); var trimmedAreas = request.AreasOfInterest .Select(area => area.Name.Trim()) .Where(name => !string.IsNullOrWhiteSpace(name)) .ToList(); if (trimmedAreas.Count == 0) { ModelState.AddModelError(nameof(request.AreasOfInterest), "At least one valid area of interest is required."); } if (!ModelState.IsValid) { return ValidationProblem(ModelState); } var volunteer = new Volunteer { FirstName = request.FirstName.Trim(), SurName = request.SurName.Trim(), PhoneNumber = normalizedPhone, Email = request.Email.Trim(), HasApprovedGdpr = request.HasApprovedGdpr!.Value, AreasOfInterest = trimmedAreas.Select(name => new AreaOfInterest { Name = name }).ToList() }; var result = await _relayService.RegisterVolunteerAsync(volunteer, cancellationToken); if (result.Success && !result.Message.Contains("401")) { return Ok(); } return Unauthorized(); } }