fedi-feed-router/app/Jobs/PublishNextArticleJob.php

74 lines
2.3 KiB
PHP
Raw Normal View History

2025-08-12 20:16:44 +02:00
<?php
namespace App\Jobs;
use App\Actions\PublishRouteArticleAction;
use App\Enums\ApprovalStatusEnum;
use App\Enums\LogLevelEnum;
use App\Events\ActionPerformed;
2025-08-12 20:16:44 +02:00
use App\Exceptions\PublishException;
use App\Models\ArticlePublication;
use App\Models\RouteArticle;
use App\Models\Setting;
2025-08-12 20:16:44 +02:00
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
class PublishNextArticleJob implements ShouldBeUnique, ShouldQueue
2025-08-12 20:16:44 +02:00
{
use Queueable;
/**
* The number of seconds after which the job's unique lock will be released.
*/
public int $uniqueFor = 300;
public function __construct()
{
$this->onQueue('publishing');
}
/**
* Execute the job.
*
2025-08-12 20:16:44 +02:00
* @throws PublishException
*/
public function handle(PublishRouteArticleAction $publishRouteArticle): void
2025-08-12 20:16:44 +02:00
{
$interval = Setting::getArticlePublishingInterval();
if ($interval > 0) {
$lastPublishedAt = ArticlePublication::max('published_at');
if ($lastPublishedAt && now()->diffInMinutes($lastPublishedAt, absolute: true) < $interval) {
return;
}
}
// Get the oldest approved route_article that hasn't been published to its channel yet
$routeArticle = RouteArticle::where('approval_status', ApprovalStatusEnum::APPROVED)
->dueForPublishing()
->whereDoesntHave('article.articlePublications', function ($query) {
$query->whereColumn('article_publications.platform_channel_id', 'route_articles.platform_channel_id');
})
->oldest('route_articles.created_at')
->with(['article', 'platformChannel.platformInstance', 'platformChannel.activePlatformAccounts'])
2025-08-12 20:16:44 +02:00
->first();
if (! $routeArticle) {
2025-08-12 20:16:44 +02:00
return;
}
$article = $routeArticle->article;
ActionPerformed::dispatch('Publishing next article from scheduled job', LogLevelEnum::INFO, [
2025-08-12 20:16:44 +02:00
'article_id' => $article->id,
'title' => $article->title,
'url' => $article->url,
'route' => $routeArticle->feed_id.'-'.$routeArticle->platform_channel_id,
2025-08-12 20:16:44 +02:00
]);
$publishRouteArticle->execute($routeArticle);
2025-08-12 20:16:44 +02:00
}
}