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,
'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(),

View file

@ -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(),

View file

@ -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(),

View file

@ -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(),

View file

@ -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',

View file

@ -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',
];

View file

@ -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',
];
}
}

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');
});
}
};