feat(api): registration auth, account creation, check-email & email notifications

- Add POST /public/check-email endpoint with rate limiting (10/min)
- Create user accounts during volunteer registration (new or returning)
- Returning volunteers authenticate with existing password
- Add password validation to VolunteerRegistrationRequest
- Normalize emails to lowercase throughout registration flow
- Handle race condition on duplicate accounts gracefully
- Create RegistrationConfirmationMail, RegistrationApprovedMail, RegistrationRejectedMail
- Wire approval/rejection emails into PersonController
- Add POST persons/{person}/reject endpoint
- Trigger TagSyncService on registration and approval
- Add CheckEmailTest, PersonApprovalEmailTest, extend VolunteerRegistrationTest

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-13 00:37:04 +02:00
parent 4df82d8358
commit 8435e74fd3
17 changed files with 802 additions and 38 deletions

View File

@@ -0,0 +1,14 @@
<x-mail::message>
# Goed nieuws, {{ $personName }}!
Goed nieuws! Je bent goedgekeurd als vrijwilliger voor **{{ $eventName }}**.
Log in op het portaal om je shifts te bekijken en te claimen.
<x-mail::button :url="$portalUrl">
Naar het portaal
</x-mail::button>
Met vriendelijke groet,<br>
{{ config('app.name') }}
</x-mail::message>

View File

@@ -0,0 +1,19 @@
<x-mail::message>
# Bedankt voor je aanmelding, {{ $personName }}!
Bedankt voor je aanmelding als vrijwilliger voor **{{ $eventName }}**!
Je registratie wordt beoordeeld door de organisatie. Je ontvangt een e-mail zodra je aanmelding is verwerkt.
Je kunt inloggen op het vrijwilligersportaal om je status te volgen.
<x-mail::button :url="$portalUrl">
Naar het portaal
</x-mail::button>
**Evenement:** {{ $eventName }}<br>
**Datum:** {{ $startDate }} t/m {{ $endDate }}
Met vriendelijke groet,<br>
{{ config('app.name') }}
</x-mail::message>

View File

@@ -0,0 +1,14 @@
<x-mail::message>
# Update over je aanmelding, {{ $personName }}
Helaas hebben we je aanmelding voor **{{ $eventName }}** niet kunnen goedkeuren.
@if($reason)
**Reden:** {{ $reason }}
@endif
Neem contact op met de organisatie als je vragen hebt.
Met vriendelijke groet,<br>
{{ config('app.name') }}
</x-mail::message>