fix(cms): allow archiving already-imported article documents

This commit is contained in:
2026-02-11 09:20:44 +08:00
parent ec2b1d21f4
commit 7095be82d5
2 changed files with 55 additions and 0 deletions

View File

@@ -9,6 +9,7 @@ use App\Models\Document;
use App\Models\DocumentCategory; use App\Models\DocumentCategory;
use App\Models\DocumentVersion; use App\Models\DocumentVersion;
use App\Models\User; use App\Models\User;
use App\Services\SiteRevalidationService;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
@@ -127,6 +128,18 @@ class ImportArticleDocuments extends Command
$existing = Document::where('public_uuid', $publicUuid)->first(); $existing = Document::where('public_uuid', $publicUuid)->first();
if ($existing) { 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."); $this->warn("{$article->slug}: already imported as document #{$existing->id}, skipping.");
return 'skipped'; return 'skipped';
@@ -225,6 +238,7 @@ class ImportArticleDocuments extends Command
'archived_at' => now(), 'archived_at' => now(),
'last_updated_by_user_id' => $actor->id, 'last_updated_by_user_id' => $actor->id,
]); ]);
SiteRevalidationService::revalidateArticle($article->slug);
} }
AuditLog::create([ AuditLog::create([

View File

@@ -127,4 +127,45 @@ class ImportArticleDocumentsCommandTest extends TestCase
$this->assertNotNull($article->archived_at); $this->assertNotNull($article->archived_at);
$this->assertDatabaseCount('documents', 1); $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);
}
} }