feat: [bending] 기초자료 복사 시 R2 이미지 파일도 함께 복사

This commit is contained in:
김보곤
2026-03-21 11:51:54 +09:00
parent a71dab791a
commit d9a2cad063

View File

@@ -136,7 +136,7 @@ public function update(int $id, array $data): BendingItem
}
/**
* 기초자료 복사 — 같은 분류코드의 다음 번호 자동 채번
* 기초자료 복사 — 같은 분류코드의 다음 번호 자동 채번 + 이미지 복사
*/
public function duplicate(int $id): BendingItem
{
@@ -147,7 +147,7 @@ public function duplicate(int $id): BendingItem
$prefix = $m[1] ?? 'XX';
$newCode = $this->generateCode($prefix);
return BendingItem::create([
$newItem = BendingItem::create([
'tenant_id' => $source->tenant_id,
'code' => $newCode,
'item_name' => $source->item_name,
@@ -170,6 +170,58 @@ public function duplicate(int $id): BendingItem
'is_active' => true,
'created_by' => $this->apiUserId(),
]);
// 이미지 파일 복사 (R2)
$this->duplicateFiles($source, $newItem);
return $newItem;
}
/**
* 원본 아이템의 파일을 R2에서 복사하여 새 아이템에 연결
*/
private function duplicateFiles(BendingItem $source, BendingItem $target): void
{
$files = \App\Models\Commons\File::where('document_id', $source->id)
->where('document_type', 'bending_item')
->whereNull('deleted_at')
->get();
foreach ($files as $file) {
try {
$disk = \Illuminate\Support\Facades\Storage::disk('r2');
$newStoredName = bin2hex(random_bytes(8)).'.'.pathinfo($file->stored_name, PATHINFO_EXTENSION);
$dir = dirname($file->file_path);
$newPath = $dir.'/'.$newStoredName;
// R2 내 파일 복사
if ($file->file_path && $disk->exists($file->file_path)) {
$disk->copy($file->file_path, $newPath);
}
// 새 File 레코드 생성
\App\Models\Commons\File::create([
'tenant_id' => $target->tenant_id,
'document_id' => $target->id,
'document_type' => 'bending_item',
'field_key' => $file->field_key,
'file_path' => $newPath,
'stored_name' => $newStoredName,
'original_name' => $file->original_name,
'display_name' => $file->display_name,
'file_size' => $file->file_size,
'mime_type' => $file->mime_type,
'file_type' => $file->file_type,
'created_by' => $this->apiUserId(),
]);
} catch (\Throwable $e) {
\Illuminate\Support\Facades\Log::warning('BendingItem file duplicate failed', [
'source_id' => $source->id,
'file_id' => $file->id,
'error' => $e->getMessage(),
]);
}
}
}
public function delete(int $id): bool