validate([ 'owner_ref' => ['required', 'string'], 'organization_id' => ['required', 'integer', 'exists:meet_organizations,id'], 'host_user_ref' => ['required', 'string'], 'title' => ['required', 'string', 'max:255'], 'description' => ['nullable', 'string'], 'scheduled_at' => ['nullable', 'date'], 'duration_minutes' => ['nullable', 'integer', 'min:15', 'max:480'], 'passcode' => ['nullable', 'string', 'max:20'], 'settings' => ['nullable', 'array'], 'source' => ['required', 'array'], 'source.app' => ['required', 'string'], 'source.entity_type' => ['nullable', 'string'], 'source.entity_id' => ['nullable', 'string'], 'invite_emails' => ['nullable', 'array'], 'invite_emails.*' => ['email'], ]); $organization = Organization::findOrFail($validated['organization_id']); abort_unless($organization->owner_ref === $validated['owner_ref'], 403); $host = User::where('public_id', $validated['host_user_ref'])->firstOrFail(); $room = empty($validated['scheduled_at']) ? $this->rooms->createInstant($host, $organization, $validated) : $this->rooms->createScheduled($host, $organization, $validated); if (! empty($validated['invite_emails'])) { $invites = collect($validated['invite_emails'])->map(fn ($email) => ['email' => $email])->all(); $this->invitations->inviteToRoom($room, $invites, $host); } if ($room->scheduled_at) { $this->calendar->syncRoomCreated($room, $host); } $this->webhooks->roomCreated($room); return response()->json([ 'room' => $room->fresh(), 'join_url' => $room->joinUrl(), 'embed_url' => route('meet.join', $room), ], 201); } public function show(Room $room): JsonResponse { return response()->json([ 'room' => $room->load('sessions'), 'join_url' => $room->joinUrl(), 'embed_url' => route('meet.join', $room), ]); } public function start(Request $request, Room $room): JsonResponse { $host = User::where('public_id', $request->input('host_user_ref', $room->host_user_ref))->firstOrFail(); abort_unless($room->host_user_ref === $host->ownerRef(), 403); $session = $this->sessions->start($room, $host); return response()->json([ 'session' => $session, 'room_url' => route('meet.room', $session), 'join_url' => $room->joinUrl(), ]); } }