trypost/app/Models/Post.php

103 lines
2.4 KiB
PHP
Raw Normal View History

2026-01-15 01:13:44 +00:00
<?php
namespace App\Models;
use App\Enums\Post\Status as PostStatus;
2026-01-15 01:13:44 +00:00
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Post extends Model
{
/** @use HasFactory<\Database\Factories\PostFactory> */
use HasFactory, HasUuids;
protected $fillable = [
'workspace_id',
'user_id',
'status',
'synced',
2026-01-15 01:13:44 +00:00
'scheduled_at',
'published_at',
];
protected function casts(): array
{
return [
'status' => PostStatus::class,
'synced' => 'boolean',
2026-01-15 01:13:44 +00:00
'scheduled_at' => 'datetime',
'published_at' => 'datetime',
];
}
public function workspace(): BelongsTo
{
return $this->belongsTo(Workspace::class);
}
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function postPlatforms(): HasMany
{
return $this->hasMany(PostPlatform::class);
}
public function scopeScheduled(Builder $query): Builder
{
return $query->where('status', PostStatus::Scheduled);
}
public function scopeDue(Builder $query): Builder
{
return $query->scheduled()->where('scheduled_at', '<=', now());
}
public function scopeDraft(Builder $query): Builder
{
return $query->where('status', PostStatus::Draft);
}
public function scopePublished(Builder $query): Builder
{
return $query->where('status', PostStatus::Published);
}
public function scopeFailed(Builder $query): Builder
{
return $query->where('status', PostStatus::Failed);
}
public function markAsPublishing(): void
{
$this->update(['status' => PostStatus::Publishing]);
}
public function markAsPublished(): void
{
$this->update([
'status' => PostStatus::Published,
'published_at' => now(),
]);
}
2026-01-15 17:24:39 +00:00
public function markAsPartiallyPublished(): void
{
$this->update([
'status' => PostStatus::PartiallyPublished,
'published_at' => now(),
]);
}
2026-01-15 01:13:44 +00:00
public function markAsFailed(): void
{
$this->update(['status' => PostStatus::Failed]);
}
}