paginate(20); return view('admin.content.media.index', compact('media')); } public function create(): View { return view('admin.content.media.create'); } public function store(Request $request): RedirectResponse { $validated = $request->validate([ 'file' => ['required', 'file', 'max:10240', 'mimetypes:image/*,video/*,audio/*'], 'alt' => ['nullable', 'string', 'max:255'], 'caption' => ['nullable', 'string', 'max:255'], ], [ 'file.required' => 'File harus diunggah.', 'file.file' => 'File tidak valid.', 'file.max' => 'File maksimal 10MB.', 'file.mimetypes' => 'File harus berupa gambar, video, atau audio.', 'alt.max' => 'Alt maksimal 255 karakter.', 'caption.max' => 'Caption maksimal 255 karakter.', ]); $file = $request->file('file'); $originalName = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME); $filename = Str::slug($originalName) ?: 'media-file'; $extension = strtolower($file->getClientOriginalExtension()); $storedName = $filename . '-' . time() . '.' . $extension; $path = $file->storeAs('media', $storedName, 'public'); $width = null; $height = null; if (str_starts_with($file->getClientMimeType(), 'image/')) { [$width, $height] = getimagesize($file->path()) ?: [null, null]; } Media::create([ 'path' => $path, 'filename' => $storedName, 'mime_type' => $file->getClientMimeType(), 'extension' => $extension, 'size' => $file->getSize(), 'width' => $width, 'height' => $height, 'alt' => $validated['alt'] ?? null, 'caption' => $validated['caption'] ?? null, 'created_by' => Auth::id(), 'updated_by' => Auth::id(), ]); return redirect()->route('admin.contents.media.index') ->with('success', 'Media berhasil dibuat.'); } public function show(Media $medium): View { return view('admin.content.media.show', compact('medium')); } public function edit(Media $medium): View { return view('admin.content.media.edit', compact('medium')); } public function update(Request $request, Media $medium): RedirectResponse { $validated = $request->validate([ 'file' => ['nullable', 'file', 'max:10240'], 'alt' => ['nullable', 'string', 'max:255'], 'caption' => ['nullable', 'string', 'max:255'], ], [ 'file.file' => 'File tidak valid.', 'file.max' => 'File maksimal 10MB.', 'alt.max' => 'Alt maksimal 255 karakter.', 'caption.max' => 'Caption maksimal 255 karakter.', ]); $data = [ 'alt' => $validated['alt'] ?? null, 'caption' => $validated['caption'] ?? null, 'updated_by' => Auth::id(), ]; if ($request->hasFile('file')) { if (Storage::disk('public')->exists($medium->path)) { Storage::disk('public')->delete($medium->path); } $file = $request->file('file'); $originalName = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME); $filename = Str::slug($originalName) ?: 'media-file'; $extension = strtolower($file->getClientOriginalExtension()); $storedName = $filename . '-' . time() . '.' . $extension; $path = $file->storeAs('medium', $storedName, 'public'); $width = null; $height = null; if (str_starts_with($file->getClientMimeType(), 'image/')) { [$width, $height] = getimagesize($file->path()) ?: [null, null]; } $data = array_merge($data, [ 'path' => $path, 'filename' => $storedName, 'mime_type' => $file->getClientMimeType(), 'extension' => $extension, 'size' => $file->getSize(), 'width' => $width, 'height' => $height, ]); } $medium->update($data); return redirect()->route('admin.contents.media.index') ->with('success', 'Media berhasil diperbarui.'); } public function destroy(Media $medium): RedirectResponse { $medium->update([ 'deleted_by' => Auth::id(), ]); $medium->delete(); return redirect()->route('admin.contents.media.index') ->with('success', 'Media berhasil dihapus.'); } }