286 lines
9.5 KiB
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
|
|
}
|
|
}
|