authorizeAbility($request, 'meetings.view'); $owner = $this->ownerRef($request); $organization = $this->organization($request); $recordings = Recording::owned($owner) ->whereHas('session.room', fn ($q) => $q->where('organization_id', $organization->id)) ->with(['session.room']) ->orderByDesc('created_at') ->paginate(20); return view('meet.recordings.index', compact('recordings')); } public function show(Request $request, Recording $recording): View { $this->authorizeAbility($request, 'meetings.view'); $this->authorizeOwner($request, $recording); $recording->load(['session.room', 'session.participants']); return view('meet.recordings.show', compact('recording')); } public function download(Request $request, Recording $recording): StreamedResponse { $this->authorizeAbility($request, 'meetings.view'); $this->authorizeOwner($request, $recording); abort_unless($recording->isReady() && $recording->storage_path, 404); abort_unless(app(\App\Services\Meet\MeetBillingService::class)->storageIsAccessible($recording), 402, 'Recording storage billing is overdue. Top up your Ladill wallet to download this recording.'); return Storage::disk(config('meet.recordings.disk', 'local')) ->download($recording->storage_path, $recording->session->room->title.'.mp4'); } public function destroy(Request $request, Recording $recording): RedirectResponse { $this->authorizeAbility($request, 'meetings.manage'); $this->authorizeOwner($request, $recording); $this->recordings->delete($recording, $this->ownerRef($request)); return redirect()->route('meet.recordings.index')->with('success', 'Recording deleted.'); } }