feat: use xpier media library for uploads and markdown embeds
Build and Deploy / verify (push) Successful in 35s
Build and Deploy / deploy (push) Successful in 33s

Store media:ID in article bodies instead of CDN URLs, and keep sablog attach tokens as a fallback.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
gouki
2026-09-16 19:03:52 +00:00
co-authored by Cursor
parent 0b0110a681
commit 64655ced1e
49 changed files with 5615 additions and 2132 deletions
+16
View File
@@ -13,6 +13,7 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Xpier\FilamentMediaLibrary\Models\MediaLibrary;
class Article extends Model
{
@@ -40,6 +41,7 @@ class Article extends Model
'cover_path',
'cover_source',
'cover_status',
'cover_media_id',
'cover_generated_at',
];
@@ -60,11 +62,20 @@ class Article extends Model
public function hasCover(): bool
{
if ($this->cover_media_id) {
return true;
}
return $this->cover_status === 'ready' && filled($this->cover_path);
}
public function coverUrl(): ?string
{
$libraryUrl = $this->coverMedia?->url;
if (filled($libraryUrl)) {
return (string) $libraryUrl;
}
return app(ArticleCoverService::class)->publicUrl($this);
}
@@ -123,6 +134,11 @@ class Article extends Model
return $this->hasMany(Attachment::class);
}
public function coverMedia(): BelongsTo
{
return $this->belongsTo(MediaLibrary::class, 'cover_media_id');
}
public function scopeVisible(Builder $query): Builder
{
return $query->where('visible', true);