Changeset View
Changeset View
Standalone View
Standalone View
src/app/Http/Controllers/API/V4/OpenViduController.php
<?php | <?php | ||||
namespace App\Http\Controllers\API\V4; | namespace App\Http\Controllers\API\V4; | ||||
use App\Http\Controllers\Controller; | use App\Http\Controllers\Controller; | ||||
use App\OpenVidu\Connection; | |||||
use App\OpenVidu\Room; | use App\OpenVidu\Room; | ||||
use Illuminate\Http\Request; | use Illuminate\Http\Request; | ||||
use Illuminate\Support\Facades\Auth; | use Illuminate\Support\Facades\Auth; | ||||
use Illuminate\Support\Facades\Validator; | use Illuminate\Support\Facades\Validator; | ||||
class OpenViduController extends Controller | class OpenViduController extends Controller | ||||
{ | { | ||||
/** | /** | ||||
▲ Show 20 Lines • Show All 96 Lines • ▼ Show 20 Lines | class OpenViduController extends Controller | ||||
* | * | ||||
* @param string $id Room identifier (name) | * @param string $id Room identifier (name) | ||||
* @param string $conn Connection identifier | * @param string $conn Connection identifier | ||||
* | * | ||||
* @return \Illuminate\Http\JsonResponse | * @return \Illuminate\Http\JsonResponse | ||||
*/ | */ | ||||
public function dismissConnection($id, $conn) | public function dismissConnection($id, $conn) | ||||
{ | { | ||||
$room = Room::where('name', $id)->first(); | $connection = Connection::where('id', $conn)->first(); | ||||
// This isn't a room, bye bye | // There's no such connection, bye bye | ||||
if (!$room) { | if (!$connection || $connection->room->name != $id) { | ||||
return $this->errorResponse(404, \trans('meet.room-not-found')); | return $this->errorResponse(404, \trans('meet.connection-not-found')); | ||||
} | } | ||||
$user = Auth::guard()->user(); | $user = Auth::guard()->user(); | ||||
// Only the room owner can do it | // Only the room owner can do it (for now) | ||||
if (!$user || $user->id != $room->user_id) { | if (!$user || $user->id != $connection->room->user_id) { | ||||
return $this->errorResponse(403); | return $this->errorResponse(403); | ||||
} | } | ||||
if (!$room->closeOVConnection($conn)) { | if (!$connection->dismiss()) { | ||||
return $this->errorResponse(500, \trans('meet.session-dismiss-connection-error')); | return $this->errorResponse(500, \trans('meet.connection-dismiss-error')); | ||||
} | } | ||||
return response()->json(['status' => 'success']); | return response()->json(['status' => 'success']); | ||||
} | } | ||||
/** | /** | ||||
* Listing of rooms that belong to the current user. | * Listing of rooms that belong to the current user. | ||||
* | * | ||||
▲ Show 20 Lines • Show All 134 Lines • ▼ Show 20 Lines | public function joinRoom($id) | ||||
return $this->errorResponse(422, $error, $response + ['code' => 327]); | return $this->errorResponse(422, $error, $response + ['code' => 327]); | ||||
} | } | ||||
} | } | ||||
// Initialize connection tokens | // Initialize connection tokens | ||||
if ($init) { | if ($init) { | ||||
// Choose the connection role | // Choose the connection role | ||||
$canPublish = !empty(request()->input('canPublish')); | $canPublish = !empty(request()->input('canPublish')); | ||||
$reqRole = $canPublish ? Room::ROLE_PUBLISHER : Room::ROLE_SUBSCRIBER; | $role = $canPublish ? Room::ROLE_PUBLISHER : Room::ROLE_SUBSCRIBER; | ||||
$role = $isOwner ? Room::ROLE_MODERATOR : $reqRole; | if ($isOwner) { | ||||
$role |= Room::ROLE_MODERATOR; | |||||
$role |= Room::ROLE_OWNER; | |||||
} | |||||
// Create session token for the current user/connection | // Create session token for the current user/connection | ||||
$response = $room->getSessionToken($role, ['canPublish' => $canPublish]); | $response = $room->getSessionToken($role); | ||||
if (empty($response)) { | if (empty($response)) { | ||||
return $this->errorResponse(500, \trans('meet.session-join-error')); | return $this->errorResponse(500, \trans('meet.session-join-error')); | ||||
} | } | ||||
// Create session token for screen sharing connection | // Create session token for screen sharing connection | ||||
if ($role != Room::ROLE_SUBSCRIBER && !empty(request()->input('screenShare'))) { | if (($role & Room::ROLE_PUBLISHER) && !empty(request()->input('screenShare'))) { | ||||
$add_token = $room->getSessionToken(Room::ROLE_PUBLISHER, ['canPublish' => true]); | $add_token = $room->getSessionToken(Room::ROLE_SCREEN); | ||||
$response['shareToken'] = $add_token['token']; | $response['shareToken'] = $add_token['token']; | ||||
} | } | ||||
$response_code = 200; | $response_code = 200; | ||||
$response['role'] = $role; | $response['role'] = $role; | ||||
$response['owner'] = $isOwner; | |||||
$response['config'] = $config; | $response['config'] = $config; | ||||
$response['canPublish'] = $canPublish; | |||||
} else { | } else { | ||||
$response_code = 422; | $response_code = 422; | ||||
$response['code'] = 322; | $response['code'] = 322; | ||||
} | } | ||||
return response()->json($response, $response_code); | return response()->json($response, $response_code); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 74 Lines • ▼ Show 20 Lines | public function webhook(Request $request) | ||||
$sessionId = $request->input('sessionId'); | $sessionId = $request->input('sessionId'); | ||||
$room = Room::where('session_id', $sessionId)->first(); | $room = Room::where('session_id', $sessionId)->first(); | ||||
if ($room) { | if ($room) { | ||||
$room->session_id = null; | $room->session_id = null; | ||||
$room->save(); | $room->save(); | ||||
} | } | ||||
// Remove all connections | |||||
// Note: We could remove connections one-by-one via the 'participantLeft' event | |||||
// but that could create many INSERTs when the session (with many participants) ends | |||||
// So, it is better to remove them all in a single INSERT. | |||||
Connection::where('session_id', $sessionId)->delete(); | |||||
break; | break; | ||||
} | } | ||||
return response('Success', 200); | return response('Success', 200); | ||||
} | } | ||||
} | } |