vbytes-lan-registration/src/Registration/Registration.API/Controllers/VolunteerController.cs
2026-02-24 20:15:42 +01:00

54 lines
1.8 KiB
C#

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<IActionResult> 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();
}
}