orderBy('order')->orderBy('id')->get(); } public function findById(int $id): ?Event { return Event::with('media')->find($id); } public function create(array $data): Event { if (!isset($data['order'])) { $data['order'] = Event::max('order') + 1; } $event = Event::create($data); return $event->load('media'); } public function update(int $id, array $data): ?Event { $model = Event::find($id); if (!$model) { return null; } $model->update($data); return $model->fresh('media'); } public function reorder(array $items): void { foreach ($items as $item) { Event::where('id', $item['id'])->update(['order' => $item['order']]); } } public function delete(int $id): bool { $model = Event::find($id); if (!$model) { return false; } if ($model->cover_path) { Storage::disk('s3')->delete($model->cover_path); } $model->media->each(fn($media) => $this->mediaService->delete($media->id)); return $model->delete(); } public function uploadCover(int $id, UploadedFile $file): ?Event { $model = Event::find($id); if (!$model) { return null; } if ($model->cover_path) { Storage::disk('s3')->delete($model->cover_path); } $model->cover_path = $file->store("events/{$id}/cover", 's3'); $model->save(); return $model->fresh('media'); } public function removeCover(int $id): ?Event { $model = Event::find($id); if (!$model) { return null; } if ($model->cover_path) { Storage::disk('s3')->delete($model->cover_path); $model->cover_path = null; $model->save(); } return $model->fresh('media'); } }