diff --git a/api/app/Http/Controllers/Api/V1/VolunteerRegistrationController.php b/api/app/Http/Controllers/Api/V1/VolunteerRegistrationController.php new file mode 100644 index 00000000..fa623953 --- /dev/null +++ b/api/app/Http/Controllers/Api/V1/VolunteerRegistrationController.php @@ -0,0 +1,49 @@ +user(); + + $person = $this->registrationService->register( + $event, + $request->validated(), + $user + ); + + $person->load('crowdType'); + + $hasExistingAccount = PersonIdentityMatch::where('person_id', $person->id) + ->where('status', IdentityMatchStatus::PENDING) + ->exists(); + + $responseData = [ + 'person' => new PersonResource($person), + 'has_existing_account' => $hasExistingAccount, + ]; + + if ($person->wasRecentlyCreated) { + return $this->created($responseData); + } + + return $this->success($responseData); + } +} diff --git a/apps/portal/src/composables/api/useVolunteerRegistration.ts b/apps/portal/src/composables/api/useVolunteerRegistration.ts index 6f457b9c..2178799b 100644 --- a/apps/portal/src/composables/api/useVolunteerRegistration.ts +++ b/apps/portal/src/composables/api/useVolunteerRegistration.ts @@ -22,10 +22,15 @@ export function useRegistrationData(eventSlug: Ref) { }) } +export interface VolunteerRegistrationResponse { + person: Record + has_existing_account: boolean +} + export function useSubmitRegistration() { return useMutation({ mutationFn: async ({ eventId, form }: { eventId: string; form: VolunteerRegistrationForm }) => { - const { data } = await apiClient.post>>( + const { data } = await apiClient.post>( `/events/${eventId}/volunteer-register`, form, ) diff --git a/apps/portal/src/pages/register/[eventSlug].vue b/apps/portal/src/pages/register/[eventSlug].vue index 59c9a7da..7fd1ddc2 100644 --- a/apps/portal/src/pages/register/[eventSlug].vue +++ b/apps/portal/src/pages/register/[eventSlug].vue @@ -622,7 +622,7 @@ async function onSubmit() { if (section_preferences?.length) payload.section_preferences = section_preferences try { - await submitRegistration({ + const result = await submitRegistration({ eventId: registrationData.value.event.id, form: payload, }) @@ -644,6 +644,7 @@ async function onSubmit() { event: registrationData.value.event.name, banner: registrationData.value.event.registration_banner_url ?? '', authenticated: authStore.isAuthenticated ? '1' : '0', + hasAccount: result.has_existing_account ? '1' : '0', }, }) } diff --git a/apps/portal/src/pages/register/success.vue b/apps/portal/src/pages/register/success.vue index 7d62beab..7923901f 100644 --- a/apps/portal/src/pages/register/success.vue +++ b/apps/portal/src/pages/register/success.vue @@ -16,6 +16,7 @@ const authStore = useAuthStore() const eventName = computed(() => (route.query.event as string) || 'het evenement') const bannerUrl = computed(() => (route.query.banner as string) || null) const isAuthenticated = computed(() => route.query.authenticated === '1' || authStore.isAuthenticated) +const hasExistingAccount = computed(() => route.query.hasAccount === '1' && !isAuthenticated.value)