middleware('auth'); } public function index() { // Tampilkan daftar chat berdasarkan tipe_pengguna user if (Auth::user()->tipe_pengguna === 'admin') { // Untuk admin, tampilkan semua pengguna yang memiliki chat $users = User::where('tipe_pengguna', '!=', 'admin') ->withCount(['sentChats as unread_chats_count' => function($query) { $query->where('is_read', false); }]) ->orderBy('nama') ->get(); return view('chat.index', compact('users')); } else { // Untuk user biasa, tampilkan chat dengan admin $adminUsers = User::where('tipe_pengguna', 'admin') ->get(); return view('chat.index', compact('adminUsers')); } } public function show($user_id) { try { \Log::info('Chat Show Method - Start', [ 'user_id' => $user_id, 'auth_user' => [ 'id' => Auth::id(), 'tipe_pengguna' => Auth::user()->tipe_pengguna ] ]); // Cek apakah user yang diminta ada $chatUser = User::findOrFail($user_id); \Log::info('Chat User Found', [ 'chat_user' => [ 'id' => $chatUser->id, 'nama' => $chatUser->nama, 'tipe_pengguna' => $chatUser->tipe_pengguna ] ]); // Jika user biasa mencoba mengakses chat dengan user non-admin lain, tolak if (Auth::user()->tipe_pengguna !== 'admin' && $chatUser->tipe_pengguna !== 'admin') { abort(403, 'Anda hanya dapat chat dengan admin.'); } // Jika admin mencoba chat dengan admin lain, tolak if (Auth::user()->tipe_pengguna === 'admin' && $chatUser->tipe_pengguna === 'admin') { abort(403, 'Admin tidak dapat chat dengan admin lain.'); } // Ambil riwayat chat antara kedua user $chats = Chat::where(function($query) use ($user_id) { $query->where('sender_id', Auth::id()) ->where('receiver_id', $user_id); })->orWhere(function($query) use ($user_id) { $query->where('sender_id', $user_id) ->where('receiver_id', Auth::id()); })->orderBy('created_at', 'asc')->get(); \Log::info('Chats Retrieved', [ 'count' => $chats->count() ]); return view('chat.chat_view', compact('chatUser', 'chats')); } catch (\Exception $e) { \Log::error('Error in Chat Show Method', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return back()->with('error', 'Terjadi kesalahan saat membuka chat.'); } } // Helper untuk mendapatkan atau membuat sewa untuk chat private function getOrCreateSewaForChat($user_id) { try { \Log::info('Getting or Creating Sewa for Chat', [ 'user_id' => $user_id ]); // Cari sewa terakhir dari user tersebut $sewa = Sewa::where('user_id', $user_id) ->latest() ->first(); if ($sewa) { \Log::info('Existing Sewa Found', [ 'sewa_id' => $sewa->id, 'status' => $sewa->status ]); return $sewa; } // Jika tidak ada sewa, buat sewa dummy untuk chat \Log::info('No existing sewa found, creating dummy sewa'); // Cari paket pertama yang aktif untuk digunakan sebagai dummy $paket = \App\Models\Paket::where('status', 'aktif')->first(); if (!$paket) { \Log::error('No active package found for dummy sewa'); throw new \Exception('Tidak dapat membuat chat karena tidak ada paket yang tersedia.'); } // Buat sewa dummy $sewa = Sewa::create([ 'user_id' => $user_id, 'paket_id' => $paket->id, 'tanggal_mulai' => now(), 'tanggal_selesai' => now()->addDays(1), 'lokasi' => 'Chat Admin', 'catatan' => 'Sewa otomatis dibuat untuk keperluan chat', 'total_harga' => 0, 'status' => 'chat_only' ]); \Log::info('Dummy Sewa Created', [ 'sewa_id' => $sewa->id, 'user_id' => $sewa->user_id, 'paket_id' => $sewa->paket_id ]); return $sewa; } catch (\Exception $e) { \Log::error('Error in getOrCreateSewaForChat', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); throw $e; } } public function getNewMessages(Request $request, $user_id) { try { // Cek apakah user yang diminta ada $chatUser = User::findOrFail($user_id); // Ambil sewa untuk keperluan chat if (Auth::user()->tipe_pengguna === 'admin') { $sewa = $this->getOrCreateSewaForChat($chatUser->id); } else { $sewa = $this->getOrCreateSewaForChat(Auth::id()); } $messages = Chat::with('sender') ->where('sewa_id', $sewa->id) ->where('id', '>', $request->query('after', 0)) ->orderBy('created_at', 'asc') ->get(); // Tandai pesan baru sebagai sudah dibaca Chat::where('sewa_id', $sewa->id) ->where('sender_id', '!=', auth()->id()) ->where('is_read', false) ->update(['is_read' => true]); return response()->json([ 'messages' => $messages ]); } catch (\Exception $e) { return response()->json([ 'error' => 'Terjadi kesalahan: ' . $e->getMessage() ], 500); } } public function store(Request $request, $user_id) { try { \Log::info('Chat Store Method - Start', [ 'user_id' => $user_id, 'message' => $request->message ]); $request->validate([ 'message' => 'required|string' ]); // Cek apakah user yang diminta ada $receiver = User::findOrFail($user_id); // Ambil sewa untuk keperluan chat if (Auth::user()->tipe_pengguna === 'admin') { $sewa = $this->getOrCreateSewaForChat($receiver->id); } else { $sewa = $this->getOrCreateSewaForChat(Auth::id()); } $chat = Chat::create([ 'sewa_id' => $sewa->id, 'sender_id' => Auth::id(), 'receiver_id' => $user_id, 'message' => $request->message, 'is_read' => false ]); \Log::info('Chat Created', [ 'chat_id' => $chat->id ]); return back()->with('success', 'Pesan terkirim'); } catch (\Exception $e) { \Log::error('Error in Chat Store Method', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return back()->with('error', 'Gagal mengirim pesan: ' . $e->getMessage()); } } public function markAsRead($user_id) { try { // Cek apakah user yang diminta ada $chatUser = User::findOrFail($user_id); // Ambil sewa untuk keperluan chat if (Auth::user()->tipe_pengguna === 'admin') { $sewa = $this->getOrCreateSewaForChat($chatUser->id); } else { $sewa = $this->getOrCreateSewaForChat(Auth::id()); } Chat::where('sewa_id', $sewa->id) ->where('sender_id', '!=', auth()->id()) ->where('is_read', false) ->update(['is_read' => true]); return response()->json(['success' => true]); } catch (\Exception $e) { return response()->json([ 'error' => 'Terjadi kesalahan: ' . $e->getMessage() ], 500); } } public function getUnreadCount() { $query = Chat::where('is_read', false) ->where('sender_id', '!=', auth()->id()); if (auth()->user()->tipe_pengguna !== 'admin') { $query->whereHas('sewa', function($q) { $q->where('user_id', auth()->id()); }); } $unreadCount = $query->count(); return response()->json(['count' => $unreadCount]); } // Helper untuk mendapatkan ID admin pertama (untuk chat dari user ke admin) public static function getFirstAdminId() { $admin = User::where('tipe_pengguna', 'admin')->first(); return $admin ? $admin->id : 1; // Default ke ID 1 jika tidak ada admin } }