File: /var/www/vhost/disk-apps/demo-telemedicina.teky.com.co/app/Http/Controllers/ZoomController.php
<?php
namespace Telemedicina\Http\Controllers;
use DateTime;
use DateTimeZone;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use MacsiDigital\Zoom\Zoom;
use MacsiDigital\Zoom\MeetingSetting;
use Telemedicina\User;
use Telemedicina\VideoOpenTok;
use Session;
class ZoomController extends Controller
{
public function createSessionP2P(Request $request){
if(!$request->guest_id && !$request->document){
Session::flash('data', array('type' => 'error', 'message' => __('messages.opentok.not_valid_user_error')));
return redirect()->back();
}
$request_guest_id = $request->guest_id;
if(!$request_guest_id){
$patient = User::where('document', $request->document)->first();
$request_guest_id = $patient->id;
}else{
$patient = User::where('id', $request_guest_id)->first();
}
$zoom = new Zoom;
$medic = Auth::user();
$exists = VideoOpenTok::where('host_id', Auth::user()->id)->get();
foreach ($exists as $e) {
$e->delete();
}
$this->deleteMyMeetings(Auth::user()->email);
// if($exist){
// $this->sendNotificationUser($request_guest_id);
// return view ('video-chat.video-join-zoom')
// ->with('signature', $this->generateSignature(config('zoom.api_key'), config('zoom.api_secret'), $exist->session_id, 1))
// ->with('meetingNumber', $exist->session_id)
// ->with('api_key', config('zoom.api_key'))
// ->with('meetingPassword', $exist->password)
// ->with('medic', $medic->name)
// ->with('medic_email', $medic->email)
// ->with('patient_name', $patient->name . " " . $patient->last_name);
// }
try{
// $userHost = $zoom->user->find('contacto@aliansap.com.co'); // Find user in account.
$userHost = $zoom->user->find(Auth::user()->email); // Find user in account.
$meetingPassword = $this->generateRandomPassword();
$startTimeMeeting = new DateTime();
$startTimeMeeting->setTimeZone(new DateTimeZone('UTC'));
$meetingSettings = new MeetingSetting;
$meetingSettings->waiting_room = 'false';
$meeting = $userHost->meetings()->create([
'topic' => 'Meet '. $medic->name,
'password' => $meetingPassword,
'type' => '2', // 1: Instant, 2: Scheduled, 3: Recurrent, 8: Recurring with fixedtime
'start_time' => $startTimeMeeting->format('Y-m-d\TH:i:s\Z'),
'timezone' => config('app.timezone'),
'settings' => $meetingSettings
]);
// Store Session.
$v = new VideoOpenTok;
$v->session_id = $meeting->id;
$v->password = $meetingPassword;
$v->host_id = Auth::user()->id;
$v->guest_id = $request_guest_id;
$v->is_host_login = true;
$v->is_full = false;
$v->active = true;
$v->save();
// Send notification to user.
$this->sendNotificationUser($request_guest_id);
return view ('video-chat.video-join-zoom')
->with('signature', $this->generateSignature(config('zoom.api_key'), config('zoom.api_secret'), $meeting->id, 1))
->with('meetingNumber', $meeting->id)
->with('api_key', config('zoom.api_key'))
->with('meetingPassword', $meetingPassword)
->with('medic', $medic->name)
->with('medic_email', $medic->email)
->with('patient_name', $patient->name . " " . $patient->last_name);
}catch (\Exception $ex){
return $ex;
}
}
function joinSessionUser(Request $request){
}
function deleteMyMeetings($email){
try {
$zoom = new Zoom;
$userHost = $zoom->user->find($email); // Find user in account.
$meetings = $userHost->meetings()->get();
foreach ($meetings as $m) {
$m->delete();
}
} catch (\Exception $ex){}
}
function exitMeeting($meetingNumber){
try {
$v = VideoOpenTok::where('host_id', Auth::user()->id)->first();
$zoom = new Zoom;
$userHost = $zoom->user->find(Auth::user()->email); // Find user in account.
$m = $userHost->meetings()->find($meetingNumber);
$m->delete();
$v->delete();
} catch (\Exception $ex){}
return redirect('https://google.com');
}
function generateSignature ( $api_key, $api_secret, $meeting_number, $role){
$time = time() * 1000 - 20000;//time in milliseconds (or close enough)
$data = base64_encode($api_key . $meeting_number . $time . $role);
$hash = hash_hmac('sha256', $data, $api_secret, true);
$_sig = $api_key . "." . $meeting_number . "." . $time . "." . $role . "." . base64_encode($hash);
//return signature, url safe base64 encoded
return rtrim(strtr(base64_encode($_sig), '+/', '-_'), '=');
}
function generateRandomPassword($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
private function sendNotificationUser($user_id){
$tags = array(
["field" => "tag", "key" => "user_id", "relation" => "=", "value" => $user_id],
["field" => "tag", "key" => "app_name", "relation" => "=", "value" => config('app.name')]
);
$data = array(
"type" => "videocall",
"id" => Auth::user()->id
);
OneSignalController::sendToTags(__('messages.opentok.notification_text'), $tags, null, $data, null, null, 'U');
}
}