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:
@@ -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';
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user