'boolean', 'size' => 'integer', 'preview_generated_at' => 'datetime', ]; protected $appends = []; public function documentable(): MorphTo { return $this->morphTo(); } public function user(): BelongsTo { return $this->belongsTo(User::class); } // No direct public URL exposure; serve via controller stream protected static function booted(): void { static::deleting(function (Document $doc) { // Only delete files on force delete to keep data when soft-deleted if (method_exists($doc, 'isForceDeleting') && $doc->isForceDeleting()) { try { if ($doc->path) { $disk = $doc->disk ?: 'public'; Storage::disk($disk)->delete($doc->path); } } catch (\Throwable $e) { // swallow; avoid failing delete due to storage issue } try { if ($doc->preview_path) { $previewDisk = config('files.preview_disk', 'public'); Storage::disk($previewDisk)->delete($doc->preview_path); } } catch (\Throwable $e) { // swallow } } }); } }