200 lines
7.1 KiB
PHP
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
|
|
]
|
|
]);
|
|
}
|
|
}
|