MIF_E31231594/app/Http/Controllers/Ketua/DokumentasiController.php

288 lines
7.8 KiB
PHP

<?php
namespace App\Http\Controllers\Ketua;
use App\Http\Controllers\Controller;
use App\Models\Dokumentasi;
use App\Models\Kegiatan;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;
use Illuminate\View\View;
class DokumentasiController extends Controller
{
private const DIRECTORY = 'dokumentasi-kegiatan';
public function __invoke(Request $request): View
{
$user = auth()->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.'
);
}
}