Recaje-New/app/Http/Controllers/Admin/CafeController.php

499 lines
19 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Cafe;
use App\Models\Category;
use App\Models\Subcategory;
use App\Models\CafeRating;
use App\Models\CafeImage;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class CafeController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$cafes = Cafe::latest()->paginate(10);
return view('admin.cafes.index', compact('cafes'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
$categories = Category::all();
$subcategories = Subcategory::all();
return view('admin.cafes.create', compact('categories', 'subcategories'));
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$request->validate([
'nama' => 'required',
'area' => 'nullable|array',
'area.*' => 'nullable|string',
'latitude' => 'required|numeric',
'longitude' => 'required|numeric',
'koordinat' => 'required|string',
'harga_termurah' => 'nullable|numeric|min:0',
'harga_termahal' => 'nullable|numeric|min:0|gte:harga_termurah',
'category_ratings' => 'required|array',
'category_ratings.*' => 'required|exists:subcategories,id',
'gambar.*' => 'nullable|image|mimes:jpeg,png,jpg|max:2048',
]);
try {
DB::beginTransaction();
$data = [
'nama' => $request->nama,
'lokasi' => $request->koordinat,
'area' => $request->area ? implode(', ', $request->area) : null,
'latitude' => $request->latitude,
'longitude' => $request->longitude,
'harga_termurah' => $request->harga_termurah,
'harga_termahal' => $request->harga_termahal,
];
// Handle koordinat field if it exists and latitude/longitude are not set
if ($request->filled('koordinat') && (!$request->filled('latitude') || !$request->filled('longitude'))) {
$koordinat = $request->koordinat;
$koordinatArray = explode(',', $koordinat);
if (count($koordinatArray) === 2) {
$latitude = trim($koordinatArray[0]);
$longitude = trim($koordinatArray[1]);
if (is_numeric($latitude) && is_numeric($longitude)) {
$data['latitude'] = $latitude;
$data['longitude'] = $longitude;
}
}
}
// Buat cafe
$cafe = Cafe::create($data);
// Untuk menyimpan gambar pertama yang akan digunakan di kolom gambar
$firstImagePath = null;
// Handle multiple image upload
if ($request->hasFile('gambar')) {
foreach ($request->file('gambar') as $index => $image) {
$imageName = time() . '_' . uniqid() . '.' . $image->extension();
$imagePath = 'images/cafes/' . $imageName;
$image->move(public_path('images/cafes'), $imageName);
CafeImage::create([
'cafe_id' => $cafe->id,
'image_path' => $imagePath
]);
// Simpan path gambar pertama
if ($index === 0) {
$firstImagePath = $imagePath;
}
}
// Update kolom gambar di tabel cafe dengan gambar pertama
if ($firstImagePath) {
$cafe->gambar = $firstImagePath;
$cafe->save();
}
}
// Simpan rating category
if ($request->has('category_ratings')) {
foreach ($request->category_ratings as $categoryId => $subcategoryId) {
$subcategory = Subcategory::findOrFail($subcategoryId);
CafeRating::create([
'cafe_id' => $cafe->id,
'category_id' => $categoryId,
'subcategory_id' => $subcategoryId
]);
}
}
DB::commit();
return redirect()->route('admin.cafes.index')
->with('success', 'Cafe berhasil ditambahkan!');
} catch (\Exception $e) {
DB::rollback();
return redirect()->back()->with('error', 'Terjadi kesalahan: ' . $e->getMessage())->withInput();
}
}
/**
* Display the specified resource.
*/
public function show(Cafe $cafe)
{
return view('admin.cafes.show', compact('cafe'));
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Cafe $cafe)
{
// Tambahkan ini untuk debugging
\Log::info('Old Input Session:', session()->get('_old_input', []));
\Log::info('Direct from DB: Lat=' . $cafe->latitude . ', Lng=' . $cafe->longitude);
// Hapus semua data yang tersimpan di session untuk cafe ini
session()->forget('_old_input');
session()->forget("_cafe_{$cafe->id}_coordinates");
// Paksa untuk mengambil data cafe langsung dari database
$cafe = Cafe::where('id', $cafe->id)->first();
// Simpan timestamp untuk tracking cache
$timestamp = time();
// Tambahan debug info
\Log::info("Fetching fresh data for cafe {$cafe->id}, Timestamp: {$timestamp}");
\Log::info("Fresh coordinates: Lat={$cafe->latitude}, Lng={$cafe->longitude}");
// Buat koordinat langsung tanpa old()
return view('admin.cafes.edit', [
'cafe' => $cafe,
'timestamp' => $timestamp,
'categories' => Category::all(),
'subcategories' => Subcategory::all(),
'cafeRatings' => $cafe->ratings()->pluck('subcategory_id', 'category_id')->toArray()
]);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Cafe $cafe)
{
$request->validate([
'nama' => 'required',
'area' => 'nullable|array',
'area.*' => 'nullable|string',
'latitude' => 'required|numeric',
'longitude' => 'required|numeric',
'koordinat' => 'required|string',
'harga_termurah' => 'nullable|numeric|min:0',
'harga_termahal' => 'nullable|numeric|min:0|gte:harga_termurah',
'category_ratings' => 'required|array',
'category_ratings.*' => 'required|exists:subcategories,id',
'gambar.*' => 'nullable|image|mimes:jpeg,png,jpg|max:2048',
]);
try {
DB::beginTransaction();
// Debug: nilai sebelum update
\Log::info("BEFORE UPDATE - ID: {$cafe->id}, Lokasi: {$cafe->lokasi}, Latitude: {$cafe->latitude}, Longitude: {$cafe->longitude}");
\Log::info("INPUT VALUES - Koordinat: {$request->koordinat}, Latitude: {$request->latitude}, Longitude: {$request->longitude}");
// Ensure koordinat, latitude and longitude are in sync
// Parse koordinat to extract latitude and longitude
$koordinatArray = explode(',', $request->koordinat);
if (count($koordinatArray) === 2) {
$latitude = trim($koordinatArray[0]);
$longitude = trim($koordinatArray[1]);
// Verify values are numeric
if (is_numeric($latitude) && is_numeric($longitude)) {
$data = [
'nama' => $request->nama,
'lokasi' => $request->koordinat,
'area' => $request->area ? implode(', ', $request->area) : null,
'latitude' => $latitude,
'longitude' => $longitude,
'harga_termurah' => $request->harga_termurah,
'harga_termahal' => $request->harga_termahal,
];
// Force sync latitude/longitude from koordinat
$request->merge([
'latitude' => $latitude,
'longitude' => $longitude
]);
} else {
// Use provided latitude/longitude if parsing failed
$data = [
'nama' => $request->nama,
'lokasi' => $request->koordinat,
'area' => $request->area ? implode(', ', $request->area) : null,
'latitude' => $request->latitude,
'longitude' => $request->longitude,
'harga_termurah' => $request->harga_termurah,
'harga_termahal' => $request->harga_termahal,
];
}
} else {
// Use provided latitude/longitude if parsing failed
$data = [
'nama' => $request->nama,
'lokasi' => $request->koordinat,
'area' => $request->area ? implode(', ', $request->area) : null,
'latitude' => $request->latitude,
'longitude' => $request->longitude,
'harga_termurah' => $request->harga_termurah,
'harga_termahal' => $request->harga_termahal,
];
}
// Update cafe
$cafe->update($data);
// Verify update success by re-fetching from DB
$updatedCafe = Cafe::find($cafe->id);
\Log::info("AFTER UPDATE - ID: {$updatedCafe->id}, Lokasi: {$updatedCafe->lokasi}, Latitude: {$updatedCafe->latitude}, Longitude: {$updatedCafe->longitude}");
// Flag untuk menandai apakah ada gambar baru yang ditambahkan
$newImagesAdded = false;
// Handle multiple image upload
if ($request->hasFile('gambar')) {
$newImagesAdded = true;
foreach ($request->file('gambar') as $image) {
$imageName = time() . '_' . uniqid() . '.' . $image->extension();
$imagePath = 'images/cafes/' . $imageName;
$image->move(public_path('images/cafes'), $imageName);
CafeImage::create([
'cafe_id' => $cafe->id,
'image_path' => $imagePath
]);
}
}
// Hapus rating lama
$cafe->ratings()->delete();
// Simpan rating category baru
if ($request->has('category_ratings')) {
foreach ($request->category_ratings as $categoryId => $subcategoryId) {
$subcategory = Subcategory::findOrFail($subcategoryId);
CafeRating::create([
'cafe_id' => $cafe->id,
'category_id' => $categoryId,
'subcategory_id' => $subcategoryId
]);
}
}
// Update kolom gambar di tabel cafe jika gambar baru ditambahkan
// atau jika kolom gambar masih kosong
if ($newImagesAdded || empty($cafe->gambar)) {
$this->updateCafeMainImage($cafe->id);
}
DB::commit();
return redirect()->route('admin.cafes.index')
->with('success', 'Cafe berhasil diperbarui!');
} catch (\Exception $e) {
DB::rollback();
return redirect()->back()->with('error', 'Terjadi kesalahan: ' . $e->getMessage())->withInput();
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Cafe $cafe)
{
$cafe->delete();
return redirect()->route('admin.cafes.index')
->with('success', 'Cafe berhasil dihapus!');
}
/**
* Delete cafe image
*/
public function deleteImage($id)
{
try {
// Cari gambar berdasarkan ID
$image = CafeImage::findOrFail($id);
$cafeId = $image->cafe_id;
// Hapus file fisik jika ada
if (file_exists(public_path($image->image_path))) {
unlink(public_path($image->image_path));
} else {
// Log jika file tidak ditemukan
\Log::warning("File tidak ditemukan: {$image->image_path}");
}
// Hapus record dari database
$image->delete();
// Jika gambar yang dihapus adalah gambar utama, update kolom gambar di tabel cafes
$cafe = Cafe::find($cafeId);
if ($cafe && $cafe->gambar === $image->image_path) {
$this->updateCafeMainImage($cafeId);
}
return response()->json(['success' => true, 'message' => 'Gambar berhasil dihapus']);
} catch (\Exception $e) {
// Log error untuk debugging
\Log::error("Error menghapus gambar: " . $e->getMessage());
return response()->json(['success' => false, 'message' => $e->getMessage()], 500);
}
}
/**
* Update main image in cafes table with the image that has the smallest ID
*/
private function updateCafeMainImage($cafeId)
{
// Ambil gambar dengan ID terkecil dari tabel cafe_images
$firstImage = CafeImage::where('cafe_id', $cafeId)
->orderBy('id', 'asc')
->first();
$cafe = Cafe::find($cafeId);
if ($cafe) {
if ($firstImage) {
// Update kolom gambar dengan path gambar yang memiliki ID terkecil
$cafe->gambar = $firstImage->image_path;
} else {
// Jika tidak ada gambar, kosongkan kolom gambar
$cafe->gambar = null;
}
$cafe->save();
}
}
/**
* Update image order
*/
public function updateImageOrder(Request $request)
{
try {
// Ambil data dari request, baik berupa form reguler atau JSON
if ($request->isJson() || $request->expectsJson() || $request->header('Content-Type') === 'application/json') {
// Untuk request JSON (fetch API)
$data = $request->json()->all();
$cafeId = $data['cafe_id'] ?? null;
$imageIds = $data['image_ids'] ?? [];
} else {
// Untuk request form biasa (jQuery Ajax)
$cafeId = $request->input('cafe_id');
$imageIds = $request->input('image_ids', []);
}
// Validasi Data
if (!$cafeId || empty($imageIds)) {
return response()->json([
'success' => false,
'message' => 'Data cafe_id dan image_ids diperlukan'
], 400);
}
// Log untuk debugging
\Log::info('Updating image order for cafe: ' . $cafeId);
\Log::info('Image IDs: ' . print_r($imageIds, true));
// Perbarui urutan (sort_order) gambar
foreach ($imageIds as $index => $imageId) {
CafeImage::where('id', $imageId)
->update(['sort_order' => $index + 1]); // +1 agar urutan dimulai dari 1
}
// Perbarui gambar utama cafe (gunakan gambar pertama sebagai gambar utama)
if (!empty($imageIds)) {
$firstImageId = $imageIds[0];
$firstImage = CafeImage::find($firstImageId);
if ($firstImage) {
$cafe = Cafe::find($cafeId);
if ($cafe) {
$cafe->gambar = $firstImage->image_path;
$cafe->save();
}
}
}
return response()->json(['success' => true, 'message' => 'Urutan gambar berhasil diperbarui']);
} catch (\Exception $e) {
\Log::error("Error mengatur urutan gambar: " . $e->getMessage());
\Log::error("Stack trace: " . $e->getTraceAsString());
return response()->json(['success' => false, 'message' => $e->getMessage()], 500);
}
}
/**
* Fix coordinates from lokasi field
*/
public function fixCoordinates($id)
{
try {
// Cari cafe berdasarkan ID
$cafe = Cafe::findOrFail($id);
// Ambil nilai lokasi
$lokasi = $cafe->lokasi;
// Parsing lokasi untuk mendapatkan latitude dan longitude
$koordinatArray = explode(',', $lokasi);
if (count($koordinatArray) === 2) {
$latitude = trim($koordinatArray[0]);
$longitude = trim($koordinatArray[1]);
// Verify values are numeric
if (is_numeric($latitude) && is_numeric($longitude)) {
// Update nilai latitude dan longitude
$cafe->latitude = $latitude;
$cafe->longitude = $longitude;
$cafe->save();
\Log::info("Fixed coordinates - ID: {$cafe->id}, Lokasi: {$lokasi}, New Lat: {$latitude}, New Lng: {$longitude}");
return response()->json([
'success' => true,
'message' => 'Koordinat berhasil diperbaiki',
'data' => [
'id' => $cafe->id,
'latitude' => $cafe->latitude,
'longitude' => $cafe->longitude,
'lokasi' => $cafe->lokasi
]
]);
} else {
return response()->json([
'success' => false,
'message' => 'Nilai latitude/longitude tidak valid (bukan angka)'
], 400);
}
} else {
return response()->json([
'success' => false,
'message' => 'Format lokasi tidak valid, seharusnya "latitude, longitude"'
], 400);
}
} catch (\Exception $e) {
\Log::error("Error fixing coordinates: " . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Terjadi kesalahan: ' . $e->getMessage()
], 500);
}
}
}