HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/vhost/disk-apps/dev-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');
    }
}