feat: files 테이블 field_key 컬럼 추가 및 file_type VARCHAR 변경

- file_type: ENUM → VARCHAR(50) 변경 (확장성 개선)
- field_key: VARCHAR(100) 신규 컬럼 (비즈니스 용도 구분)
- ItemsFileController: field_key 사용, file_type 자동 분류 (detectFileType)
- File 모델: fillable에 field_key 추가
- ItemsService: getItemFiles()에서 field_key로 그룹핑
- rollback_items_migration: FK 제약조건 처리 수정
This commit is contained in:
2025-12-12 18:29:14 +09:00
parent 2e4d4d3be3
commit aa9746ae2f
5 changed files with 100 additions and 15 deletions

View File

@@ -51,13 +51,13 @@ public function index(int $id, Request $request)
// 특정 field_key만 조회
if ($fieldKey) {
$query->where('file_type', $fieldKey);
$query->where('field_key', $fieldKey);
}
$files = $query->orderBy('created_at', 'desc')->get();
// field_key별 그룹핑
$grouped = $files->groupBy('file_type')->map(function ($group) {
$grouped = $files->groupBy('field_key')->map(function ($group) {
return $group->map(fn ($file) => $this->formatFileResponse($file))->values();
});
@@ -115,6 +115,10 @@ public function upload(int $id, ItemFileUploadRequest $request)
// 파일 저장 (tenant 디스크)
Storage::disk('tenant')->putFileAs($directory, $uploadedFile, $storedName);
// file_type 자동 분류 (MIME 타입 기반)
$mimeType = $uploadedFile->getMimeType();
$fileType = $this->detectFileType($mimeType);
// files 테이블에 저장
$file = File::create([
'tenant_id' => $tenantId,
@@ -122,8 +126,9 @@ public function upload(int $id, ItemFileUploadRequest $request)
'stored_name' => $storedName,
'file_path' => $filePath,
'file_size' => $uploadedFile->getSize(),
'mime_type' => $uploadedFile->getMimeType(),
'file_type' => $fieldKey, // field_key
'mime_type' => $mimeType,
'file_type' => $fileType, // 파일 형식 (image, document, excel, archive)
'field_key' => $fieldKey, // 비즈니스 용도 (drawing, certificate 등)
'document_id' => $id,
'document_type' => self::ITEM_GROUP_ID, // group_id
'is_temp' => false,
@@ -215,7 +220,8 @@ private function formatFileResponse(File $file): array
'file_url' => $this->getFileUrl($file->file_path),
'file_size' => $file->file_size,
'mime_type' => $file->mime_type,
'field_key' => $file->file_type,
'file_type' => $file->file_type,
'field_key' => $file->field_key,
'created_at' => $file->created_at?->format('Y-m-d H:i:s'),
];
}
@@ -227,4 +233,34 @@ private function getFileUrl(string $filePath): string
{
return url('/api/v1/files/download/'.base64_encode($filePath));
}
/**
* MIME 타입 기반 파일 형식 분류
*/
private function detectFileType(string $mimeType): string
{
if (str_starts_with($mimeType, 'image/')) {
return 'image';
}
if (in_array($mimeType, [
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'text/csv',
])) {
return 'excel';
}
if (in_array($mimeType, [
'application/zip',
'application/x-rar-compressed',
'application/x-7z-compressed',
'application/gzip',
])) {
return 'archive';
}
// 기본값: document (pdf, doc, hwp 등)
return 'document';
}
}