$array) * @method static where(string $string, string $url) * @method static create(array $array) * @property integer $id * @property int $feed_id * @property Feed $feed * @property string $url * @property bool|null $is_valid * @property Carbon|null $validated_at * @property Carbon $created_at * @property Carbon $updated_at * @property ArticlePublication $articlePublication */ class Article extends Model { /** @use HasFactory */ use HasFactory; protected $fillable = [ 'feed_id', 'url', 'title', 'description', 'content', 'image_url', 'published_at', 'author', 'approval_status', ]; /** * @return array */ public function casts(): array { return [ 'approval_status' => 'string', 'published_at' => 'datetime', 'created_at' => 'datetime', 'updated_at' => 'datetime', ]; } public function isValid(): bool { // In the consolidated schema, we only have approval_status // Consider 'approved' status as valid return $this->approval_status === 'approved'; } public function isApproved(): bool { return $this->approval_status === 'approved'; } public function isPending(): bool { return $this->approval_status === 'pending'; } public function isRejected(): bool { return $this->approval_status === 'rejected'; } public function approve(string $approvedBy = null): void { $this->update([ 'approval_status' => 'approved', ]); // Fire event to trigger publishing event(new ArticleApproved($this)); } public function reject(string $rejectedBy = null): void { $this->update([ 'approval_status' => 'rejected', ]); } public function canBePublished(): bool { if (!$this->isValid()) { return false; } // If approval system is disabled, auto-approve valid articles if (!\App\Models\Setting::isPublishingApprovalsEnabled()) { return true; } // If approval system is enabled, only approved articles can be published return $this->isApproved(); } public function getIsPublishedAttribute(): bool { return $this->articlePublication()->exists(); } /** * @return HasOne */ public function articlePublication(): HasOne { return $this->hasOne(ArticlePublication::class); } /** * @return BelongsTo */ public function feed(): BelongsTo { return $this->belongsTo(Feed::class); } protected static function booted(): void { static::created(function ($article) { event(new NewArticleFetched($article)); }); } }