mirror of
https://github.com/HolgerHatGarKeineNode/einundzwanzig-app.git
synced 2026-06-17 04:30:31 +00:00
✨ 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:
@@ -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 () {
|
||||
|
||||
Reference in New Issue
Block a user