fix(cms): allow archiving already-imported article documents
This commit is contained in:
@@ -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([
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user