$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', 'is_valid', 'is_duplicate', 'approval_status', 'approved_at', 'approved_by', 'fetched_at', 'validated_at', ]; /** * @return array */ public function casts(): array { return [ 'is_valid' => 'boolean', 'is_duplicate' => 'boolean', 'approval_status' => 'string', 'approved_at' => 'datetime', 'fetched_at' => 'datetime', 'validated_at' => 'datetime', 'created_at' => 'datetime', 'updated_at' => 'datetime', ]; } public function isValid(): bool { if (is_null($this->validated_at)) { return false; } if (is_null($this->is_valid)) { return false; } return $this->is_valid; } 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', 'approved_at' => now(), 'approved_by' => $approvedBy, ]); // Fire event to trigger publishing event(new ArticleApproved($this)); } public function reject(string $rejectedBy = null): void { $this->update([ 'approval_status' => 'rejected', 'approved_at' => now(), 'approved_by' => $rejectedBy, ]); } 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(); } /** * @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)); }); } }