Grant panelist role to Events speakers on conferences and webinars.
Deploy Ladill Meet / deploy (push) Successful in 49s
Deploy Ladill Meet / deploy (push) Successful in 49s
Verify speaker tokens before room-type role resolution so town-hall sessions get panelist access and speaker-panel placement, and skip the waiting room for panelists. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -206,14 +206,14 @@ class JoinController extends Controller
|
|||||||
|
|
||||||
$role = ($user && $user->ownerRef() === $room->host_user_ref) ? 'host' : 'guest';
|
$role = ($user && $user->ownerRef() === $room->host_user_ref) ? 'host' : 'guest';
|
||||||
|
|
||||||
if ($room->isSpace()) {
|
if ($role !== 'host' && EventsRegistrationSession::isSpeakerVerified($request, $room)) {
|
||||||
|
$role = 'panelist';
|
||||||
|
} elseif ($room->isSpace()) {
|
||||||
$role = $this->spaces->resolveJoinRole($room, $user, $role);
|
$role = $this->spaces->resolveJoinRole($room, $user, $role);
|
||||||
} elseif ($room->isConference() && $role !== 'host') {
|
} elseif ($room->isConference()) {
|
||||||
$role = $this->conferences->resolveJoinRole($room, $user, $email, $role);
|
$role = $this->conferences->resolveJoinRole($room, $user, $email, $role);
|
||||||
} elseif ($room->isWebinar() && $role !== 'host') {
|
} elseif ($room->isWebinar()) {
|
||||||
if (EventsRegistrationSession::isSpeakerVerified($request, $room)) {
|
if ($room->isEventsLinked()) {
|
||||||
$role = 'panelist';
|
|
||||||
} elseif ($room->isEventsLinked()) {
|
|
||||||
$role = 'attendee';
|
$role = 'attendee';
|
||||||
} else {
|
} else {
|
||||||
return back()->withErrors([
|
return back()->withErrors([
|
||||||
|
|||||||
+1
-1
@@ -183,7 +183,7 @@ class Room extends Model
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($role === 'host' || ($user && $user->ownerRef() === $this->host_user_ref)) {
|
if ($role === 'host' || in_array($role, ['co_host', 'panelist'], true) || ($user && $user->ownerRef() === $this->host_user_ref)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -192,6 +192,39 @@ class EventsJoinGateTest extends TestCase
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function test_speaker_token_grants_panelist_role_on_events_linked_conference(): void
|
||||||
|
{
|
||||||
|
$room = $this->createEventsLinkedRoom('town_hall', [
|
||||||
|
'settings' => array_merge(config('meet.default_settings'), [
|
||||||
|
'join_before_host' => true,
|
||||||
|
'waiting_room' => false,
|
||||||
|
]),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$session = Session::create([
|
||||||
|
'owner_ref' => $this->user->public_id,
|
||||||
|
'room_id' => $room->id,
|
||||||
|
'media_room_name' => 'room-'.$room->uuid,
|
||||||
|
'status' => 'live',
|
||||||
|
'started_at' => now(),
|
||||||
|
]);
|
||||||
|
$room->update(['status' => 'live']);
|
||||||
|
|
||||||
|
$this->get('/r/'.$room->uuid.'?speaker=speaker-token-123')
|
||||||
|
->assertRedirect(route('meet.join', $room));
|
||||||
|
|
||||||
|
$this->post('/r/'.$room->uuid.'/enter', [
|
||||||
|
'display_name' => 'Keynote Speaker',
|
||||||
|
])->assertRedirect(route('meet.room', $session));
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('meet_participants', [
|
||||||
|
'session_id' => $session->id,
|
||||||
|
'display_name' => 'Keynote Speaker',
|
||||||
|
'email' => 'speaker@example.com',
|
||||||
|
'role' => 'panelist',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
/** @param array<string, mixed> $overrides */
|
/** @param array<string, mixed> $overrides */
|
||||||
protected function createEventsLinkedRoom(string $type, array $overrides = []): Room
|
protected function createEventsLinkedRoom(string $type, array $overrides = []): Room
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user