From 6f5b15a332492094c466841e911a8894d1782f7b Mon Sep 17 00:00:00 2001 From: myrmidex Date: Mon, 10 Aug 2026 00:20:53 +0200 Subject: [PATCH] 119 - Extract publish eligibility into a RouteArticle scope --- app/Jobs/PublishNextArticleJob.php | 6 +----- app/Models/RouteArticle.php | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/Jobs/PublishNextArticleJob.php b/app/Jobs/PublishNextArticleJob.php index e667ca65..868aca09 100644 --- a/app/Jobs/PublishNextArticleJob.php +++ b/app/Jobs/PublishNextArticleJob.php @@ -47,11 +47,7 @@ public function handle(PublishRouteArticleAction $publishRouteArticle): void // Get the oldest approved route_article that hasn't been published to its channel yet $routeArticle = RouteArticle::where('approval_status', ApprovalStatusEnum::APPROVED) - ->where('publish_attempts', '<', RouteArticle::MAX_PUBLISH_ATTEMPTS) - ->where(function ($query) { - $query->whereNull('next_attempt_at') - ->orWhere('next_attempt_at', '<=', now()); - }) + ->dueForPublishing() ->whereDoesntHave('article.articlePublications', function ($query) { $query->whereColumn('article_publications.platform_channel_id', 'route_articles.platform_channel_id'); }) diff --git a/app/Models/RouteArticle.php b/app/Models/RouteArticle.php index 999c61cd..2e7bb263 100644 --- a/app/Models/RouteArticle.php +++ b/app/Models/RouteArticle.php @@ -6,6 +6,7 @@ use App\Enums\PublishStatusEnum; use App\Events\RouteArticleApproved; use Database\Factories\RouteArticleFactory; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -136,4 +137,17 @@ public function hasExhaustedPublishAttempts(): bool { return $this->publish_attempts >= self::MAX_PUBLISH_ATTEMPTS; } + + /** + * @param Builder $query + * @return Builder + */ + public function scopeDueForPublishing(Builder $query): Builder + { + return $query->where('publish_attempts', '<', self::MAX_PUBLISH_ATTEMPTS) + ->where(function (Builder $query) { + $query->whereNull('next_attempt_at') + ->orWhere('next_attempt_at', '<=', now()); + }); + } }