*/ public const EXPIRATIONS = [ '1h' => ['label' => '1 Hour', 'interval' => '1 hour'], '24h' => ['label' => '24 Hours', 'interval' => '1 day'], '48h' => ['label' => '48 Hours', 'interval' => '2 days'], '7d' => ['label' => '7 Days', 'interval' => '7 days'], '14d' => ['label' => '14 Days', 'interval' => '14 days'], '30d' => ['label' => '30 Days', 'interval' => '30 days'], ]; protected $fillable = [ 'token', 'password', 'encryption_key', 'encryption_salt', 'wrapped_key', 'expires_at', 'max_downloads', 'download_count', 'total_size', 'completed_at', ]; /** * @return array */ protected function casts(): array { return [ 'expires_at' => 'datetime', 'max_downloads' => 'integer', 'download_count' => 'integer', 'last_downloaded_at' => 'datetime', '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'; } }