MIF_E31230069/spk_kontrakan/app/Http/Controllers/ReviewController.php

174 lines
4.9 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Review;
use App\Models\Kontrakan;
use App\Models\Laundry;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class ReviewController extends Controller
{
/**
* Tampilkan form review (opsional, bisa langsung di view detail)
*/
public function create($type, $id)
{
$item = $this->getItem($type, $id);
if (!$item) {
return back()->with('error', ucfirst($type) . ' tidak ditemukan');
}
return view('reviews.create', compact('item', 'type'));
}
/**
* Store review untuk kontrakan
*/
public function storeKontrakan(Request $request, Kontrakan $kontrakan)
{
$request->validate([
'rating' => 'required|integer|min:1|max:5',
'review' => 'nullable|string|max:1000'
]);
// Cek apakah user sudah pernah review
$existingReview = Review::where('type', 'kontrakan')
->where('item_id', $kontrakan->id)
->where('user_id', Auth::id())
->first();
if ($existingReview) {
return back()->with('error', 'Anda sudah memberikan review untuk kontrakan ini');
}
Review::create([
'type' => 'kontrakan',
'item_id' => $kontrakan->id,
'user_id' => Auth::id(),
'rating' => $request->rating,
'review' => $request->review
]);
return back()->with('success', 'Review berhasil ditambahkan');
}
/**
* Store review untuk laundry
*/
public function storeLaundry(Request $request, Laundry $laundry)
{
$request->validate([
'rating' => 'required|integer|min:1|max:5',
'review' => 'nullable|string|max:1000'
]);
// Cek apakah user sudah pernah review
$existingReview = Review::where('type', 'laundry')
->where('item_id', $laundry->id)
->where('user_id', Auth::id())
->first();
if ($existingReview) {
return back()->with('error', 'Anda sudah memberikan review untuk laundry ini');
}
Review::create([
'type' => 'laundry',
'item_id' => $laundry->id,
'user_id' => Auth::id(),
'rating' => $request->rating,
'review' => $request->review
]);
return back()->with('success', 'Review berhasil ditambahkan');
}
/**
* Simpan review baru (legacy)
*/
public function store(Request $request, $type, $id)
{
$request->validate([
'rating' => 'required|integer|min:1|max:5',
'review' => 'nullable|string|max:1000'
]);
// Cek apakah user sudah pernah review item ini
$existingReview = Review::where('type', $type)
->where('item_id', $id)
->where('user_id', Auth::id())
->first();
if ($existingReview) {
return back()->with('error', 'Anda sudah memberikan review untuk ' . $type . ' ini');
}
Review::create([
'type' => $type,
'item_id' => $id,
'user_id' => Auth::id(),
'rating' => $request->rating,
'review' => $request->review
]);
return back()->with('success', 'Review berhasil ditambahkan');
}
/**
* Update review
*/
public function update(Request $request, $id)
{
$request->validate([
'rating' => 'required|integer|min:1|max:5',
'review' => 'nullable|string|max:1000'
]);
$review = Review::findOrFail($id);
// Cek apakah user adalah pemilik review
if ($review->user_id !== Auth::id()) {
return back()->with('error', 'Anda tidak memiliki akses untuk mengedit review ini');
}
$review->update([
'rating' => $request->rating,
'review' => $request->review
]);
return back()->with('success', 'Review berhasil diupdate');
}
/**
* Hapus review
*/
public function destroy($id)
{
$review = Review::findOrFail($id);
// Cek apakah user adalah pemilik review atau admin/super_admin
if ($review->user_id !== Auth::id() && !in_array(Auth::user()->role, ['admin', 'super_admin'])) {
return back()->with('error', 'Anda tidak memiliki akses untuk menghapus review ini');
}
$review->delete();
return back()->with('success', 'Review berhasil dihapus');
}
/**
* Helper untuk get item (Kontrakan atau Laundry)
*/
private function getItem($type, $id)
{
if ($type === 'kontrakan') {
return Kontrakan::find($id);
} elseif ($type === 'laundry') {
return Laundry::find($id);
}
return null;
}
}