feat(tksafety): 위험성평가 모듈 Phase 1 구현 — DB·API·Excel·프론트엔드
5개 테이블(risk_projects/processes/items/mitigations/templates) + 마스터 시딩, 프로젝트·항목·감소대책 CRUD API, ExcelJS 평가표 내보내기, 프로젝트 목록·평가 수행 페이지, 사진 업로드(multer), 네비게이션·CSS 추가. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
60
tksafety/api/routes/riskRoutes.js
Normal file
60
tksafety/api/routes/riskRoutes.js
Normal file
@@ -0,0 +1,60 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const multer = require('multer');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const riskController = require('../controllers/riskController');
|
||||
const { requireAuth, requireAdmin } = require('../middleware/auth');
|
||||
|
||||
// 업로드 디렉토리 보장
|
||||
const uploadDir = path.join(__dirname, '..', 'uploads', 'risk');
|
||||
if (!fs.existsSync(uploadDir)) fs.mkdirSync(uploadDir, { recursive: true });
|
||||
|
||||
// Multer 설정
|
||||
const storage = multer.diskStorage({
|
||||
destination: (req, file, cb) => cb(null, uploadDir),
|
||||
filename: (req, file, cb) => {
|
||||
const ext = path.extname(file.originalname);
|
||||
cb(null, `${req.params.mitigationId}_photo_${Date.now()}${ext}`);
|
||||
}
|
||||
});
|
||||
const upload = multer({
|
||||
storage,
|
||||
limits: { fileSize: 10 * 1024 * 1024 },
|
||||
fileFilter: (req, file, cb) => {
|
||||
const allowed = ['.jpg', '.jpeg', '.png', '.gif', '.webp'];
|
||||
const ext = path.extname(file.originalname).toLowerCase();
|
||||
cb(null, allowed.includes(ext));
|
||||
}
|
||||
});
|
||||
|
||||
router.use(requireAuth);
|
||||
|
||||
// 공정 템플릿
|
||||
router.get('/templates', riskController.getTemplates);
|
||||
|
||||
// 프로젝트 CRUD
|
||||
router.get('/projects', riskController.getAllProjects);
|
||||
router.post('/projects', riskController.createProject);
|
||||
router.get('/projects/:id', riskController.getProjectById);
|
||||
router.patch('/projects/:id', riskController.updateProject);
|
||||
router.delete('/projects/:id', requireAdmin, riskController.deleteProject);
|
||||
|
||||
// 세부 공정 추가 (수시 평가용)
|
||||
router.post('/projects/:id/processes', riskController.addProcess);
|
||||
|
||||
// Excel 내보내기
|
||||
router.get('/projects/:id/export', riskController.exportExcel);
|
||||
|
||||
// 평가 항목 CRUD
|
||||
router.post('/processes/:processId/items', riskController.createItem);
|
||||
router.patch('/items/:itemId', riskController.updateItem);
|
||||
router.delete('/items/:itemId', requireAdmin, riskController.deleteItem);
|
||||
|
||||
// 감소대책 CRUD
|
||||
router.get('/projects/:id/mitigations', riskController.getMitigations);
|
||||
router.post('/projects/:id/mitigations', riskController.createMitigation);
|
||||
router.patch('/mitigations/:mitigationId', riskController.updateMitigation);
|
||||
router.post('/mitigations/:mitigationId/photo', upload.single('photo'), riskController.uploadPhoto);
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user