대표 이미지 저장 기능 구현

This commit is contained in:
dohyeons
2025-11-05 15:50:29 +09:00
parent 9429033e2c
commit df779ac04c
4 changed files with 108 additions and 37 deletions

View File

@@ -616,6 +616,7 @@ export const getComponentFiles = async (
regdate: file.regdate?.toISOString(),
status: file.status,
isTemplate, // 템플릿 파일 여부 표시
isRepresentative: file.is_representative || false, // 대표 파일 여부
});
const formattedTemplateFiles = templateFiles.map((file) =>
@@ -1088,5 +1089,68 @@ export const getFileByToken = async (req: Request, res: Response) => {
}
};
/**
* 대표 파일 설정
*/
export const setRepresentativeFile = async (
req: AuthenticatedRequest,
res: Response
): Promise<void> => {
try {
const { objid } = req.params;
const companyCode = req.user?.companyCode;
// 파일 존재 여부 및 권한 확인
const fileRecord = await queryOne<any>(
`SELECT * FROM attach_file_info WHERE objid = $1 AND status = $2`,
[parseInt(objid), "ACTIVE"]
);
if (!fileRecord) {
res.status(404).json({
success: false,
message: "파일을 찾을 수 없습니다.",
});
return;
}
// 멀티테넌시: 회사 코드 확인
if (companyCode !== "*" && fileRecord.company_code !== companyCode) {
res.status(403).json({
success: false,
message: "접근 권한이 없습니다.",
});
return;
}
// 같은 target_objid의 다른 파일들의 is_representative를 false로 설정
await query<any>(
`UPDATE attach_file_info
SET is_representative = false
WHERE target_objid = $1 AND objid != $2`,
[fileRecord.target_objid, parseInt(objid)]
);
// 선택한 파일을 대표 파일로 설정
await query<any>(
`UPDATE attach_file_info
SET is_representative = true
WHERE objid = $1`,
[parseInt(objid)]
);
res.json({
success: true,
message: "대표 파일이 설정되었습니다.",
});
} catch (error) {
console.error("대표 파일 설정 오류:", error);
res.status(500).json({
success: false,
message: "대표 파일 설정 중 오류가 발생했습니다.",
});
}
};
// Multer 미들웨어 export
export const uploadMiddleware = upload.array("files", 10); // 최대 10개 파일