Files
fitness/app/Models/Post.php
T
rootandClaude Sonnet 5 0a36afbfdc Add feature test coverage for the core domain
Only Breeze's default auth/profile tests existed - nothing covered
Workouts, Sessions, Exercises, Yoga, Favorites, Blog, or the Admin
panel, which is the actual product. Adds factories for the domain
models and 45 new feature tests covering the main flows plus
authorization boundaries (owner-only access on workouts/sessions,
admin-only access on /admin, drafts hidden from the public blog).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 11:47:51 +03:00

61 lines
1.3 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Facades\Storage;
class Post extends Model
{
use HasFactory;
protected $fillable = [
'title',
'slug',
'excerpt',
'body',
'cover_image',
'author_id',
'published_at',
];
protected $casts = [
'published_at' => 'datetime',
];
public function getRouteKeyName(): string
{
return 'slug';
}
public function author(): BelongsTo
{
return $this->belongsTo(User::class, 'author_id');
}
public function scopePublished(Builder $query): Builder
{
return $query->whereNotNull('published_at')->where('published_at', '<=', now());
}
public function getIsPublishedAttribute(): bool
{
return $this->published_at !== null && $this->published_at->lte(now());
}
public function getCoverUrlAttribute(): ?string
{
$cover = (string) ($this->attributes['cover_image'] ?? '');
if ($cover === '') {
return null;
}
if (preg_match('/^https?:\/\//i', $cover)) {
return $cover;
}
return Storage::url($cover);
}
}