diff --git a/src/app/Http/Controllers/API/V4/OpenViduController.php b/src/app/Http/Controllers/API/V4/OpenViduController.php index c96f1437..f05f3b48 100644 --- a/src/app/Http/Controllers/API/V4/OpenViduController.php +++ b/src/app/Http/Controllers/API/V4/OpenViduController.php @@ -1,140 +1,49 @@ user(); $room = \App\OpenVidu\Room::where('name', $id)->first(); + // this isn't a room, bye bye if (!$room) { return response()->json(['status' => 'error'], 422); } - // see if room exists, return session and token - $client = new \GuzzleHttp\Client( - [ - 'http_errors' => false, // No exceptions from Guzzle - 'base_uri' => \config('openvidu.api_url'), - 'verify' => \config('openvidu.api_verify_tls') - ] - ); - - $response = $client->request( - 'GET', - "sessions/{$id}", - ['auth' => [\config('openvidu.api_username'), \config('openvidu.api_password')]] - ); - - $sessionExists = $response->getStatusCode() == 200; - - if (!$sessionExists) { - if ($room->user_id == $user->id) { - $json = [ - 'mediaMode' => 'ROUTED', - 'recordingMode' => 'MANUAL', - 'customSessionId' => $room->session_id - ]; - - $response = $client->request( - 'POST', - 'sessions', - [ - 'auth' => [ - \config('openvidu.api_username'), - \config('openvidu.api_password') - ], - 'json' => [ - 'mediaMode' => 'ROUTED', - 'recordingMode' => 'MANUAL' - ] - ] - ); - - if ($response->getStatusCode() !== 200) { - return response()->json(['status' => 'error'], 422); - } - - $response = $client->request( - 'POST', - 'tokens', - [ - 'auth' => [ - \config('openvidu.api_username'), - \config('openvidu.api_password') - ], - 'json' => [ - 'session' => $room->session_id, - 'role' => 'MODERATOR' - ] - ] - ); - - $json = json_decode($response->getBody(), true); - - //$json['token'] .= '&coturnIp=' . \config('openvidu.coturn_ip', 'kanarip.internet-box.ch'); - //$json['token'] .= '&turnUsername=' . \config('openvidu.turn_username', 'openvidu'); - //$json['token'] .= '&turnCredential=' . \config('openvidu.turn_credential', 'openvidu'); - - //$json['id'] = $json['token']; - - \Log::debug("json: " . var_export($json, true)); - - return response()->json($json, 200); - } else { - return response()->json(['status' => 'waiting'], 422); - } + // there's no existing session + if (!$room->hasSession()) { + // TODO: only the room owner should be able to create the session + $room->createSession(); } - $response = $client->request( - 'POST', - 'tokens', - [ - 'auth' => [ - \config('openvidu.api_username'), - \config('openvidu.api_password') - ], - 'json' => [ - 'session' => $room->session_id, - 'role' => 'PUBLISHER' - ] - ] - ); - - $json = json_decode($response->getBody(), true); - - //$json['token'] .= '&coturnIp=' . \config('openvidu.coturn_ip', 'kanarip.internet-box.ch'); - //$json['token'] .= '&turnUsername=' . \config('openvidu.turn_username', 'openvidu'); - //$json['token'] .= '&turnCredential=' . \config('openvidu.turn_credential', 'openvidu'); - - //$json['id'] = $json['token']; - - \Log::debug("json: " . var_export($json, true)); + $json = $room->getSessionToken('PUBLISHER'); return response()->json($json, 200); } /** * Webhook as triggered from OpenVidu server * * @param \Illuminate\Http\Request $request The API request. * * @return \Illuminate\Http\Response The response */ public function webhook(Request $request) { return response('Success', 200); } } diff --git a/src/app/OpenVidu/Room.php b/src/app/OpenVidu/Room.php index 87a478f5..6350ec53 100644 --- a/src/app/OpenVidu/Room.php +++ b/src/app/OpenVidu/Room.php @@ -1,18 +1,94 @@ false, // No exceptions from Guzzle + 'base_uri' => \config('openvidu.api_url'), + 'verify' => \config('openvidu.api_verify_tls'), + 'auth' => [ + \config('openvidu.api_username'), + \config('openvidu.api_password') + ] + ] + ); + } + + return self::$client; + } + + public function createSession() + { + $response = $this->client()->request( + 'POST', + "sessions", + [ + 'json' => [ + 'mediaMode' => 'ROUTED', + 'recordingMode' => 'MANUAL' + ] + ] + ); + + if ($response->getStatusCode() !== 200) { + $this->session_id = null; + $this->save(); + } + + $session = json_decode($response->getBody(), true); + + $this->session_id = $session['id']; + $this->save(); + + return $session; + } + + public function getSessionToken($role = 'PUBLISHER') + { + $response = $this->client()->request( + 'POST', + 'tokens', + [ + 'json' => [ + 'session' => $this->session_id, + 'role' => $role + ] + ] + ); + + $json = json_decode($response->getBody(), true); + + return $json; + } + + public function hasSession() + { + if (!$this->session_id) { + return false; + } + + $response = $this->client()->request('GET', "sessions/{$this->session_id}"); + + return $response->getStatusCode() == 200; + } } diff --git a/src/database/migrations/2020_04_30_115440_create_openvidu_tables.php b/src/database/migrations/2020_04_30_115440_create_openvidu_tables.php index e9e8a87c..2f4bb798 100644 --- a/src/database/migrations/2020_04_30_115440_create_openvidu_tables.php +++ b/src/database/migrations/2020_04_30_115440_create_openvidu_tables.php @@ -1,49 +1,55 @@ bigIncrements('id'); $table->bigInteger('user_id'); - $table->string('session_id', 16)->unique()->index(); + $table->string('name', 16)->unique()->index(); + $table->string('session_id', 16)->nullable(); $table->timestamps(); + + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); } ); Schema::create( 'openvidu_room_settings', function (Blueprint $table) { $table->bigIncrements('id'); - $table->bigInteger('room_id'); + $table->bigInteger('room_id')->unsigned(); $table->string('key', 16); $table->string('value'); $table->timestamps(); + + $table->foreign('room_id')->references('id') + ->on('openvidu_rooms')->onDelete('cascade'); } ); } /** * Reverse the migrations. * * @return void */ public function down() { - Schema::dropIfExists('openvidu_rooms'); Schema::dropIfExists('openvidu_room_settings'); + Schema::dropIfExists('openvidu_rooms'); } } diff --git a/src/database/seeds/OpenViduRoomSeeder.php b/src/database/seeds/OpenViduRoomSeeder.php index db7aa76c..5cb80ca7 100644 --- a/src/database/seeds/OpenViduRoomSeeder.php +++ b/src/database/seeds/OpenViduRoomSeeder.php @@ -1,23 +1,24 @@ first(); $room = \App\OpenVidu\Room::create( [ 'user_id' => $user->id, - 'session_id' => 'john' + 'name' => 'john' ] ); } }