From e7acbb6882f6bf740c08a36383b55cccb0e7a955 Mon Sep 17 00:00:00 2001 From: myrmidex Date: Wed, 18 Mar 2026 17:31:47 +0100 Subject: [PATCH] 99 - Move publish_status from Article to RouteArticle with PublishStatusEnum --- app/Enums/PublishStatusEnum.php | 11 +++++++ app/Http/Resources/ArticleResource.php | 1 - app/Http/Resources/RouteArticleResource.php | 1 + app/Jobs/PublishNextArticleJob.php | 9 +++++ .../PublishApprovedArticleListener.php | 9 +++++ app/Models/Article.php | 3 -- app/Models/RouteArticle.php | 4 +++ database/factories/ArticleFactory.php | 1 - ..._move_publish_status_to_route_articles.php | 33 +++++++++++++++++++ 9 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 app/Enums/PublishStatusEnum.php create mode 100644 database/migrations/2024_01_01_000010_move_publish_status_to_route_articles.php diff --git a/app/Enums/PublishStatusEnum.php b/app/Enums/PublishStatusEnum.php new file mode 100644 index 0000000..03260e3 --- /dev/null +++ b/app/Enums/PublishStatusEnum.php @@ -0,0 +1,11 @@ + $this->url, 'title' => $this->title, 'description' => $this->description, - 'publish_status' => $this->publish_status, 'validated_at' => $this->validated_at?->toISOString(), 'is_published' => $this->relationLoaded('articlePublication') && $this->articlePublication !== null, 'created_at' => $this->created_at->toISOString(), diff --git a/app/Http/Resources/RouteArticleResource.php b/app/Http/Resources/RouteArticleResource.php index 2bb350e..73d9520 100644 --- a/app/Http/Resources/RouteArticleResource.php +++ b/app/Http/Resources/RouteArticleResource.php @@ -21,6 +21,7 @@ public function toArray(Request $request): array 'platform_channel_id' => $this->platform_channel_id, 'article_id' => $this->article_id, 'approval_status' => $this->approval_status->value, + 'publish_status' => $this->publish_status->value, 'validated_at' => $this->validated_at?->toISOString(), 'created_at' => $this->created_at->toISOString(), 'updated_at' => $this->updated_at->toISOString(), diff --git a/app/Jobs/PublishNextArticleJob.php b/app/Jobs/PublishNextArticleJob.php index c0fd39d..fd9a811 100644 --- a/app/Jobs/PublishNextArticleJob.php +++ b/app/Jobs/PublishNextArticleJob.php @@ -6,6 +6,7 @@ use App\Enums\LogLevelEnum; use App\Enums\NotificationSeverityEnum; use App\Enums\NotificationTypeEnum; +use App\Enums\PublishStatusEnum; use App\Events\ActionPerformed; use App\Exceptions\PublishException; use App\Models\ArticlePublication; @@ -71,16 +72,22 @@ public function handle(ArticleFetcher $articleFetcher, ArticlePublishingService 'route' => $routeArticle->feed_id.'-'.$routeArticle->platform_channel_id, ]); + $routeArticle->update(['publish_status' => PublishStatusEnum::PUBLISHING]); + try { $extractedData = $articleFetcher->fetchArticleData($article); $publication = $publishingService->publishRouteArticle($routeArticle, $extractedData); if ($publication) { + $routeArticle->update(['publish_status' => PublishStatusEnum::PUBLISHED]); + ActionPerformed::dispatch('Successfully published article', LogLevelEnum::INFO, [ 'article_id' => $article->id, 'title' => $article->title, ]); } else { + $routeArticle->update(['publish_status' => PublishStatusEnum::ERROR]); + ActionPerformed::dispatch('No publication created for article', LogLevelEnum::WARNING, [ 'article_id' => $article->id, 'title' => $article->title, @@ -95,6 +102,8 @@ public function handle(ArticleFetcher $articleFetcher, ArticlePublishingService ); } } catch (PublishException $e) { + $routeArticle->update(['publish_status' => PublishStatusEnum::ERROR]); + ActionPerformed::dispatch('Failed to publish article', LogLevelEnum::ERROR, [ 'article_id' => $article->id, 'error' => $e->getMessage(), diff --git a/app/Listeners/PublishApprovedArticleListener.php b/app/Listeners/PublishApprovedArticleListener.php index ccd7764..b08e3b7 100644 --- a/app/Listeners/PublishApprovedArticleListener.php +++ b/app/Listeners/PublishApprovedArticleListener.php @@ -5,6 +5,7 @@ use App\Enums\LogLevelEnum; use App\Enums\NotificationSeverityEnum; use App\Enums\NotificationTypeEnum; +use App\Enums\PublishStatusEnum; use App\Events\ActionPerformed; use App\Events\RouteArticleApproved; use App\Services\Article\ArticleFetcher; @@ -36,16 +37,22 @@ public function handle(RouteArticleApproved $event): void return; } + $routeArticle->update(['publish_status' => PublishStatusEnum::PUBLISHING]); + try { $extractedData = $this->articleFetcher->fetchArticleData($article); $publication = $this->publishingService->publishRouteArticle($routeArticle, $extractedData); if ($publication) { + $routeArticle->update(['publish_status' => PublishStatusEnum::PUBLISHED]); + ActionPerformed::dispatch('Published approved article', LogLevelEnum::INFO, [ 'article_id' => $article->id, 'title' => $article->title, ]); } else { + $routeArticle->update(['publish_status' => PublishStatusEnum::ERROR]); + ActionPerformed::dispatch('No publication created for approved article', LogLevelEnum::WARNING, [ 'article_id' => $article->id, 'title' => $article->title, @@ -60,6 +67,8 @@ public function handle(RouteArticleApproved $event): void ); } } catch (Exception $e) { + $routeArticle->update(['publish_status' => PublishStatusEnum::ERROR]); + ActionPerformed::dispatch('Failed to publish approved article', LogLevelEnum::ERROR, [ 'article_id' => $article->id, 'error' => $e->getMessage(), diff --git a/app/Models/Article.php b/app/Models/Article.php index 6156321..dfd03ea 100644 --- a/app/Models/Article.php +++ b/app/Models/Article.php @@ -22,7 +22,6 @@ * @property string $url * @property string $title * @property string|null $description - * @property string $publish_status * @property Carbon|null $validated_at * @property Carbon $created_at * @property Carbon $updated_at @@ -43,7 +42,6 @@ class Article extends Model 'published_at', 'author', 'validated_at', - 'publish_status', ]; /** @@ -52,7 +50,6 @@ class Article extends Model public function casts(): array { return [ - 'publish_status' => 'string', 'published_at' => 'datetime', 'validated_at' => 'datetime', 'created_at' => 'datetime', diff --git a/app/Models/RouteArticle.php b/app/Models/RouteArticle.php index 8b7c4ac..7e71b52 100644 --- a/app/Models/RouteArticle.php +++ b/app/Models/RouteArticle.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Enums\ApprovalStatusEnum; +use App\Enums\PublishStatusEnum; use App\Events\RouteArticleApproved; use Database\Factories\RouteArticleFactory; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -16,6 +17,7 @@ * @property int $platform_channel_id * @property int $article_id * @property ApprovalStatusEnum $approval_status + * @property PublishStatusEnum $publish_status * @property Carbon|null $validated_at * @property Carbon $created_at * @property Carbon $updated_at @@ -30,11 +32,13 @@ class RouteArticle extends Model 'platform_channel_id', 'article_id', 'approval_status', + 'publish_status', 'validated_at', ]; protected $casts = [ 'approval_status' => ApprovalStatusEnum::class, + 'publish_status' => PublishStatusEnum::class, 'validated_at' => 'datetime', ]; diff --git a/database/factories/ArticleFactory.php b/database/factories/ArticleFactory.php index f236a63..d5a57bb 100644 --- a/database/factories/ArticleFactory.php +++ b/database/factories/ArticleFactory.php @@ -25,7 +25,6 @@ public function definition(): array 'image_url' => $this->faker->optional()->imageUrl(), 'published_at' => $this->faker->optional()->dateTimeBetween('-1 month', 'now'), 'author' => $this->faker->optional()->name(), - 'publish_status' => 'unpublished', ]; } } diff --git a/database/migrations/2024_01_01_000010_move_publish_status_to_route_articles.php b/database/migrations/2024_01_01_000010_move_publish_status_to_route_articles.php new file mode 100644 index 0000000..97c0828 --- /dev/null +++ b/database/migrations/2024_01_01_000010_move_publish_status_to_route_articles.php @@ -0,0 +1,33 @@ +enum('publish_status', ['unpublished', 'publishing', 'published', 'error']) + ->default('unpublished') + ->after('approval_status'); + }); + + Schema::table('articles', function (Blueprint $table) { + $table->dropColumn('publish_status'); + }); + } + + public function down(): void + { + Schema::table('articles', function (Blueprint $table) { + $table->enum('publish_status', ['unpublished', 'publishing', 'published', 'error']) + ->default('unpublished'); + }); + + Schema::table('route_articles', function (Blueprint $table) { + $table->dropColumn('publish_status'); + }); + } +};