presseportale/app/Models/PressReleaseAttachment.php
Kevin Adametz 6250b0bab4 media: PM-Medien privat ausliefern + Vorschau-Signatur (M4, M5, Fix#4/#5)
- Neue PM-Bilder/Anhänge liegen auf der privaten local-Disk; Auslieferung
  über kontrollierte Media-Routen mit gemeinsamer Zugriffslogik
  (AuthorizesPressReleaseMediaAccess). Öffentliche Medien werden aus den
  geladenen Modellen ermittelt (weniger Queries) und länger gecacht.
- Anonyme Token-Vorschau lädt Bilder über temporär signierte URLs (Fix#5).
- API-Resource baut Variant-URLs über die Media-Route statt /storage
  (Fix#4). Storage-Schicht prüft zusätzlich den serverseitigen MIME-Type (M5).
- press-releases:privatize-media migriert Bestandsmedien.

Deployment: einmalig `php artisan press-releases:privatize-media` ausführen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 13:48:06 +00:00

56 lines
1.3 KiB
PHP

<?php
namespace App\Models;
use Database\Factories\PressReleaseAttachmentFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class PressReleaseAttachment extends Model
{
/** @use HasFactory<PressReleaseAttachmentFactory> */
use HasFactory, SoftDeletes;
protected $fillable = [
'press_release_id',
'disk',
'path',
'original_name',
'mime',
'size',
'title',
'description',
'sort_order',
'legacy_portal',
'legacy_id',
];
protected function casts(): array
{
return [
'size' => 'integer',
'sort_order' => 'integer',
'deleted_at' => 'datetime',
];
}
public function pressRelease(): BelongsTo
{
return $this->belongsTo(PressRelease::class);
}
public function url(): ?string
{
if (blank($this->path)) {
return null;
}
if ($this->disk === 'public') {
return asset('storage/'.ltrim((string) $this->path, '/'));
}
return route('media.press-release-attachments.show', ['attachment' => $this->getKey()]);
}
}