'boolean', 'starts_at' => 'datetime', 'ends_at' => 'datetime', 'primary_link_target_id' => 'integer', 'secondary_link_target_id' => 'integer', 'overlay_opacity' => 'integer', 'priority' => 'integer', 'is_dismissible' => 'boolean', 'dismiss_version' => 'integer', ]; public static function statuses(): array { return [ self::STATUS_DRAFT, self::STATUS_PUBLISHED, self::STATUS_ARCHIVED, ]; } public static function types(): array { return [ self::TYPE_ANNOUNCEMENT, self::TYPE_LAUNCH, self::TYPE_NEWS, self::TYPE_WORLD, self::TYPE_EVENT, self::TYPE_NOTICE, self::TYPE_MAINTENANCE, ]; } public static function placements(): array { return [ self::PLACEMENT_HOMEPAGE_AFTER_FEATURED, ]; } public static function linkTypes(): array { return [ self::LINK_TYPE_NONE, self::LINK_TYPE_CUSTOM_URL, self::LINK_TYPE_NEWS, self::LINK_TYPE_WORLD, self::LINK_TYPE_ARTWORK, self::LINK_TYPE_COLLECTION, self::LINK_TYPE_GROUP, self::LINK_TYPE_PROFILE, self::LINK_TYPE_EXPLORE, self::LINK_TYPE_UPLOAD, ]; } public static function gradientPresets(): array { return [ self::GRADIENT_NOVA_AURORA, self::GRADIENT_DEEP_SPACE, self::GRADIENT_SUNRISE, self::GRADIENT_OCEAN_GLOW, self::GRADIENT_SPRING_VIBES, self::GRADIENT_FANTASY_REALMS, self::GRADIENT_MINIMAL_LIGHT, self::GRADIENT_DARK_GLASS, ]; } public function scopePublished(Builder $query): Builder { return $query->where('status', self::STATUS_PUBLISHED); } public function scopeActive(Builder $query): Builder { return $query->where('is_active', true); } public function scopeVisibleNow(Builder $query, ?Carbon $now = null): Builder { $now ??= now(); return $query ->where(function (Builder $builder) use ($now): void { $builder->whereNull('starts_at') ->orWhere('starts_at', '<=', $now); }) ->where(function (Builder $builder) use ($now): void { $builder->whereNull('ends_at') ->orWhere('ends_at', '>=', $now); }); } public function scopeForPlacement(Builder $query, string $placement): Builder { return $query->where('placement', $placement); } public function createdBy(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); } public function updatedBy(): BelongsTo { return $this->belongsTo(User::class, 'updated_by'); } }