*/ protected function casts(): array { return [ 'expires_at' => 'datetime', 'max_downloads' => 'integer', 'download_count' => 'integer', 'total_size' => 'integer', 'encryption_key' => 'encrypted', 'completed_at' => 'datetime', ]; } /** * @return HasMany */ public function files(): HasMany { return $this->hasMany(ShareFile::class); } /** * Whether the share was created: until then its files are still being uploaded and nobody * but the uploader's page may reach it. */ public function isCompleted(): bool { return $this->completed_at !== null; } public function isExpired(): bool { return $this->expires_at && $this->expires_at->isPast(); } public function isPasswordProtected(): bool { return ! is_null($this->password); } public function hasReachedDownloadLimit(): bool { return $this->max_downloads && $this->download_count >= $this->max_downloads; } public function getRouteKeyName(): string { return 'token'; } }