119 - Extract publish eligibility into a RouteArticle scope

This commit is contained in:
myrmidex 2026-08-10 00:20:53 +02:00
parent ddd6514a77
commit 6f5b15a332
2 changed files with 15 additions and 5 deletions

View file

@ -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 // Get the oldest approved route_article that hasn't been published to its channel yet
$routeArticle = RouteArticle::where('approval_status', ApprovalStatusEnum::APPROVED) $routeArticle = RouteArticle::where('approval_status', ApprovalStatusEnum::APPROVED)
->where('publish_attempts', '<', RouteArticle::MAX_PUBLISH_ATTEMPTS) ->dueForPublishing()
->where(function ($query) {
$query->whereNull('next_attempt_at')
->orWhere('next_attempt_at', '<=', now());
})
->whereDoesntHave('article.articlePublications', function ($query) { ->whereDoesntHave('article.articlePublications', function ($query) {
$query->whereColumn('article_publications.platform_channel_id', 'route_articles.platform_channel_id'); $query->whereColumn('article_publications.platform_channel_id', 'route_articles.platform_channel_id');
}) })

View file

@ -6,6 +6,7 @@
use App\Enums\PublishStatusEnum; use App\Enums\PublishStatusEnum;
use App\Events\RouteArticleApproved; use App\Events\RouteArticleApproved;
use Database\Factories\RouteArticleFactory; use Database\Factories\RouteArticleFactory;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -136,4 +137,17 @@ public function hasExhaustedPublishAttempts(): bool
{ {
return $this->publish_attempts >= self::MAX_PUBLISH_ATTEMPTS; return $this->publish_attempts >= self::MAX_PUBLISH_ATTEMPTS;
} }
/**
* @param Builder<RouteArticle> $query
* @return Builder<RouteArticle>
*/
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());
});
}
} }