Route webinar and conference registration through Ladill Events.
Deploy Ladill Meet / deploy (push) Successful in 1m26s

Add Events linking UI and service client, remove Meet-native registration and invitation flows for these room types, and redirect attendees to Events registration when joining.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-02 07:38:50 +00:00
co-authored by Cursor
parent 8162827957
commit 34d0a9c504
20 changed files with 595 additions and 286 deletions
@@ -3,23 +3,12 @@
namespace App\Http\Controllers\Meet;
use App\Http\Controllers\Controller;
use App\Models\BreakoutRoom;
use App\Models\MeetPoll;
use App\Models\QaQuestion;
use App\Models\Room;
use App\Models\Session;
use App\Models\SessionFile;
use App\Models\Whiteboard;
use App\Services\Meet\BreakoutService;
use App\Services\Meet\FileSharingService;
use App\Services\Meet\PollService;
use App\Services\Meet\QaService;
use App\Services\Meet\WebinarService;
use App\Services\Meet\WhiteboardService;
use App\Support\EventsSourceLink;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Symfony\Component\HttpFoundation\StreamedResponse;
class WebinarRegistrationController extends Controller
{
@@ -27,62 +16,69 @@ class WebinarRegistrationController extends Controller
protected WebinarService $webinars,
) {}
public function show(Room $room): View
public function show(Room $room): View|RedirectResponse
{
abort_unless($room->isWebinar(), 404);
return view('meet.webinar.register', compact('room'));
return $this->redirectToEvents($room);
}
public function store(Request $request, Room $room): View
public function store(Request $request, Room $room): View|RedirectResponse
{
abort_unless($room->isWebinar(), 404);
$validated = $request->validate([
'email' => ['required', 'email'],
'display_name' => ['required', 'string', 'max:100'],
]);
$registration = $this->webinars->register(
$room,
$validated['email'],
$validated['display_name'],
);
return view('meet.webinar.register-done', compact('room', 'registration'));
return $this->redirectToEvents($room);
}
public function manage(Request $request, Room $room): View
public function manage(Request $request, Room $room): View|RedirectResponse
{
$this->authorizeWebinarHost($request, $room);
$registrations = $room->webinarRegistrations()->orderByDesc('created_at')->get();
return view('meet.webinar.registrations', compact('room', 'registrations'));
return $this->redirectToEventsAdmin($room);
}
public function approve(Request $request, Room $room, \App\Models\WebinarRegistration $registration): RedirectResponse
{
$this->authorizeWebinarHost($request, $room);
abort_unless($registration->room_id === $room->id, 404);
$this->webinars->approve($registration, $request->user());
return back()->with('success', 'Registration approved.');
return $this->redirectToEventsAdmin($room);
}
public function reject(Request $request, Room $room, \App\Models\WebinarRegistration $registration): RedirectResponse
{
$this->authorizeWebinarHost($request, $room);
abort_unless($registration->room_id === $room->id, 404);
$this->webinars->reject($registration);
return back()->with('success', 'Registration rejected.');
return $this->redirectToEventsAdmin($room);
}
protected function authorizeWebinarHost(Request $request, Room $room): void
{
abort_unless($request->user()?->ownerRef() === $room->host_user_ref, 403);
}
protected function redirectToEvents(Room $room): RedirectResponse
{
$url = EventsSourceLink::eventRegistrationUrl($room);
if ($url) {
return redirect()->away($url);
}
return redirect()
->route('meet.webinars.show', $room)
->withErrors(['register' => 'Link this webinar to Ladill Events to enable registration.']);
}
protected function redirectToEventsAdmin(Room $room): RedirectResponse
{
$url = EventsSourceLink::eventAdminUrl($room);
if ($url) {
return redirect()->away($url);
}
return redirect()
->route('meet.webinars.show', $room)
->withErrors(['register' => 'Link this webinar to Ladill Events to manage registrations.']);
}
}