'datetime', 'recurrence_until' => 'date', 'settings' => 'array', 'source' => 'array', ]; } protected static function booted(): void { static::creating(function (Room $room) { if (empty($room->uuid)) { $room->uuid = (string) Str::uuid(); } }); } public function getRouteKeyName(): string { return 'uuid'; } public function organization(): BelongsTo { return $this->belongsTo(Organization::class, 'organization_id'); } public function branch(): BelongsTo { return $this->belongsTo(Branch::class, 'branch_id'); } public function sessions(): HasMany { return $this->hasMany(Session::class, 'room_id'); } public function invitations(): HasMany { return $this->hasMany(Invitation::class, 'room_id'); } public function webinarRegistrations(): HasMany { return $this->hasMany(WebinarRegistration::class, 'room_id'); } public function sessionFiles(): HasMany { return $this->hasMany(SessionFile::class, 'room_id'); } public function isWebinar(): bool { return $this->type === 'webinar'; } public function isTownHall(): bool { return $this->type === 'town_hall'; } public function template(): BelongsTo { return $this->belongsTo(Template::class, 'template_id'); } public function isRecurring(): bool { return filled($this->recurrence_rule); } public function activeSession(): ?Session { return $this->sessions()->where('status', 'live')->latest()->first(); } public function setting(string $key, mixed $default = null): mixed { return data_get($this->settings, $key, data_get(config('meet.default_settings'), $key, $default)); } public function isLive(): bool { return $this->status === 'live'; } public function requiresWaitingRoom(?User $user, string $role): bool { if (! $this->setting('waiting_room', true)) { return false; } if ($role === 'host' || ($user && $user->ownerRef() === $this->host_user_ref)) { return false; } return true; } public function joinUrl(): string { return rtrim((string) config('app.meet_url', 'https://meet.ladill.com'), '/').'/r/'.$this->uuid; } }