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 () {