import { Router } from 'express'; import { requireAuth } from '../auth/authMiddleware.js'; import { listIncidents, getIncident, listIncidentPredictions, getIncidentWeather, saveIncidentWeather, getIncidentMedia, getIncidentImageAnalysis, } from './incidentsService.js'; const router = Router(); // ============================================================ // GET /api/incidents — 사고 목록 // ============================================================ router.get('/', requireAuth, async (req, res) => { try { const { status, region, search, startDate, endDate } = req.query as { status?: string; region?: string; search?: string; startDate?: string; endDate?: string; }; const incidents = await listIncidents({ status, region, search, startDate, endDate }); res.json(incidents); } catch (err) { console.error('[incidents] 사고 목록 조회 오류:', err); res.status(500).json({ error: '사고 목록 조회 중 오류가 발생했습니다.' }); } }); // ============================================================ // GET /api/incidents/:sn — 사고 상세 // ============================================================ router.get('/:sn', requireAuth, async (req, res) => { try { const sn = parseInt(req.params.sn as string, 10); if (isNaN(sn)) { res.status(400).json({ error: '유효하지 않은 사고 번호입니다.' }); return; } const incident = await getIncident(sn); if (!incident) { res.status(404).json({ error: '사고를 찾을 수 없습니다.' }); return; } res.json(incident); } catch (err) { console.error('[incidents] 사고 상세 조회 오류:', err); res.status(500).json({ error: '사고 상세 조회 중 오류가 발생했습니다.' }); } }); // ============================================================ // GET /api/incidents/:sn/predictions — 예측 실행 목록 // ============================================================ router.get('/:sn/predictions', requireAuth, async (req, res) => { try { const sn = parseInt(req.params.sn as string, 10); if (isNaN(sn)) { res.status(400).json({ error: '유효하지 않은 사고 번호입니다.' }); return; } const predictions = await listIncidentPredictions(sn); res.json(predictions); } catch (err) { console.error('[incidents] 예측 목록 조회 오류:', err); res.status(500).json({ error: '예측 목록 조회 중 오류가 발생했습니다.' }); } }); // ============================================================ // GET /api/incidents/:sn/weather — 기상정보 // ============================================================ router.get('/:sn/weather', requireAuth, async (req, res) => { try { const sn = parseInt(req.params.sn as string, 10); if (isNaN(sn)) { res.status(400).json({ error: '유효하지 않은 사고 번호입니다.' }); return; } const weather = await getIncidentWeather(sn); if (!weather) { res.json({ message: '기상정보가 없습니다.' }); return; } res.json(weather); } catch (err) { console.error('[incidents] 기상정보 조회 오류:', err); res.status(500).json({ error: '기상정보 조회 중 오류가 발생했습니다.' }); } }); // ============================================================ // POST /api/incidents/:sn/weather — 기상정보 저장 // ============================================================ router.post('/:sn/weather', requireAuth, async (req, res) => { try { const sn = parseInt(req.params.sn as string, 10); if (isNaN(sn)) { res.status(400).json({ error: '유효하지 않은 사고 번호입니다.' }); return; } const weatherSn = await saveIncidentWeather(sn, req.body as Record); res.json({ weatherSn }); } catch (err) { console.error('[incidents] 기상정보 저장 오류:', err); res.status(500).json({ error: '기상정보 저장 중 오류가 발생했습니다.' }); } }); // ============================================================ // GET /api/incidents/:sn/media — 미디어 정보 // ============================================================ router.get('/:sn/media', requireAuth, async (req, res) => { try { const sn = parseInt(req.params.sn as string, 10); if (isNaN(sn)) { res.status(400).json({ error: '유효하지 않은 사고 번호입니다.' }); return; } const media = await getIncidentMedia(sn); if (!media) { res.json({ message: '미디어 정보가 없습니다.' }); return; } res.json(media); } catch (err) { console.error('[incidents] 미디어 정보 조회 오류:', err); res.status(500).json({ error: '미디어 정보 조회 중 오류가 발생했습니다.' }); } }); // ============================================================ // GET /api/incidents/:sn/image-analysis — 이미지 분석 데이터 // ============================================================ router.get('/:sn/image-analysis', requireAuth, async (req, res) => { try { const sn = parseInt(req.params.sn as string, 10); if (isNaN(sn)) { res.status(400).json({ error: '유효하지 않은 사고 번호입니다.' }); return; } const data = await getIncidentImageAnalysis(sn); if (!data) { res.status(404).json({ error: '이미지 분석 데이터가 없습니다.' }); return; } res.json(data); } catch (err) { console.error('[incidents] 이미지 분석 데이터 조회 오류:', err); res.status(500).json({ error: '이미지 분석 데이터 조회 중 오류가 발생했습니다.' }); } }); export default router;