diff --git a/app/Console/Commands/ImportArticleDocuments.php b/app/Console/Commands/ImportArticleDocuments.php index 2e9f2b6..d5d8c02 100644 --- a/app/Console/Commands/ImportArticleDocuments.php +++ b/app/Console/Commands/ImportArticleDocuments.php @@ -9,6 +9,7 @@ use App\Models\Document; use App\Models\DocumentCategory; use App\Models\DocumentVersion; use App\Models\User; +use App\Services\SiteRevalidationService; use Illuminate\Console\Command; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; @@ -127,6 +128,18 @@ class ImportArticleDocuments extends Command $existing = Document::where('public_uuid', $publicUuid)->first(); if ($existing) { + if ($markArchived && $article->status !== Article::STATUS_ARCHIVED) { + $article->update([ + 'status' => Article::STATUS_ARCHIVED, + 'archived_at' => now(), + 'last_updated_by_user_id' => ($article->creator ?: $fallbackUser)->id, + ]); + SiteRevalidationService::revalidateArticle($article->slug); + $this->info("✓ {$article->slug}: already imported, source article archived."); + + return 'archived_source'; + } + $this->warn("↷ {$article->slug}: already imported as document #{$existing->id}, skipping."); return 'skipped'; @@ -225,6 +238,7 @@ class ImportArticleDocuments extends Command 'archived_at' => now(), 'last_updated_by_user_id' => $actor->id, ]); + SiteRevalidationService::revalidateArticle($article->slug); } AuditLog::create([ diff --git a/tests/Feature/Cms/ImportArticleDocumentsCommandTest.php b/tests/Feature/Cms/ImportArticleDocumentsCommandTest.php index c15a424..7c55514 100644 --- a/tests/Feature/Cms/ImportArticleDocumentsCommandTest.php +++ b/tests/Feature/Cms/ImportArticleDocumentsCommandTest.php @@ -127,4 +127,45 @@ class ImportArticleDocumentsCommandTest extends TestCase $this->assertNotNull($article->archived_at); $this->assertDatabaseCount('documents', 1); } + + public function test_it_can_archive_already_imported_source_articles(): void + { + Storage::fake('public'); + Storage::fake('private'); + + $user = User::factory()->create(); + DocumentCategory::factory()->create([ + 'slug' => 'organization-public-disclosure', + 'name' => '組織公開資訊', + 'default_access_level' => 'public', + ]); + + $article = Article::factory()->create([ + 'title' => '先匯入後封存', + 'slug' => 'legacy-import-then-archive', + 'content_type' => Article::CONTENT_TYPE_DOCUMENT, + 'status' => Article::STATUS_PUBLISHED, + 'access_level' => Article::ACCESS_LEVEL_PUBLIC, + 'created_by_user_id' => $user->id, + 'last_updated_by_user_id' => $user->id, + ]); + + $this->artisan('articles:import-documents', [ + '--fallback-user-id' => $user->id, + ])->assertExitCode(0); + + $this->assertDatabaseCount('documents', 1); + $article->refresh(); + $this->assertSame(Article::STATUS_PUBLISHED, $article->status); + + $this->artisan('articles:import-documents', [ + '--fallback-user-id' => $user->id, + '--mark-archived' => true, + ])->assertExitCode(0); + + $article->refresh(); + $this->assertSame(Article::STATUS_ARCHIVED, $article->status); + $this->assertNotNull($article->archived_at); + $this->assertDatabaseCount('documents', 1); + } }