From a051188907e23a9640371914932819473c85c2df Mon Sep 17 00:00:00 2001 From: HolgerHatGarKeineNode <123783602+HolgerHatGarKeineNode@users.noreply.github.com> Date: Tue, 16 Jun 2026 23:37:15 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20`next=5Fevent`=20to=20Lecture?= =?UTF-8?q?r=20API=20responses=20and=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ➕ Extend `withDetails` flag in Lecturer API to include `next_event` (date of the next course event or null). - 🧪 Update feature tests to assert presence and validity of `next_event` in responses. --- app/Http/Controllers/Api/LecturerController.php | 7 ++++--- tests/Feature/Api/CourseLecturerReadApiTest.php | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Api/LecturerController.php b/app/Http/Controllers/Api/LecturerController.php index c34d12d..30f07f0 100644 --- a/app/Http/Controllers/Api/LecturerController.php +++ b/app/Http/Controllers/Api/LecturerController.php @@ -28,11 +28,11 @@ class LecturerController extends Controller /** * Referenten auflisten und durchsuchen * - * Öffentlicher Endpunkt; liefert id und name, alphabetisch sortiert. Ohne den Parameter 'selected' wird die Liste auf 10 Einträge begrenzt. Jeder Referent enthält zusätzlich ein 'image' (Avatar-Thumbnail-URL). Mit 'withDetails' entfällt das Limit und jeder Referent enthält zusätzlich subtitle und future_events_count (Anzahl kommender Kurs-Events). + * Öffentlicher Endpunkt; liefert id und name, alphabetisch sortiert. Ohne den Parameter 'selected' wird die Liste auf 10 Einträge begrenzt. Jeder Referent enthält zusätzlich ein 'image' (Avatar-Thumbnail-URL). Mit 'withDetails' entfällt das Limit und jeder Referent enthält zusätzlich subtitle, future_events_count (Anzahl kommender Kurs-Events) und next_event (Datum des nächsten kommenden Kurs-Events, oder null). */ #[QueryParameter(name: 'search', description: 'Teilstring-Suche im Namen.', required: false, type: 'string')] #[QueryParameter(name: 'selected', description: 'Lädt gezielt die angegebenen IDs.', required: false, type: 'array')] - #[QueryParameter(name: 'withDetails', description: 'Presence-Flag: liefert subtitle und future_events_count mit und hebt das 10-Einträge-Limit auf.', required: false, type: 'string')] + #[QueryParameter(name: 'withDetails', description: 'Presence-Flag: liefert subtitle, future_events_count und next_event mit und hebt das 10-Einträge-Limit auf.', required: false, type: 'string')] public function index(Request $request) { $withDetails = $request->exists('withDetails'); @@ -42,7 +42,8 @@ class LecturerController extends Controller ->with('media') ->orderBy('name') ->when($withDetails, fn (Builder $query) => $query - ->withCount(['coursesEvents as future_events_count' => fn (Builder $events) => $events->where('from', '>=', now())])) + ->withCount(['coursesEvents as future_events_count' => fn (Builder $events) => $events->where('from', '>=', now())]) + ->withMin(['coursesEvents as next_event' => fn (Builder $events) => $events->where('from', '>=', now())], 'from')) ->when( $request->search, fn (Builder $query) => $query diff --git a/tests/Feature/Api/CourseLecturerReadApiTest.php b/tests/Feature/Api/CourseLecturerReadApiTest.php index e4d7698..591f423 100644 --- a/tests/Feature/Api/CourseLecturerReadApiTest.php +++ b/tests/Feature/Api/CourseLecturerReadApiTest.php @@ -93,8 +93,9 @@ it('returns all lecturers with details on GET /api/lecturers?withDetails', funct $first = collect($response->json())->firstWhere('id', $lecturers->first()->id); expect($first) - ->toHaveKeys(['id', 'name', 'subtitle', 'image', 'future_events_count']) - ->and($first['future_events_count'])->toBe(2); + ->toHaveKeys(['id', 'name', 'subtitle', 'image', 'future_events_count', 'next_event']) + ->and($first['future_events_count'])->toBe(2) + ->and($first['next_event'])->not->toBeNull(); }); it('shows a lecturer profile with courses on GET /api/lecturers/{lecturer}', function () {