diff --git a/src/app/Http/Controllers/API/V4/OpenViduController.php b/src/app/Http/Controllers/API/V4/OpenViduController.php --- a/src/app/Http/Controllers/API/V4/OpenViduController.php +++ b/src/app/Http/Controllers/API/V4/OpenViduController.php @@ -202,12 +202,12 @@ if (!$room->hasSession()) { // Participants can't join the room until the session is created by the owner if (!$isOwner) { - return $this->errorResponse(423, \trans('meet.session-not-found')); + return $this->errorResponse(422, \trans('meet.session-not-found'), ['code' => 323]); } // The room owner can create the session on request if (empty(request()->input('init'))) { - return $this->errorResponse(424, \trans('meet.session-not-found')); + return $this->errorResponse(422, \trans('meet.session-not-found'), ['code' => 324]); } $session = $room->createSession(); @@ -225,11 +225,13 @@ 'requires_password' => !$isOwner && strlen($password), ]; + $response = ['config' => $config]; + // Validate room password if (!$isOwner && strlen($password)) { $request_password = request()->input('password'); if ($request_password !== $password) { - return $this->errorResponse(425, \trans('meet.session-password-error'), ['config' => $config]); + return $this->errorResponse(422, \trans('meet.session-password-error'), $response + ['code' => 325]); } } @@ -247,14 +249,14 @@ if (empty($request['status']) || $request['status'] != Room::REQUEST_ACCEPTED) { if (!$request) { if (empty($nickname) || empty($requestId) || !preg_match('/^[a-z0-9]{8,32}$/i', $requestId)) { - return $this->errorResponse(426, $error, ['config' => $config]); + return $this->errorResponse(422, $error, $response + ['code' => 326]); } if (empty($picture)) { $svg = file_get_contents(resource_path('images/user.svg')); $picture = 'data:image/svg+xml;base64,' . base64_encode($svg); } elseif (!preg_match('|^data:image/png;base64,[a-zA-Z0-9=+/]+$|', $picture)) { - return $this->errorResponse(426, $error, ['config' => $config]); + return $this->errorResponse(422, $error, $response + ['code' => 326]); } // TODO: Resize when big/make safe the user picture? @@ -263,14 +265,14 @@ if (!$room->requestSave($requestId, $request)) { // FIXME: should we use error code 500? - return $this->errorResponse(426, $error, ['config' => $config]); + return $this->errorResponse(422, $error, $response + ['code' => 326]); } // Send the request (signal) to the owner $result = $room->signal('joinRequest', $request, Room::ROLE_MODERATOR); } - return $this->errorResponse(427, $error, ['config' => $config]); + return $this->errorResponse(422, $error, $response + ['code' => 327]); } } diff --git a/src/resources/vue/Meet/Room.vue b/src/resources/vue/Meet/Room.vue --- a/src/resources/vue/Meet/Room.vue +++ b/src/resources/vue/Meet/Room.vue @@ -72,11 +72,11 @@
@@ -153,11 +153,11 @@ roomStateLabels: { init: 'Checking the room...', 404: 'The room does not exist.', - 423: 'The room is closed. Please, wait for the owner to start the session.', - 424: 'The room is closed. It will be open for others after you join.', - 425: 'The room is ready. Please, provide a valid password.', - 426: 'The room is locked. Please, enter your name and try again.', - 427: 'Waiting for permission to join the room.', + 323: 'The room is closed. Please, wait for the owner to start the session.', + 324: 'The room is closed. It will be open for others after you join.', + 325: 'The room is ready. Please, provide a valid password.', + 326: 'The room is locked. Please, enter your name and try again.', + 327: 'Waiting for permission to join the room.', 500: 'Failed to create a session. Server error.' }, session: {} @@ -220,34 +220,40 @@ } }) .catch(error => { - this.roomState = String(error.response.status) + const data = error.response.data || {} - if (error.response.data && error.response.data.config) { - this.session.config = error.response.data.config + if (data.code) { + this.roomState = data.code + } else { + this.roomState = error.response.status + } + + if (data.config) { + this.session.config = data.config } switch (this.roomState) { - case '423': + case 323: // Waiting for the owner to open the room... // Update room state every 10 seconds window.roomRequest = setTimeout(() => { this.initSession() }, 10000) break; - case '425': + case 325: // Missing/invalid password if (init) { $('#setup-password').addClass('is-invalid').focus() } break; - case '426': + case 326: // Locked room prerequisites error if (init && !$('#setup-nickname').val()) { $('#setup-nickname').addClass('is-invalid').focus() } break; - case '427': + case 327: // Waiting for the owner's approval to join // Update room state every 10 seconds window.roomRequest = setTimeout(() => { this.initSession(true) }, 10000) @@ -260,7 +266,7 @@ } }, isRoomReady() { - return ['ready', '424', '425', '426', '427'].includes(this.roomState) + return ['ready', 324, 325, 326, 327].includes(this.roomState) }, // An event received by the room owner when a participant is asking for a permission to join the room joinRequest(data) { @@ -309,7 +315,7 @@ }, // Entering the room joinSession() { - if (this.roomState == 423) { + if (this.roomState == 323) { $('#meet-setup').addClass('hidden') $('#meet-auth').removeClass('hidden') return diff --git a/src/resources/vue/Widgets/StatusMessage.vue b/src/resources/vue/Widgets/StatusMessage.vue --- a/src/resources/vue/Widgets/StatusMessage.vue +++ b/src/resources/vue/Widgets/StatusMessage.vue @@ -5,8 +5,8 @@ {{ statusLabel() }} - - {{ statusLabel() }} + + {{ statusLabel() }} diff --git a/src/tests/Browser/Meet/RoomControlsTest.php b/src/tests/Browser/Meet/RoomControlsTest.php --- a/src/tests/Browser/Meet/RoomControlsTest.php +++ b/src/tests/Browser/Meet/RoomControlsTest.php @@ -134,7 +134,6 @@ $browser->assertVisible('video') ->assertAudioMuted('video', true) ->assertSeeIn('.nickname', 'john') - ->assertMissing('.nickname button') ->assertVisible('.controls button.link-fullscreen') ->assertMissing('.controls button.link-audio') ->assertMissing('.status .status-audio') @@ -142,7 +141,7 @@ }) ->whenAvailable('div.meet-video:not(.publisher)', function (Browser $browser) { $browser->assertMissing('video') - ->assertMissing('.nickname') + ->assertVisible('.nickname') ->assertVisible('.controls button.link-fullscreen') ->assertVisible('.controls button.link-audio') ->assertVisible('.status .status-audio') @@ -162,8 +161,6 @@ ->whenAvailable('div.meet-video.publisher', function (Browser $browser) { $browser->assertVisible('video') //->assertAudioMuted('video', true) - ->assertVisible('.nickname button') - ->assertMissing('.nickname span') ->assertVisible('.controls button.link-fullscreen') ->assertMissing('.controls button.link-audio') ->assertVisible('.status .status-audio') @@ -172,7 +169,6 @@ ->whenAvailable('div.meet-video:not(.publisher)', function (Browser $browser) { $browser->assertVisible('video') ->assertSeeIn('.nickname', 'john') - ->assertMissing('.nickname button') ->assertVisible('.controls button.link-fullscreen') ->assertVisible('.controls button.link-audio') ->assertMissing('.status .status-audio') diff --git a/src/tests/Browser/Meet/RoomSecurityTest.php b/src/tests/Browser/Meet/RoomSecurityTest.php --- a/src/tests/Browser/Meet/RoomSecurityTest.php +++ b/src/tests/Browser/Meet/RoomSecurityTest.php @@ -93,7 +93,7 @@ $guest->visit(new RoomPage('john')) ->waitFor('@setup-form') ->waitUntilMissing('@setup-status-message.loading') - ->assertSeeIn('@setup-status-message.text-danger', "Please, provide a valid password.") + ->assertSeeIn('@setup-status-message', "Please, provide a valid password.") ->assertVisible('@setup-form .input-group:nth-child(4) svg') ->assertAttribute('@setup-form .input-group:nth-child(4) .input-group-text', 'title', 'Password') ->assertAttribute('@setup-password-input', 'placeholder', 'Password') @@ -175,7 +175,7 @@ ->click('@setup-button') ->waitFor('@setup-nickname-input.is-invalid') ->assertSeeIn( - '@setup-status-message.text-danger', + '@setup-status-message', "The room is locked. Please, enter your name and try again." ) ->assertMissing('@setup-password-input') @@ -184,7 +184,7 @@ ->click('@setup-button') ->assertMissing('@setup-nickname-input.is-invalid') ->waitFor('@setup-button[disabled]') - ->assertSeeIn('@setup-status-message.text-danger', "Waiting for permission to join the room."); + ->assertSeeIn('@setup-status-message', "Waiting for permission to join the room."); // Test denying the request (this will also test custom toasts) $owner @@ -209,7 +209,7 @@ ->type('@setup-nickname-input', 'guest') ->click('@setup-button') ->waitFor('@setup-button[disabled]') - ->assertSeeIn('@setup-status-message.text-danger', "Waiting for permission to join the room."); + ->assertSeeIn('@setup-status-message', "Waiting for permission to join the room."); $owner ->whenAvailable(new Toast(Toast::TYPE_CUSTOM), function ($browser) { diff --git a/src/tests/Browser/Meet/RoomSetupTest.php b/src/tests/Browser/Meet/RoomSetupTest.php --- a/src/tests/Browser/Meet/RoomSetupTest.php +++ b/src/tests/Browser/Meet/RoomSetupTest.php @@ -198,8 +198,7 @@ ->assertMissing('@setup-form') ->whenAvailable('div.meet-video.publisher', function (Browser $browser) { $browser->assertVisible('video') - ->assertVisible('.nickname button') - ->assertMissing('.nickname span') + ->assertVisible('.nickname') ->assertVisible('.controls button.link-fullscreen') ->assertMissing('.controls button.link-audio') ->assertVisible('.status .status-audio') @@ -229,7 +228,7 @@ ->assertElementsCount('@session div.meet-video', 2) ->whenAvailable('div.meet-video:not(.publisher)', function (Browser $browser) { $browser->assertMissing('video') - ->assertMissing('.nickname') + ->assertVisible('.nickname') ->assertVisible('.controls button.link-fullscreen') ->assertVisible('.controls button.link-audio') ->assertVisible('.status .status-audio') diff --git a/src/tests/Feature/Controller/OpenViduTest.php b/src/tests/Feature/Controller/OpenViduTest.php --- a/src/tests/Feature/Controller/OpenViduTest.php +++ b/src/tests/Feature/Controller/OpenViduTest.php @@ -82,7 +82,10 @@ // Unauth access, no session yet $response = $this->post("api/v4/openvidu/rooms/{$room->name}"); - $response->assertStatus(423); + $response->assertStatus(422); + + $json = $response->json(); + $this->assertSame(323, $json['code']); // Non-existing room name $response = $this->actingAs($john)->post("api/v4/openvidu/rooms/non-existing"); @@ -92,11 +95,17 @@ // Non-owner, no session yet $response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}"); - $response->assertStatus(423); + $response->assertStatus(422); + + $json = $response->json(); + $this->assertSame(323, $json['code']); // Room owner, no session yet $response = $this->actingAs($john)->post("api/v4/openvidu/rooms/{$room->name}"); - $response->assertStatus(424); + $response->assertStatus(422); + + $json = $response->json(); + $this->assertSame(324, $json['code']); $response = $this->actingAs($john)->post("api/v4/openvidu/rooms/{$room->name}", ['init' => 1]); $response->assertStatus(200); @@ -130,11 +139,12 @@ // Non-owner, password protected room, password not provided $room->setSettings(['password' => 'pass']); $response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}"); - $response->assertStatus(425); + $response->assertStatus(422); $json = $response->json(); - $this->assertCount(3, $json); + $this->assertCount(4, $json); + $this->assertSame(325, $json['code']); $this->assertSame('error', $json['status']); $this->assertSame('Failed to join the session. Invalid password.', $json['message']); $this->assertEmpty($json['config']['password']); @@ -142,7 +152,10 @@ // Non-owner, password protected room, invalid provided $response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}", ['password' => 'aa']); - $response->assertStatus(425); + $response->assertStatus(422); + + $json = $response->json(); + $this->assertSame(325, $json['code']); // Non-owner, password protected room, valid password provided $response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}", ['password' => 'pass']); @@ -179,11 +192,12 @@ // Non-owner, locked room, invalid/missing input $response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}"); - $response->assertStatus(426); + $response->assertStatus(422); $json = $response->json(); - $this->assertCount(3, $json); + $this->assertCount(4, $json); + $this->assertSame(326, $json['code']); $this->assertSame('error', $json['status']); $this->assertSame('Failed to join the session. Room locked.', $json['message']); $this->assertTrue($json['config']['locked']); @@ -191,22 +205,29 @@ // Non-owner, locked room, invalid requestId $post = ['nickname' => 'name', 'requestId' => '-----']; $response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}", $post); - $response->assertStatus(426); + $response->assertStatus(422); + + $json = $response->json(); + $this->assertSame(326, $json['code']); // Non-owner, locked room, invalid requestId $post = ['nickname' => 'name', 'picture' => '-----']; $response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}", $post); - $response->assertStatus(426); + $response->assertStatus(422); + + $json = $response->json(); + $this->assertSame(326, $json['code']); // Non-owner, locked room, valid input $reqId = '12345678'; $post = ['nickname' => 'name', 'requestId' => $reqId, 'picture' => 'data:image/png;base64,01234']; $response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}", $post); - $response->assertStatus(427); + $response->assertStatus(422); $json = $response->json(); - $this->assertCount(3, $json); + $this->assertCount(4, $json); + $this->assertSame(327, $json['code']); $this->assertSame('error', $json['status']); $this->assertSame('Failed to join the session. Room locked.', $json['message']); $this->assertTrue($json['config']['locked']); @@ -241,7 +262,10 @@ // Non-owner, locked room, join request denied $response = $this->actingAs($jack)->post("api/v4/openvidu/rooms/{$room->name}", $post); - $response->assertStatus(427); + $response->assertStatus(422); + + $json = $response->json(); + $this->assertSame(327, $json['code']); // Test accepting a request