Add next_event to Lecturer API responses and tests

-  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.
This commit is contained in:
HolgerHatGarKeineNode
2026-06-16 23:37:15 +02:00
parent ffcee850ca
commit a051188907
2 changed files with 7 additions and 5 deletions
@@ -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
@@ -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 () {