MIF_E31220412/app/Http/Controllers/ChatController.php

286 lines
9.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Chat;
use App\Models\Sewa;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
class ChatController extends Controller
{
public function __construct()
{
$this->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
}
}