*/ use HasFactory; protected $fillable = [ 'feed_id', 'platform_channel_id', 'article_id', 'approval_status', 'publish_status', 'publish_error', 'validated_at', 'decided_at', ]; protected $casts = [ 'approval_status' => ApprovalStatusEnum::class, 'publish_status' => PublishStatusEnum::class, 'validated_at' => 'datetime', 'decided_at' => 'datetime', ]; /** * @return BelongsTo */ public function route(): BelongsTo { return $this->belongsTo(Route::class, 'feed_id', 'feed_id') ->where('platform_channel_id', $this->platform_channel_id); } /** * @return BelongsTo */ public function article(): BelongsTo { return $this->belongsTo(Article::class); } /** * @return BelongsTo */ public function feed(): BelongsTo { return $this->belongsTo(Feed::class); } /** * @return BelongsTo */ public function platformChannel(): BelongsTo { return $this->belongsTo(PlatformChannel::class); } public function isPending(): bool { return $this->approval_status === ApprovalStatusEnum::PENDING; } public function isApproved(): bool { return $this->approval_status === ApprovalStatusEnum::APPROVED; } public function isRejected(): bool { return $this->approval_status === ApprovalStatusEnum::REJECTED; } public function approve(): void { if ($this->isApproved()) { return; } $this->update([ 'approval_status' => ApprovalStatusEnum::APPROVED, 'decided_at' => now(), ]); ActivityLogged::dispatch( ActivityTypeEnum::APPROVE, "Approved \"{$this->article->title}\"", ['route_article_id' => $this->id], $this->article, ); event(new RouteArticleApproved($this)); } public function reject(): void { if ($this->isRejected()) { return; } $this->update([ 'approval_status' => ApprovalStatusEnum::REJECTED, 'decided_at' => now(), ]); ActivityLogged::dispatch( ActivityTypeEnum::REJECT, "Rejected \"{$this->article->title}\"", ['route_article_id' => $this->id], $this->article, ); } public function recordPublishFailed(string $reason): void { $this->update([ 'publish_status' => PublishStatusEnum::ERROR, 'publish_error' => $reason, ]); } public function clearPublishFailure(): void { $this->update([ 'publish_status' => PublishStatusEnum::UNPUBLISHED, 'publish_error' => null, ]); } /** * A failed article is never picked up again on its own; the user retries it from the Articles page. * * @param Builder $query * @return Builder */ public function scopeDueForPublishing(Builder $query): Builder { return $query->where('publish_status', '!=', PublishStatusEnum::ERROR); } /** * @param Builder $query * @return Builder */ public function scopeFailed(Builder $query): Builder { return $query->where('publish_status', PublishStatusEnum::ERROR); } }