user(); $organisasi = $user->organisasiSebagaiKetua()->first(); $organisasiId = $organisasi?->id; $filterNamaKegiatan = trim((string) $request->query('nama_kegiatan', '')); $search = trim((string) $request->query('search', '')); $dokumentasi = Dokumentasi::with('kegiatan:id,nama_kegiatan') ->whereHas('kegiatan', function ($query) use ($organisasiId) { $query->where('organisasi_id', $organisasiId); }) ->when($filterNamaKegiatan !== '', function ($query) use ($filterNamaKegiatan) { $query->whereHas('kegiatan', function ($kegiatanQuery) use ($filterNamaKegiatan) { $kegiatanQuery->where('nama_kegiatan', 'like', '%' . $filterNamaKegiatan . '%'); }); }) ->when($search !== '', function ($query) use ($search) { $query->where(function ($q) use ($search) { $q->where('keterangan', 'like', "%{$search}%") ->orWhereHas('kegiatan', function ($kegiatanQuery) use ($search) { $kegiatanQuery->where('nama_kegiatan', 'like', "%{$search}%"); }); }); }) ->latest('id') ->get([ 'id', 'kegiatan_id', 'file_dokumentasi', 'keterangan' ]); $kegiatanList = Kegiatan::where('organisasi_id', $organisasiId) ->where('status', 'disetujui admin') ->orderBy('nama_kegiatan') ->get([ 'id', 'nama_kegiatan' ]); return view( 'ketua.dokumentasi', compact( 'dokumentasi', 'kegiatanList', 'filterNamaKegiatan', 'search' ) ); } public function store(Request $request): RedirectResponse { $user = auth()->user(); $organisasi = $user->organisasiSebagaiKetua()->first(); $organisasiId = $organisasi?->id; if (! $organisasiId) { return redirect() ->route('ketua.dokumentasi') ->with( 'error', 'Anda belum menjadi ketua di organisasi manapun.' ); } $files = $request->file('file_dokumentasi', []); $totalFiles = count($files); $validated = $request->validate([ 'kegiatan_id' => [ 'required', 'integer', Rule::exists('kegiatan', 'id')->where( fn ($query) => $query ->where('organisasi_id', $organisasiId) ->where('status', 'disetujui admin') ), ], 'keterangan' => [ 'nullable', 'array', ], 'keterangan.*' => [ 'nullable', 'string' ], 'file_dokumentasi' => [ 'required', 'array', 'min:1' ], 'file_dokumentasi.*' => [ 'required', 'image', 'mimes:jpg,jpeg,png,webp', 'max:5120' ], ]); $folder = self::DIRECTORY . '/' . Str::slug($organisasi->nama_organisasi); foreach ($files as $index => $file) { $filename = time() . '_' . $file->getClientOriginalName(); $storedPath = $file->storeAs( $folder, $filename, 'public' ); Dokumentasi::create([ 'kegiatan_id' => $validated['kegiatan_id'], 'keterangan' => $validated['keterangan'][$index] ?? null, 'file_dokumentasi' => $storedPath, ]); } return redirect() ->route('ketua.dokumentasi') ->with( 'success', 'Dokumentasi berhasil diunggah.' ); } public function update( Request $request, Dokumentasi $dokumentasi ): RedirectResponse { $user = auth()->user(); $organisasi = $user->organisasiSebagaiKetua()->first(); $organisasiId = $organisasi?->id; $isAuthorized = Kegiatan::where('id', $dokumentasi->kegiatan_id) ->where('organisasi_id', $organisasiId) ->exists(); if (! $isAuthorized) { return redirect() ->route('ketua.dokumentasi') ->with( 'error', 'Anda tidak punya akses ke dokumentasi ini.' ); } $validated = $request->validate([ 'kegiatan_id' => [ 'required', 'integer', Rule::exists('kegiatan', 'id')->where( fn ($query) => $query->where('organisasi_id', $organisasiId) ), ], 'keterangan' => [ 'nullable', 'string' ], 'file_dokumentasi' => [ 'nullable', 'image', 'mimes:jpg,jpeg,png,webp', 'max:5120' ], ]); if ($request->hasFile('file_dokumentasi')) { if ( $dokumentasi->file_dokumentasi && ! str_starts_with($dokumentasi->file_dokumentasi, 'http') ) { Storage::disk('public') ->delete($dokumentasi->file_dokumentasi); } $folder = self::DIRECTORY . '/' . Str::slug($organisasi->nama_organisasi); $file = $request->file('file_dokumentasi'); $filename = time() . '_' . $file->getClientOriginalName(); $validated['file_dokumentasi'] = $file->storeAs( $folder, $filename, 'public' ); } else { unset($validated['file_dokumentasi']); } $dokumentasi->update($validated); return redirect() ->route('ketua.dokumentasi') ->with( 'success', 'Dokumentasi berhasil diperbarui.' ); } public function destroy( Dokumentasi $dokumentasi ): RedirectResponse { $user = auth()->user(); $organisasi = $user->organisasiSebagaiKetua()->first(); $organisasiId = $organisasi?->id; $isAuthorized = Kegiatan::where('id', $dokumentasi->kegiatan_id) ->where('organisasi_id', $organisasiId) ->exists(); if (! $isAuthorized) { return redirect() ->route('ketua.dokumentasi') ->with( 'error', 'Anda tidak punya akses ke dokumentasi ini.' ); } if ( $dokumentasi->file_dokumentasi && ! str_starts_with($dokumentasi->file_dokumentasi, 'http') ) { Storage::disk('public') ->delete($dokumentasi->file_dokumentasi); } $dokumentasi->delete(); return redirect() ->route('ketua.dokumentasi') ->with( 'success', 'Dokumentasi berhasil dihapus.' ); } }