From c3028b8260b39ce64df4b13d24069139efbaaa67 Mon Sep 17 00:00:00 2001 From: HolgerHatGarKeineNode <123783602+HolgerHatGarKeineNode@users.noreply.github.com> Date: Mon, 15 Jun 2026 22:45:28 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20attendee=20count=20helpers=20?= =?UTF-8?q?and=20enhance=20Meetup=20API=20responses?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ➕ Introduce `attendeesCount` and `mightAttendeesCount` methods in `MeetupEvent` model for cleaner attendee calculations. - 🛠️ Refactor API responses to use attendee count helpers in `Meetup` and `MeetupEventController`. - 🧪 Update tests to validate JSON structure with attendee-related fields (`id`, `attendees`, `might_attendees`). --- app/Http/Controllers/Api/MeetupEventController.php | 7 +++++-- app/Models/Meetup.php | 4 ++-- app/Models/MeetupEvent.php | 13 +++++++++++++ tests/Feature/Api/MeetupApiTest.php | 4 +++- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Api/MeetupEventController.php b/app/Http/Controllers/Api/MeetupEventController.php index 0e1bf5f..91ca352 100644 --- a/app/Http/Controllers/Api/MeetupEventController.php +++ b/app/Http/Controllers/Api/MeetupEventController.php @@ -59,10 +59,13 @@ class MeetupEventController extends Controller ->get(); return $events->map(fn ($event) => [ + 'id' => $event->id, 'start' => $event->start->format('Y-m-d H:i'), 'location' => $event->location, 'description' => $event->description, 'link' => $event->link, + 'attendees' => $event->attendeesCount(), + 'might_attendees' => $event->mightAttendeesCount(), 'meetup.name' => $event->meetup->name, 'meetup.portalLink' => url()->route( 'meetups.landingpage', @@ -202,8 +205,8 @@ class MeetupEventController extends Controller { return [ 'status' => $meetupEvent->rsvpStatusFor($user)->value, - 'attendees' => count($meetupEvent->attendees ?? []), - 'might_attendees' => count($meetupEvent->might_attendees ?? []), + 'attendees' => $meetupEvent->attendeesCount(), + 'might_attendees' => $meetupEvent->mightAttendeesCount(), ]; } } diff --git a/app/Models/Meetup.php b/app/Models/Meetup.php index 647ae1b..b93e247 100644 --- a/app/Models/Meetup.php +++ b/app/Models/Meetup.php @@ -272,8 +272,8 @@ class Meetup extends Model implements HasMedia 'location' => $nextEvent->location, 'description' => $nextEvent->description, 'link' => $nextEvent->link, - 'attendees' => count($nextEvent->attendees ?? []), - 'might_attendees' => count($nextEvent->might_attendees ?? []), + 'attendees' => $nextEvent->attendeesCount(), + 'might_attendees' => $nextEvent->mightAttendeesCount(), 'nostr_note' => str($nextEvent->nostr_status)->after('Sent event ')->before(' to '), ] : null, ); diff --git a/app/Models/MeetupEvent.php b/app/Models/MeetupEvent.php index 1cff8c6..a954d5f 100644 --- a/app/Models/MeetupEvent.php +++ b/app/Models/MeetupEvent.php @@ -65,6 +65,19 @@ class MeetupEvent extends Model return $this->belongsTo(Meetup::class); } + /** + * Anzahl der Zusagen bzw. Vielleicht-Sagen (die Listen sind JSON-Arrays). + */ + public function attendeesCount(): int + { + return count($this->attendees ?? []); + } + + public function mightAttendeesCount(): int + { + return count($this->might_attendees ?? []); + } + /** * Eindeutige Kennung eines angemeldeten Nutzers in den Teilnehmer-Listen. * Einträge werden als `id_|` abgelegt; der angehängte Pipe diff --git a/tests/Feature/Api/MeetupApiTest.php b/tests/Feature/Api/MeetupApiTest.php index 8bb751c..79c9ef3 100644 --- a/tests/Feature/Api/MeetupApiTest.php +++ b/tests/Feature/Api/MeetupApiTest.php @@ -80,7 +80,9 @@ it('returns meetup events as JSON on GET /api/meetup-events', function () { $response = $this->getJson('/api/meetup-events'); - $response->assertSuccessful(); + $response->assertSuccessful() + // id + Zähler werden für das RSVP im mobilen Slide-In gebraucht. + ->assertJsonStructure([['id', 'start', 'attendees', 'might_attendees', 'meetup.name']]); expect($response->json())->toBeArray()->not->toBeEmpty(); });