feat: 안전 코드 tksafety 이관 + 사용자 관리 정리 + UI Tailwind 전환

Phase 1: tksafety에 출입신청/체크리스트 API·웹 추가, tkfb 안전 코드 삭제
Phase 2: 사용자 관리 페이지 삭제, API 축소, 알림 수신자 tkuser 이관
Phase 3: tkuser 권한 페이지 정의 업데이트
Phase 4: 전체 34개 페이지 Tailwind CSS + tkfb-core.js 전환,
         미사용 CSS 20개·인프라 JS 10개·템플릿·컴포넌트 삭제

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-03-13 10:46:22 +09:00
parent 8373fe9e75
commit 9fda89a374
133 changed files with 5255 additions and 26181 deletions

View File

@@ -0,0 +1,18 @@
const express = require('express');
const router = express.Router();
const checklistController = require('../controllers/checklistController');
const { requireAuth, requireAdmin } = require('../middleware/auth');
router.use(requireAuth);
// Safety checks CRUD
router.get('/', checklistController.getAllChecks);
router.get('/weather-conditions', checklistController.getWeatherConditions);
router.get('/work-types', checklistController.getWorkTypes);
router.get('/tasks/:workTypeId', checklistController.getTasksByWorkType);
router.get('/:id', checklistController.getCheckById);
router.post('/', requireAdmin, checklistController.createCheck);
router.put('/:id', requireAdmin, checklistController.updateCheck);
router.delete('/:id', requireAdmin, checklistController.deleteCheck);
module.exports = router;

View File

@@ -0,0 +1,35 @@
const express = require('express');
const router = express.Router();
const visitRequestController = require('../controllers/visitRequestController');
const { requireAuth, requireAdmin, requirePage } = require('../middleware/auth');
router.use(requireAuth);
// Visit requests CRUD
router.post('/requests', requirePage('safety_visit_request'), visitRequestController.createVisitRequest);
router.get('/requests', visitRequestController.getAllVisitRequests);
router.get('/requests/:id', visitRequestController.getVisitRequestById);
router.put('/requests/:id', requirePage('safety_visit_request'), visitRequestController.updateVisitRequest);
router.delete('/requests/:id', requirePage('safety_visit_request'), visitRequestController.deleteVisitRequest);
router.put('/requests/:id/approve', requireAdmin, visitRequestController.approveVisitRequest);
router.put('/requests/:id/reject', requireAdmin, visitRequestController.rejectVisitRequest);
// Categories & Workplaces
router.get('/categories', visitRequestController.getAllCategories);
router.get('/workplaces', visitRequestController.getWorkplaces);
// Visit purposes
router.get('/purposes', visitRequestController.getAllVisitPurposes);
router.get('/purposes/active', visitRequestController.getActiveVisitPurposes);
router.post('/purposes', requireAdmin, visitRequestController.createVisitPurpose);
router.put('/purposes/:id', requireAdmin, visitRequestController.updateVisitPurpose);
router.delete('/purposes/:id', requireAdmin, visitRequestController.deleteVisitPurpose);
// Training records
router.post('/training', requireAdmin, visitRequestController.createTrainingRecord);
router.get('/training', visitRequestController.getTrainingRecords);
router.get('/training/request/:requestId', visitRequestController.getTrainingRecordByRequestId);
router.put('/training/:id', requireAdmin, visitRequestController.updateTrainingRecord);
router.post('/training/:id/complete', requireAdmin, visitRequestController.completeTraining);
module.exports = router;