2025-09-05 21:52:19 +09:00
|
|
|
import { Router } from "express";
|
|
|
|
|
import {
|
|
|
|
|
uploadFiles,
|
|
|
|
|
deleteFile,
|
|
|
|
|
getFileList,
|
2025-09-29 13:29:03 +09:00
|
|
|
getComponentFiles,
|
2025-09-05 21:52:19 +09:00
|
|
|
downloadFile,
|
2025-09-08 13:10:09 +09:00
|
|
|
previewFile,
|
2025-09-06 00:16:27 +09:00
|
|
|
getLinkedFiles,
|
2025-09-05 21:52:19 +09:00
|
|
|
uploadMiddleware,
|
2025-09-29 13:29:03 +09:00
|
|
|
generateTempToken,
|
|
|
|
|
getFileByToken,
|
2025-11-05 15:50:29 +09:00
|
|
|
setRepresentativeFile,
|
2025-09-05 21:52:19 +09:00
|
|
|
} from "../controllers/fileController";
|
2025-09-05 12:04:13 +09:00
|
|
|
import { authenticateToken } from "../middleware/authMiddleware";
|
|
|
|
|
|
2025-09-05 21:52:19 +09:00
|
|
|
const router = Router();
|
2025-09-05 12:04:13 +09:00
|
|
|
|
2025-09-29 13:29:03 +09:00
|
|
|
// 공개 접근 라우트 (인증 불필요)
|
|
|
|
|
/**
|
|
|
|
|
* @route GET /api/files/public/:token
|
|
|
|
|
* @desc 임시 토큰으로 파일 접근 (Google Docs Viewer용)
|
|
|
|
|
* @access Public
|
|
|
|
|
*/
|
|
|
|
|
router.get("/public/:token", getFileByToken);
|
|
|
|
|
|
2025-09-05 21:52:19 +09:00
|
|
|
// 모든 파일 API는 인증 필요
|
2025-09-05 12:04:13 +09:00
|
|
|
router.use(authenticateToken);
|
|
|
|
|
|
|
|
|
|
/**
|
2025-09-05 21:52:19 +09:00
|
|
|
* @route POST /api/files/upload
|
|
|
|
|
* @desc 파일 업로드 (attach_file_info 테이블에 저장)
|
|
|
|
|
* @access Private
|
2025-09-05 12:04:13 +09:00
|
|
|
*/
|
2025-09-05 21:52:19 +09:00
|
|
|
router.post("/upload", uploadMiddleware, uploadFiles);
|
2025-09-05 12:04:13 +09:00
|
|
|
|
|
|
|
|
/**
|
2025-09-05 21:52:19 +09:00
|
|
|
* @route GET /api/files
|
|
|
|
|
* @desc 파일 목록 조회
|
|
|
|
|
* @query targetObjid, docType, companyCode
|
|
|
|
|
* @access Private
|
2025-09-05 12:04:13 +09:00
|
|
|
*/
|
2025-09-05 21:52:19 +09:00
|
|
|
router.get("/", getFileList);
|
2025-09-05 12:04:13 +09:00
|
|
|
|
2025-09-29 13:29:03 +09:00
|
|
|
/**
|
|
|
|
|
* @route GET /api/files/component-files
|
|
|
|
|
* @desc 컴포넌트의 템플릿 파일과 데이터 파일 모두 조회
|
|
|
|
|
* @query screenId, componentId, tableName, recordId, columnName
|
|
|
|
|
* @access Private
|
|
|
|
|
*/
|
|
|
|
|
router.get("/component-files", getComponentFiles);
|
|
|
|
|
|
2025-09-06 00:16:27 +09:00
|
|
|
/**
|
|
|
|
|
* @route GET /api/files/linked/:tableName/:recordId
|
|
|
|
|
* @desc 테이블 연결된 파일 조회
|
|
|
|
|
* @access Private
|
|
|
|
|
*/
|
|
|
|
|
router.get("/linked/:tableName/:recordId", getLinkedFiles);
|
|
|
|
|
|
2025-09-05 14:52:10 +09:00
|
|
|
/**
|
2025-09-05 21:52:19 +09:00
|
|
|
* @route DELETE /api/files/:objid
|
|
|
|
|
* @desc 파일 삭제 (논리적 삭제)
|
|
|
|
|
* @access Private
|
2025-09-05 14:52:10 +09:00
|
|
|
*/
|
2025-09-05 21:52:19 +09:00
|
|
|
router.delete("/:objid", deleteFile);
|
2025-09-05 14:52:10 +09:00
|
|
|
|
2025-09-08 13:10:09 +09:00
|
|
|
/**
|
|
|
|
|
* @route GET /api/files/preview/:objid
|
|
|
|
|
* @desc 파일 미리보기 (이미지 등)
|
|
|
|
|
* @access Private
|
|
|
|
|
*/
|
|
|
|
|
router.get("/preview/:objid", previewFile);
|
|
|
|
|
|
2025-09-05 12:04:13 +09:00
|
|
|
/**
|
2025-09-05 21:52:19 +09:00
|
|
|
* @route GET /api/files/download/:objid
|
|
|
|
|
* @desc 파일 다운로드
|
|
|
|
|
* @access Private
|
2025-09-05 12:04:13 +09:00
|
|
|
*/
|
2025-09-05 21:52:19 +09:00
|
|
|
router.get("/download/:objid", downloadFile);
|
2025-09-05 12:04:13 +09:00
|
|
|
|
2025-09-29 13:29:03 +09:00
|
|
|
/**
|
|
|
|
|
* @route POST /api/files/temp-token/:objid
|
|
|
|
|
* @desc Google Docs Viewer용 임시 공개 토큰 생성
|
|
|
|
|
* @access Private
|
|
|
|
|
*/
|
|
|
|
|
router.post("/temp-token/:objid", generateTempToken);
|
|
|
|
|
|
2025-11-05 15:50:29 +09:00
|
|
|
/**
|
|
|
|
|
* @route PUT /api/files/representative/:objid
|
|
|
|
|
* @desc 대표 파일 설정
|
|
|
|
|
* @access Private
|
|
|
|
|
*/
|
|
|
|
|
router.put("/representative/:objid", setRepresentativeFile);
|
|
|
|
|
|
2025-09-05 12:04:13 +09:00
|
|
|
export default router;
|