Send new artwork uploads through a trust-based review policy.

Require review for untrusted accounts, add admin artwork review APIs, and keep queued or auto-trusted publishes from counting as established history.
This commit is contained in:
test
2026-09-20 14:49:06 +02:00
parent 5437f84c4c
commit 366dbf1de8
14 changed files with 1175 additions and 70 deletions
+29 -1
View File
@@ -76,13 +76,41 @@ it('admin sees pending uploads', function () {
$owner = User::factory()->create();
$categoryId = createModerationCategory();
createModerationDraft($owner->id, $categoryId, ['title' => 'First Pending']);
createModerationDraft($owner->id, $categoryId, [
'title' => 'First Pending',
'description' => 'A spring garden scene.',
'tags' => json_encode(['tulip', 'garden']),
]);
createModerationDraft($owner->id, $categoryId, ['title' => 'Second Pending']);
$response = $this->actingAs($admin)->getJson('/api/admin/uploads/pending');
$response->assertOk();
$response->assertJsonCount(2, 'data');
$response->assertJsonPath('data.0.title', 'First Pending');
$response->assertJsonPath('data.0.description', 'A spring garden scene.');
$response->assertJsonPath('data.0.tags.0', 'tulip');
expect($response->json('data.0.preview_url'))->toContain('/api/admin/uploads/');
});
it('streams a signed preview for a pending upload', function () {
Storage::fake('local');
$admin = User::factory()->create(['role' => 'admin']);
$owner = User::factory()->create();
$categoryId = createModerationCategory();
$uploadId = createModerationDraft($owner->id, $categoryId);
Storage::disk('local')->put("tmp/drafts/{$uploadId}/preview.webp", 'preview-bytes');
$pending = $this->actingAs($admin)->getJson('/api/admin/uploads/pending');
$pending->assertOk();
$previewUrl = (string) $pending->json('data.0.preview_url');
$response = $this->actingAs($admin)->get($previewUrl);
$response->assertOk();
expect($response->headers->get('content-type'))->toStartWith('image/webp');
expect($response->streamedContent())->toBe('preview-bytes');
});
it('non-admin is denied moderation API access', function () {