*/ protected $guarded = []; /** * @return array */ protected function casts(): array { return [ 'contenttype' => 'integer', 'status' => 'integer', 'ordinal' => 'integer', 'role' => 'integer', ]; } /** * Scope: Get only active content. * * @param Builder $query * @return Builder */ public function scopeActive(Builder $query): Builder { return $query->where('status', self::STATUS_ENABLED); } /** * Scope: Get content of a specific type. * * @param Builder $query * @return Builder */ public function scopeOfType(Builder $query, int $type): Builder { return $query->where('contenttype', $type); } /** * Scope: Get content accessible by a specific role. * * @param Builder $query * @return Builder */ public function scopeForRole(Builder $query, int $role): Builder { // Admins and moderators can see everything if (\in_array($role, [UserRole::ADMIN->value, UserRole::MODERATOR->value], true)) { return $query; } // Others can only see content for their role or everyone return $query->where(function ($q) use ($role) { $q->where('role', self::ROLE_EVERYONE) ->orWhere('role', $role); }); } /** * Scope: Order content by type and ordinal within each type. * * @param Builder $query * @return Builder */ public function scopeOrdered(Builder $query): Builder { return $query ->orderBy('contenttype') ->orderByRaw('COALESCE(ordinal, 1000000) ASC, id ASC'); } /** * Scope: Get front page content. * * @param Builder $query * @return Builder */ public function scopeFrontPage(Builder $query): Builder { return $query->active() ->ofType(self::TYPE_INDEX) ->ordered(); } /** * Get content type label. */ public function getContentTypeLabel(): string { return match ($this->contenttype) { self::TYPE_USEFUL => 'Useful Link', self::TYPE_INDEX => 'Homepage', default => 'Unknown', }; } /** * Get role label. */ public function getRoleLabel(): string { return match ($this->role) { self::ROLE_EVERYONE => 'Everyone', self::ROLE_LOGGED_IN => 'Logged in Users', self::ROLE_ADMIN => 'Admins', default => 'Unknown', }; } /** * Check if content is active. */ public function isActive(): bool { return $this->status === self::STATUS_ENABLED; } /** * Check if content is a homepage type. */ public function isHomepage(): bool { return $this->contenttype === self::TYPE_INDEX; } }