verifyEventBelongsToOrganisation($organisation, $event); Gate::authorize('viewAny', [ArtistEngagement::class, $event]); $query = ArtistEngagement::query() ->where('event_id', $event->id) ->with(['artist.defaultGenre', 'projectLeader']); if ($request->filled('status')) { $query->where('booking_status', $request->string('status')); } if ($request->filled('search')) { $term = '%'.$request->string('search').'%'; $query->whereHas('artist', fn ($q) => $q->where('name', 'like', $term)); } return ArtistEngagementResource::collection( $query->orderBy('created_at', 'desc')->paginate(50), ); } public function show(Organisation $organisation, Event $event, ArtistEngagement $engagement): JsonResponse { $this->verifyEventBelongsToOrganisation($organisation, $event); Gate::authorize('view', [$engagement, $event]); $engagement->loadMissing([ 'artist.defaultGenre', 'artist.agentCompany', 'artist.contacts', 'projectLeader', 'performances.stage', ]); return $this->success(ArtistEngagementResource::make($engagement)); } public function store(CreateArtistEngagementRequest $request, Organisation $organisation, Event $event): JsonResponse { $this->verifyEventBelongsToOrganisation($organisation, $event); Gate::authorize('create', [ArtistEngagement::class, $event]); $data = $request->validated(); $artist = Artist::query()->findOrFail($data['artist_id']); try { $engagement = $this->service->create($event, $artist, $data); } catch (InvalidStatusTransitionException $e) { return $this->error($e->getMessage(), 422); } return $this->created( ArtistEngagementResource::make($engagement->load(['artist.defaultGenre', 'projectLeader'])), ); } public function update( UpdateArtistEngagementRequest $request, Organisation $organisation, Event $event, ArtistEngagement $engagement, ): JsonResponse { $this->verifyEventBelongsToOrganisation($organisation, $event); Gate::authorize('update', [$engagement, $event]); try { $engagement = $this->service->update($engagement, $request->validated()); } catch (InvalidStatusTransitionException $e) { return $this->error($e->getMessage(), 422); } return $this->success( ArtistEngagementResource::make($engagement->load(['artist.defaultGenre', 'projectLeader'])), ); } public function destroy( Organisation $organisation, Event $event, ArtistEngagement $engagement, ): JsonResponse { $this->verifyEventBelongsToOrganisation($organisation, $event); Gate::authorize('delete', [$engagement, $event]); $this->service->softDelete($engagement); return response()->json(null, 204); } }