diff --git a/src/app/Http/Controllers/API/V4/OpenViduController.php b/src/app/Http/Controllers/API/V4/OpenViduController.php index d210c236..96cc9e84 100644 --- a/src/app/Http/Controllers/API/V4/OpenViduController.php +++ b/src/app/Http/Controllers/API/V4/OpenViduController.php @@ -1,111 +1,120 @@ user(); - /** - * Show the form for creating a new resource. - * - * @return \Illuminate\Http\JsonResponse - */ - public function create() - { - // TODO - return $this->errorResponse(404); - } + $room = \App\OpenVidu\Room::where('session_id', $id); - /** - * Remove the specified resource from storage. - * - * @param int $id - * - * @return \Illuminate\Http\JsonResponse - */ - public function destroy($id) - { - // TODO - return $this->errorResponse(404); - } + // see if room exists, return session and token + $client = new \GuzzleHttp\Client( + [ + 'base_uri' => \config('openvidu.api_url'), + 'verify' => \config('openvidu.api_verify_tls') + ] + ); - /** - * Show the form for editing the specified resource. - * - * @param int $id - * - * @return \Illuminate\Http\JsonResponse - */ - public function edit($id) - { - // TODO - return $this->errorResponse(404); - } + $response = $client->request( + 'GET', + "sessions/{$id}", + ['auth' => [\config('openvidu.api_username'), \config('openvidu.api_password')]] + ); - /** - * Display a listing of the resource. - * - * @return \Illuminate\Http\JsonResponse - */ - public function index() - { - // TODO - return $this->errorResponse(404); - } + $sessionExists = $response->getStatusCode() == 200; - /** - * Store a newly created resource in storage. - * - * @param \Illuminate\Http\Request $request - * - * @return \Illuminate\Http\JsonResponse - */ - public function store(Request $request) - { - // TODO - return $this->errorResponse(404); - } + if (!$sessionExists) { + if ($room->user_id == $user) { + $json = [ + 'mediaMode' => 'ROUTED', + 'recordingMode' => 'MANUAL', + 'customSessionId' => $room->session_id + ]; - /** - * Display the specified resource. - * - * @param int $id - * - * @return \Illuminate\Http\JsonResponse - */ - public function show($id) - { - // TODO - return $this->errorResponse(404); + $response = $client->request( + 'POST', + 'sessions', + [ + 'auth' => [ + \config('openvidu.api_username'), + \config('openvidu.api_password') + ], + 'json' => [ + 'mediaMode' => 'ROUTED', + 'recordingMode' => 'MANUAL', + 'customSessionId' => $room->session_id + ] + ] + ); + + if ($response->getResponseCode() !== 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); + + return response()->json($json, 200); + } else { + return response()->json(['status' => 'waiting'], 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); + + return response()->json($json, 200); } /** - * Update the specified resource in storage. + * Webhook as triggered from OpenVidu server * - * @param \Illuminate\Http\Request $request - * @param int $id + * @param \Illuminate\Http\Request $request The API request. * - * @return \Illuminate\Http\JsonResponse + * @return \Illuminate\Http\Response The response */ - public function update(Request $request, $id) + public function webhook(Request $request) { - // TODO - return $this->errorResponse(404); + return response('Success', 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 1fb2a855..e9e8a87c 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,48 +1,49 @@ bigIncrements('id'); $table->bigInteger('user_id'); $table->string('session_id', 16)->unique()->index(); $table->timestamps(); } ); Schema::create( 'openvidu_room_settings', function (Blueprint $table) { $table->bigIncrements('id'); $table->bigInteger('room_id'); $table->string('key', 16); $table->string('value'); $table->timestamps(); } ); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('openvidu_rooms'); + Schema::dropIfExists('openvidu_room_settings'); } } diff --git a/src/database/seeds/DatabaseSeeder.php b/src/database/seeds/DatabaseSeeder.php index 1e5e3db7..995b0793 100644 --- a/src/database/seeds/DatabaseSeeder.php +++ b/src/database/seeds/DatabaseSeeder.php @@ -1,37 +1,38 @@ $name) { $class = "Database\\Seeds\\$env\\$name"; $seeders[$idx] = class_exists($class) ? $class : null; } $seeders = array_filter($seeders); $this->call($seeders); } } diff --git a/src/database/seeds/local/OpenViduRoomSeeder.php b/src/database/seeds/local/OpenViduRoomSeeder.php new file mode 100644 index 00000000..2b6387d2 --- /dev/null +++ b/src/database/seeds/local/OpenViduRoomSeeder.php @@ -0,0 +1,25 @@ +first(); + $room = \App\OpenVidu\Room::create( + [ + 'user_id' => $user->id, + 'session_id' => 'john' + ] + ); + } +} diff --git a/src/routes/api.php b/src/routes/api.php index b15b6394..ff3448ec 100644 --- a/src/routes/api.php +++ b/src/routes/api.php @@ -1,115 +1,115 @@ 'api', 'prefix' => 'auth' ], function ($router) { Route::post('login', 'API\AuthController@login'); Route::group( ['middleware' => 'auth:api'], function ($router) { Route::get('info', 'API\AuthController@info'); Route::post('logout', 'API\AuthController@logout'); Route::post('refresh', 'API\AuthController@refresh'); } ); } ); Route::group( [ 'domain' => \config('app.domain'), 'middleware' => 'api', 'prefix' => 'auth' ], function ($router) { Route::post('password-reset/init', 'API\PasswordResetController@init'); Route::post('password-reset/verify', 'API\PasswordResetController@verify'); Route::post('password-reset', 'API\PasswordResetController@reset'); Route::get('signup/plans', 'API\SignupController@plans'); Route::post('signup/init', 'API\SignupController@init'); Route::post('signup/verify', 'API\SignupController@verify'); Route::post('signup', 'API\SignupController@signup'); } ); Route::group( [ 'domain' => \config('app.domain'), 'middleware' => 'auth:api', 'prefix' => 'v4' ], function () { Route::apiResource('domains', API\V4\DomainsController::class); Route::get('domains/{id}/confirm', 'API\V4\DomainsController@confirm'); Route::get('domains/{id}/status', 'API\V4\DomainsController@status'); Route::apiResource('entitlements', API\V4\EntitlementsController::class); - Route::apiResource('meet/openvidu', API\V4\OpenViduController::class); + Route::get('meet/openvidu/{:id}', 'API\V4\OpenViduController@joinOrCreate'); Route::apiResource('packages', API\V4\PackagesController::class); Route::apiResource('skus', API\V4\SkusController::class); Route::apiResource('users', API\V4\UsersController::class); Route::get('users/{id}/status', 'API\V4\UsersController@status'); Route::apiResource('wallets', API\V4\WalletsController::class); Route::get('wallets/{id}/transactions', 'API\V4\WalletsController@transactions'); Route::get('wallets/{id}/receipts', 'API\V4\WalletsController@receipts'); Route::get('wallets/{id}/receipts/{receipt}', 'API\V4\WalletsController@receiptDownload'); Route::post('payments', 'API\V4\PaymentsController@store'); Route::get('payments/mandate', 'API\V4\PaymentsController@mandate'); Route::post('payments/mandate', 'API\V4\PaymentsController@mandateCreate'); Route::put('payments/mandate', 'API\V4\PaymentsController@mandateUpdate'); Route::delete('payments/mandate', 'API\V4\PaymentsController@mandateDelete'); } ); Route::group( [ 'domain' => \config('app.domain'), ], function () { Route::post('webhooks/payment/{provider}', 'API\V4\PaymentsController@webhook'); Route::post('webhooks/meet/openvidu', 'API\V4\OpenViduController@webhook'); } ); Route::group( [ 'domain' => 'admin.' . \config('app.domain'), 'middleware' => ['auth:api', 'admin'], 'prefix' => 'v4', ], function () { Route::apiResource('domains', API\V4\Admin\DomainsController::class); Route::get('domains/{id}/confirm', 'API\V4\Admin\DomainsController@confirm'); Route::apiResource('entitlements', API\V4\Admin\EntitlementsController::class); Route::apiResource('packages', API\V4\Admin\PackagesController::class); Route::apiResource('skus', API\V4\Admin\SkusController::class); Route::apiResource('users', API\V4\Admin\UsersController::class); Route::post('users/{id}/suspend', 'API\V4\Admin\UsersController@suspend'); Route::post('users/{id}/unsuspend', 'API\V4\Admin\UsersController@unsuspend'); Route::apiResource('wallets', API\V4\Admin\WalletsController::class); Route::post('wallets/{id}/one-off', 'API\V4\Admin\WalletsController@oneOff'); Route::get('wallets/{id}/transactions', 'API\V4\Admin\WalletsController@transactions'); Route::apiResource('discounts', API\V4\Admin\DiscountsController::class); } );