Files
aso/Modules/Linksehat/Http/Controllers/Api/ChatController.php
2024-05-14 13:22:16 +07:00

200 lines
7.1 KiB
PHP

<?php
namespace Modules\Linksehat\Http\Controllers\Api;
use App\Models\Channel;
use App\Events\ChatMessageSent;
use App\Models\UserChannel;
use App\Models\Message;
use App\Models\File;
use App\Models\Person;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserDetail;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
use Pusher\Pusher;
class ChatController extends Controller
{
public function createChannel(Request $request){
// Validasi data yang diterima dari request
$validatedData = $request->validate([
'member_id' => 'required',
'doctor_id' => 'required',
], [
'member_id.required' => 'Member ID harus diisi.',
'doctor_id.required' => 'Doctor ID harus diisi.',
]);
// Buat dan simpan data channel ke dalam tabel
$channel = Channel::updateOrCreate([
'name' => $request->member_id .'_' . $request->doctor_id,
],
[
'name' => $request->member_id .'_' . $request->doctor_id,
'type' => $request->type,
'member_id' => $request->member_id,
'doctor_id' => $request->doctor_id,
// Jika ada kolom tambahan, tambahkan di sini
]);
// Menggunakan updateOrCreate untuk menambahkan data UserChannel untuk member_id
$userChannelMember = UserChannel::updateOrCreate(
[
'user_id' => $request->member_id,
'channel_id' => $channel->id
],
[
'user_id' => $request->member_id,
'channel_id' => $channel->id
]
);
// Menggunakan updateOrCreate untuk menambahkan data UserChannel untuk doctor_id
$userChannelDoctor = UserChannel::updateOrCreate(
[
'user_id' => $request->doctor_id,
'channel_id' => $channel->id
],
[
'user_id' => $request->doctor_id,
'channel_id' => $channel->id
]
);
// Berikan respons yang sesuai ke klien
return response()->json(['message' => 'Channel created successfully', 'channel' => $channel]);
}
public function listChannel(Request $request){
// Validasi request jika diperlukan
$channel = Channel::where('member_id',$request->user_id)->get()->toArray();
if (!$channel) {
$dataChannel = Channel::where('doctor_id',$request->user_id)->get()->toArray();
$data = [];
if ($dataChannel){
foreach($dataChannel as $d){
$user = User::with('detail')->where('nID', $d['member_id'])->first();
$lastMessage = Message::where('channel_id', $d['id'])
->latest('created_at')
->first();
$urlAvatarDefault = $user->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $user->detail->sImage ?? $urlAvatarDefault;
$arr['id'] = $d['id'];
$arr['avatar'] = $avatarMember;
$arr['name'] = $user->sFirstName .' '.$user->sLastName;
$arr['last_message'] = $lastMessage;
array_push($data, $arr);
}
}
$channel = $data;
}
return response()->json(['message' => 'Get List Channel successfully', 'channel' => $channel]);
}
public function sendMessage(Request $request)
{
// Validasi request jika diperlukan
$validatedData = $request->validate([
'user_id' => 'required'
]);
// Ambil data dari request
$message = Message::create([
'content' => $request->message,
'from_user' => $request->user_id,
'channel_id' => $request->channel_id,
'type' => $request->message ? 'text' : 'file'
]);
$pathFile = null;
if ($request->hasFile('file_chat')) {
foreach ($request->file_chat as $file) {
$pathFile = File::storeFile('chat', $message->id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\Message',
'fileable_id' => $message->id,
'type' => 'chat',
'name' => File::getFileName('chat', $message->id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
$message->update([
'content' => env('LMS_APP_STORAGE') . 'storage/' . $pathFile,
'from_user' => $request->user_id,
'channel_id' => $request->channel_id,
'type' => 'file',
]);
}
$data = Message::where('channel_id', $request->channel_id)->get()->toArray();
// Berikan respons yang sesuai ke klien
$channel = Channel::where('id',$request->channel_id)->first();
if($channel->member_id == $request->user_id){
// Get nama dokter
$person = Person::where('id', $channel->doctor_id)->first();
$name = $person->name;
} else {
// Get nama pasien
$person = User::where('nID', $channel->member_id)->first();
$name = $person->sFirstName . ' ' . $person->sLastName;
}
ChatMessageSent::dispatch($message);
return response()->json([
'message' => 'Message sent successfully',
'data' => [
'header' => $name,
'chat' => $data
]
]);
}
public function getMessage(Request $request)
{
// Buat instance Pusher dengan konfigurasi yang sesuai
$pusher = new Pusher(
env('PUSHER_APP_KEY'),
env('PUSHER_APP_SECRET'),
env('PUSHER_APP_ID'),
[
'cluster' => env('PUSHER_APP_CLUSTER'),
'useTLS' => true,
]
);
$channel = Channel::where('id',$request->channel_id)->first();
if($channel->member_id == $request->user_id){
// Get nama dokter
$person = Person::where('id', $channel->doctor_id)->first();
$name = $person->name;
} else {
// Get nama pasien
$person = User::where('nID', $channel->member_id)->first();
$name = $person->sFirstName . ' ' . $person->sLastName;
}
$data = Message::where('channel_id', $request->channel_id)->get()->toArray();
// Berikan respons yang sesuai ke klien
return response()->json([
'message' => 'Message sent successfully',
'data' => [
'header' => $name,
'chat' => $data
]
]);
}
}