feat(ai-edits): add output storage backfill flow and coverage
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled

This commit is contained in:
Codex Agent
2026-02-07 10:10:45 +01:00
parent fb45d1f6ab
commit 8cc0918881
18 changed files with 1610 additions and 18 deletions

View File

@@ -6,6 +6,7 @@ use App\Models\AiEditOutput;
use App\Models\AiEditRequest;
use App\Models\AiProviderRun;
use App\Services\AiEditing\AiEditingRuntimeConfig;
use App\Services\AiEditing\AiEditOutputStorageService;
use App\Services\AiEditing\AiImageProviderManager;
use App\Services\AiEditing\AiObservabilityService;
use App\Services\AiEditing\AiProviderResult;
@@ -51,6 +52,7 @@ class ProcessAiEditRequest implements ShouldQueue
AiAbuseEscalationService $abuseEscalation,
AiObservabilityService $observability,
AiStatusNotificationService $statusNotifications,
AiEditOutputStorageService $outputStorage,
AiEditingRuntimeConfig $runtimeConfig,
AiUsageLedgerService $usageLedger
): void {
@@ -90,6 +92,7 @@ class ProcessAiEditRequest implements ShouldQueue
$abuseEscalation,
$observability,
$statusNotifications,
$outputStorage,
$runtimeConfig,
$usageLedger
);
@@ -160,6 +163,7 @@ class ProcessAiEditRequest implements ShouldQueue
AiAbuseEscalationService $abuseEscalation,
AiObservabilityService $observability,
AiStatusNotificationService $statusNotifications,
AiEditOutputStorageService $outputStorage,
AiEditingRuntimeConfig $runtimeConfig,
AiUsageLedgerService $usageLedger
): void {
@@ -200,23 +204,33 @@ class ProcessAiEditRequest implements ShouldQueue
return;
}
DB::transaction(function () use ($request, $result): void {
DB::transaction(function () use ($request, $result, $outputStorage): void {
foreach ($result->outputs as $output) {
$persistedOutput = $outputStorage->persist($request, is_array($output) ? $output : []);
AiEditOutput::query()->updateOrCreate(
[
'request_id' => $request->id,
'provider_asset_id' => (string) Arr::get($output, 'provider_asset_id', ''),
'provider_asset_id' => (string) Arr::get($persistedOutput, 'provider_asset_id', ''),
],
[
'provider_url' => Arr::get($output, 'provider_url'),
'mime_type' => Arr::get($output, 'mime_type'),
'width' => Arr::get($output, 'width'),
'height' => Arr::get($output, 'height'),
'storage_disk' => Arr::get($persistedOutput, 'storage_disk'),
'storage_path' => Arr::get($persistedOutput, 'storage_path'),
'provider_url' => Arr::get($persistedOutput, 'provider_url'),
'mime_type' => Arr::get($persistedOutput, 'mime_type'),
'width' => Arr::get($persistedOutput, 'width'),
'height' => Arr::get($persistedOutput, 'height'),
'bytes' => Arr::get($persistedOutput, 'bytes'),
'checksum' => Arr::get($persistedOutput, 'checksum'),
'is_primary' => true,
'safety_state' => 'passed',
'safety_reasons' => [],
'generated_at' => now(),
'metadata' => ['provider' => $request->provider],
'metadata' => array_merge(
['provider' => $request->provider],
is_array(Arr::get($persistedOutput, 'metadata'))
? Arr::get($persistedOutput, 'metadata')
: []
),
]
);
}