Deploy Ladill Meet / deploy (push) Failing after 7s
Phases 0–18: core meetings, webinar, breakouts, team chat, live streaming, town hall, billing, and Ladill Mail calendar wiring. Co-authored-by: Cursor <cursoragent@cursor.com>
111 lines
3.4 KiB
PHP
111 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Meet;
|
|
|
|
use App\Models\Participant;
|
|
use App\Models\Room;
|
|
use App\Models\Session;
|
|
use App\Models\User;
|
|
|
|
class TownHallService
|
|
{
|
|
public function startGreenRoom(Room $room, User $host): Session
|
|
{
|
|
abort_unless($room->type === 'town_hall', 422);
|
|
|
|
$session = Session::create([
|
|
'owner_ref' => $room->owner_ref,
|
|
'room_id' => $room->id,
|
|
'media_room_name' => app(RoomService::class)->mediaRoomName($room, 'green'),
|
|
'status' => 'live',
|
|
'session_mode' => 'green_room',
|
|
'presenter_refs' => [$host->ownerRef()],
|
|
'started_at' => now(),
|
|
]);
|
|
|
|
$room->update(['status' => 'live']);
|
|
|
|
app(\App\Services\Meet\Media\MediaProviderInterface::class)->createRoom($session->media_room_name);
|
|
|
|
app(SessionService::class)->joinParticipant($session, $host, 'host');
|
|
|
|
return $session;
|
|
}
|
|
|
|
public function goLive(Session $greenRoomSession, User $host): Session
|
|
{
|
|
abort_unless($greenRoomSession->session_mode === 'green_room', 422);
|
|
|
|
$room = $greenRoomSession->room;
|
|
$presenters = $greenRoomSession->presenter_refs ?? [];
|
|
|
|
$greenRoomSession->update(['status' => 'ended', 'ended_at' => now()]);
|
|
|
|
$liveSession = Session::create([
|
|
'owner_ref' => $room->owner_ref,
|
|
'room_id' => $room->id,
|
|
'media_room_name' => app(RoomService::class)->mediaRoomName($room),
|
|
'status' => 'live',
|
|
'session_mode' => 'live',
|
|
'presenter_refs' => $presenters,
|
|
'started_at' => now(),
|
|
]);
|
|
|
|
$room->update(['status' => 'live']);
|
|
|
|
app(\App\Services\Meet\Media\MediaProviderInterface::class)->createRoom($liveSession->media_room_name);
|
|
|
|
app(SessionService::class)->joinParticipant($liveSession, $host, 'host');
|
|
|
|
foreach ($greenRoomSession->participants()->where('status', 'joined')->get() as $participant) {
|
|
if ($participant->user_ref && ! in_array($participant->user_ref, $presenters, true)) {
|
|
continue;
|
|
}
|
|
}
|
|
|
|
return $liveSession;
|
|
}
|
|
|
|
public function handoffCoHost(Session $session, Participant $from, string $toUserRef): Participant
|
|
{
|
|
abort_unless(in_array($from->role, ['host', 'co_host'], true), 403);
|
|
|
|
$target = $session->participants()
|
|
->where('user_ref', $toUserRef)
|
|
->where('status', 'joined')
|
|
->firstOrFail();
|
|
|
|
$from->update(['role' => 'participant']);
|
|
$target->update(['role' => 'co_host']);
|
|
|
|
$presenters = collect($session->presenter_refs ?? [])
|
|
->reject(fn ($ref) => $ref === $from->user_ref)
|
|
->push($toUserRef)
|
|
->unique()
|
|
->values()
|
|
->all();
|
|
|
|
$session->update(['presenter_refs' => $presenters]);
|
|
|
|
return $target->fresh();
|
|
}
|
|
|
|
public function addPresenter(Session $session, string $userRef): Session
|
|
{
|
|
$presenters = collect($session->presenter_refs ?? [])
|
|
->push($userRef)
|
|
->unique()
|
|
->values()
|
|
->all();
|
|
|
|
$session->update(['presenter_refs' => $presenters]);
|
|
|
|
$session->participants()
|
|
->where('user_ref', $userRef)
|
|
->where('status', 'joined')
|
|
->update(['role' => 'panelist']);
|
|
|
|
return $session->fresh();
|
|
}
|
|
}
|