verifyEventBelongsToOrganisation($organisation, $event); $data = $request->validated(); $performance = Performance::query()->findOrFail($data['performance_id']); Gate::authorize('move', [$performance, $event]); $targetStage = isset($data['target_stage_id']) ? Stage::query()->find($data['target_stage_id']) : null; $start = isset($data['target_start_at']) ? CarbonImmutable::parse((string) $data['target_start_at']) : null; $end = isset($data['target_end_at']) ? CarbonImmutable::parse((string) $data['target_end_at']) : null; try { $result = $this->service->move( performance: $performance, targetStage: $targetStage, start: $start, end: $end, targetLane: isset($data['target_lane']) ? (int) $data['target_lane'] : null, clientVersion: (int) $data['version'], ); } catch (VersionMismatchException $e) { $performance->refresh(); return $this->error('Version mismatch — performance was modified by another request.', 409, [ 'conflict' => 'version_mismatch', 'current_version' => $e->currentVersion, 'client_version' => $e->clientVersion, 'server_data' => PerformanceResource::make( $performance->load(['engagement.artist.defaultGenre', 'stage']), )->toArray(request()), ]); } return $this->success([ 'moved' => PerformanceResource::make( $result->moved->load(['engagement.artist.defaultGenre', 'stage']), ), 'cascaded' => PerformanceResource::collection( collect($result->cascaded)->each->load(['engagement.artist.defaultGenre', 'stage']), ), ]); } }