with(['city:id,name,country_id', 'city.country:id,name,code']) ->select('id', 'name', 'city_id') ->orderBy('name') ->when( $request->search, fn (Builder $query) => $query ->where('name', 'ilike', "%{$request->search}%") ) ->when( $request->exists('selected'), fn (Builder $query) => $query->whereIn('id', $this->numericIds($request)), fn (Builder $query) => $query->limit(10) ) ->get() ->map(function (Venue $venue) { $venue->flag = asset('vendor/blade-country-flags/4x3-'.$venue->city->country->code.'.svg'); $venue->description = $venue->city->name.', '.$venue->street; return $venue; }); } /** * Veranstaltungsort anlegen * * Erlaubt einem authentifizierten Nutzer, einen Veranstaltungsort programmatisch anzulegen. * Der Ersteller (created_by) wird automatisch gesetzt. */ #[ResponseAttribute(status: 401, description: 'Nicht authentifiziert.')] #[ResponseAttribute(status: 422, description: 'Validierungsfehler.')] public function store(StoreVenueRequest $request): JsonResponse { $venue = Venue::create($request->validated()); return VenueResource::make($venue->fresh()) ->response() ->setStatusCode(Response::HTTP_CREATED); } /** * Veranstaltungsort aktualisieren * * Aktualisiert einen Veranstaltungsort; nur fuer den Ersteller oder einen Super-Admin. */ #[ResponseAttribute(status: 403, description: 'Nur der Ersteller oder ein Super-Admin darf den Veranstaltungsort aendern.')] #[ResponseAttribute(status: 422, description: 'Validierungsfehler.')] public function update(UpdateVenueRequest $request, Venue $venue): VenueResource { $venue->update($request->validated()); return VenueResource::make($venue->fresh()); } /** * Eigene Veranstaltungsorte auflisten * * Liefert alle vom authentifizierten Nutzer erstellten Veranstaltungsorte, alphabetisch sortiert. */ public function mine(Request $request): AnonymousResourceCollection { Gate::authorize('viewAny', Venue::class); $venues = Venue::query() ->where('created_by', $request->user()->id) ->orderBy('name') ->get(); return VenueResource::collection($venues); } /** * Eigenen Veranstaltungsort anzeigen * * Zeigt einen einzelnen, vom authentifizierten Nutzer erstellten Veranstaltungsort. */ #[ResponseAttribute(status: 403, description: 'Nur der Ersteller oder ein Super-Admin darf den Veranstaltungsort sehen.')] public function mineShow(Venue $venue): VenueResource { Gate::authorize('view', $venue); return VenueResource::make($venue); } }