99 - Move publish_status from Article to RouteArticle with PublishStatusEnum

This commit is contained in:
myrmidex 2026-03-18 17:31:47 +01:00
parent 9fb373d139
commit e7acbb6882
9 changed files with 67 additions and 5 deletions

View file

@ -0,0 +1,11 @@
<?php
namespace App\Enums;
enum PublishStatusEnum: string
{
case UNPUBLISHED = 'unpublished';
case PUBLISHING = 'publishing';
case PUBLISHED = 'published';
case ERROR = 'error';
}

View file

@ -21,7 +21,6 @@ public function toArray(Request $request): array
'url' => $this->url, 'url' => $this->url,
'title' => $this->title, 'title' => $this->title,
'description' => $this->description, 'description' => $this->description,
'publish_status' => $this->publish_status,
'validated_at' => $this->validated_at?->toISOString(), 'validated_at' => $this->validated_at?->toISOString(),
'is_published' => $this->relationLoaded('articlePublication') && $this->articlePublication !== null, 'is_published' => $this->relationLoaded('articlePublication') && $this->articlePublication !== null,
'created_at' => $this->created_at->toISOString(), 'created_at' => $this->created_at->toISOString(),

View file

@ -21,6 +21,7 @@ public function toArray(Request $request): array
'platform_channel_id' => $this->platform_channel_id, 'platform_channel_id' => $this->platform_channel_id,
'article_id' => $this->article_id, 'article_id' => $this->article_id,
'approval_status' => $this->approval_status->value, 'approval_status' => $this->approval_status->value,
'publish_status' => $this->publish_status->value,
'validated_at' => $this->validated_at?->toISOString(), 'validated_at' => $this->validated_at?->toISOString(),
'created_at' => $this->created_at->toISOString(), 'created_at' => $this->created_at->toISOString(),
'updated_at' => $this->updated_at->toISOString(), 'updated_at' => $this->updated_at->toISOString(),

View file

@ -6,6 +6,7 @@
use App\Enums\LogLevelEnum; use App\Enums\LogLevelEnum;
use App\Enums\NotificationSeverityEnum; use App\Enums\NotificationSeverityEnum;
use App\Enums\NotificationTypeEnum; use App\Enums\NotificationTypeEnum;
use App\Enums\PublishStatusEnum;
use App\Events\ActionPerformed; use App\Events\ActionPerformed;
use App\Exceptions\PublishException; use App\Exceptions\PublishException;
use App\Models\ArticlePublication; use App\Models\ArticlePublication;
@ -71,16 +72,22 @@ public function handle(ArticleFetcher $articleFetcher, ArticlePublishingService
'route' => $routeArticle->feed_id.'-'.$routeArticle->platform_channel_id, 'route' => $routeArticle->feed_id.'-'.$routeArticle->platform_channel_id,
]); ]);
$routeArticle->update(['publish_status' => PublishStatusEnum::PUBLISHING]);
try { try {
$extractedData = $articleFetcher->fetchArticleData($article); $extractedData = $articleFetcher->fetchArticleData($article);
$publication = $publishingService->publishRouteArticle($routeArticle, $extractedData); $publication = $publishingService->publishRouteArticle($routeArticle, $extractedData);
if ($publication) { if ($publication) {
$routeArticle->update(['publish_status' => PublishStatusEnum::PUBLISHED]);
ActionPerformed::dispatch('Successfully published article', LogLevelEnum::INFO, [ ActionPerformed::dispatch('Successfully published article', LogLevelEnum::INFO, [
'article_id' => $article->id, 'article_id' => $article->id,
'title' => $article->title, 'title' => $article->title,
]); ]);
} else { } else {
$routeArticle->update(['publish_status' => PublishStatusEnum::ERROR]);
ActionPerformed::dispatch('No publication created for article', LogLevelEnum::WARNING, [ ActionPerformed::dispatch('No publication created for article', LogLevelEnum::WARNING, [
'article_id' => $article->id, 'article_id' => $article->id,
'title' => $article->title, 'title' => $article->title,
@ -95,6 +102,8 @@ public function handle(ArticleFetcher $articleFetcher, ArticlePublishingService
); );
} }
} catch (PublishException $e) { } catch (PublishException $e) {
$routeArticle->update(['publish_status' => PublishStatusEnum::ERROR]);
ActionPerformed::dispatch('Failed to publish article', LogLevelEnum::ERROR, [ ActionPerformed::dispatch('Failed to publish article', LogLevelEnum::ERROR, [
'article_id' => $article->id, 'article_id' => $article->id,
'error' => $e->getMessage(), 'error' => $e->getMessage(),

View file

@ -5,6 +5,7 @@
use App\Enums\LogLevelEnum; use App\Enums\LogLevelEnum;
use App\Enums\NotificationSeverityEnum; use App\Enums\NotificationSeverityEnum;
use App\Enums\NotificationTypeEnum; use App\Enums\NotificationTypeEnum;
use App\Enums\PublishStatusEnum;
use App\Events\ActionPerformed; use App\Events\ActionPerformed;
use App\Events\RouteArticleApproved; use App\Events\RouteArticleApproved;
use App\Services\Article\ArticleFetcher; use App\Services\Article\ArticleFetcher;
@ -36,16 +37,22 @@ public function handle(RouteArticleApproved $event): void
return; return;
} }
$routeArticle->update(['publish_status' => PublishStatusEnum::PUBLISHING]);
try { try {
$extractedData = $this->articleFetcher->fetchArticleData($article); $extractedData = $this->articleFetcher->fetchArticleData($article);
$publication = $this->publishingService->publishRouteArticle($routeArticle, $extractedData); $publication = $this->publishingService->publishRouteArticle($routeArticle, $extractedData);
if ($publication) { if ($publication) {
$routeArticle->update(['publish_status' => PublishStatusEnum::PUBLISHED]);
ActionPerformed::dispatch('Published approved article', LogLevelEnum::INFO, [ ActionPerformed::dispatch('Published approved article', LogLevelEnum::INFO, [
'article_id' => $article->id, 'article_id' => $article->id,
'title' => $article->title, 'title' => $article->title,
]); ]);
} else { } else {
$routeArticle->update(['publish_status' => PublishStatusEnum::ERROR]);
ActionPerformed::dispatch('No publication created for approved article', LogLevelEnum::WARNING, [ ActionPerformed::dispatch('No publication created for approved article', LogLevelEnum::WARNING, [
'article_id' => $article->id, 'article_id' => $article->id,
'title' => $article->title, 'title' => $article->title,
@ -60,6 +67,8 @@ public function handle(RouteArticleApproved $event): void
); );
} }
} catch (Exception $e) { } catch (Exception $e) {
$routeArticle->update(['publish_status' => PublishStatusEnum::ERROR]);
ActionPerformed::dispatch('Failed to publish approved article', LogLevelEnum::ERROR, [ ActionPerformed::dispatch('Failed to publish approved article', LogLevelEnum::ERROR, [
'article_id' => $article->id, 'article_id' => $article->id,
'error' => $e->getMessage(), 'error' => $e->getMessage(),

View file

@ -22,7 +22,6 @@
* @property string $url * @property string $url
* @property string $title * @property string $title
* @property string|null $description * @property string|null $description
* @property string $publish_status
* @property Carbon|null $validated_at * @property Carbon|null $validated_at
* @property Carbon $created_at * @property Carbon $created_at
* @property Carbon $updated_at * @property Carbon $updated_at
@ -43,7 +42,6 @@ class Article extends Model
'published_at', 'published_at',
'author', 'author',
'validated_at', 'validated_at',
'publish_status',
]; ];
/** /**
@ -52,7 +50,6 @@ class Article extends Model
public function casts(): array public function casts(): array
{ {
return [ return [
'publish_status' => 'string',
'published_at' => 'datetime', 'published_at' => 'datetime',
'validated_at' => 'datetime', 'validated_at' => 'datetime',
'created_at' => 'datetime', 'created_at' => 'datetime',

View file

@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use App\Enums\ApprovalStatusEnum; use App\Enums\ApprovalStatusEnum;
use App\Enums\PublishStatusEnum;
use App\Events\RouteArticleApproved; use App\Events\RouteArticleApproved;
use Database\Factories\RouteArticleFactory; use Database\Factories\RouteArticleFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
@ -16,6 +17,7 @@
* @property int $platform_channel_id * @property int $platform_channel_id
* @property int $article_id * @property int $article_id
* @property ApprovalStatusEnum $approval_status * @property ApprovalStatusEnum $approval_status
* @property PublishStatusEnum $publish_status
* @property Carbon|null $validated_at * @property Carbon|null $validated_at
* @property Carbon $created_at * @property Carbon $created_at
* @property Carbon $updated_at * @property Carbon $updated_at
@ -30,11 +32,13 @@ class RouteArticle extends Model
'platform_channel_id', 'platform_channel_id',
'article_id', 'article_id',
'approval_status', 'approval_status',
'publish_status',
'validated_at', 'validated_at',
]; ];
protected $casts = [ protected $casts = [
'approval_status' => ApprovalStatusEnum::class, 'approval_status' => ApprovalStatusEnum::class,
'publish_status' => PublishStatusEnum::class,
'validated_at' => 'datetime', 'validated_at' => 'datetime',
]; ];

View file

@ -25,7 +25,6 @@ public function definition(): array
'image_url' => $this->faker->optional()->imageUrl(), 'image_url' => $this->faker->optional()->imageUrl(),
'published_at' => $this->faker->optional()->dateTimeBetween('-1 month', 'now'), 'published_at' => $this->faker->optional()->dateTimeBetween('-1 month', 'now'),
'author' => $this->faker->optional()->name(), 'author' => $this->faker->optional()->name(),
'publish_status' => 'unpublished',
]; ];
} }
} }

View file

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('route_articles', function (Blueprint $table) {
$table->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');
});
}
};