wing-ops/backend/src/hns/hnsRouter.ts
htlee 63645e9f85 refactor(phase4): HNS 물질정보 DB 이전 + 정적 데이터 정리
- HNS_SUBSTANCE 테이블 마이그레이션 SQL 추가 (002_hns_substance.sql)
- HNS 검색/상세 API 구현 (hnsRouter, hnsService)
- HNS 시드 스크립트 추가 (seedHns.ts, 20종 물질 데이터)
- 프론트엔드 HNSSubstanceView: 정적 HNS_SEARCH_DB → API 호출 전환
- HNSSearchSubstance 타입 common/types/hns.ts로 분리
- Mock 데이터 이동: data/ → common/mock/ (vesselMockData, backtrackMockData)
- layerDatabase.ts → common/services/layerService.ts 이동
- layerData.ts → common/data/layerData.ts 이동
- scat/index.ts 누락 수정 + .gitignore scat 규칙 수정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 14:52:46 +09:00

54 lines
1.8 KiB
TypeScript

import express from 'express'
import { searchSubstances, getSubstanceById } from './hnsService.js'
import { isValidNumber } from '../middleware/security.js'
const router = express.Router()
// HNS 물질 검색
router.get('/', async (req, res) => {
try {
const q = req.query.q as string | undefined
const type = req.query.type as string | undefined
const sebc = req.query.sebc as string | undefined
const page = parseInt(req.query.page as string, 10) || 1
const limit = parseInt(req.query.limit as string, 10) || 50
if (!isValidNumber(page, 1, 10000) || !isValidNumber(limit, 1, 100)) {
return res.status(400).json({
error: '유효하지 않은 페이지네이션',
message: 'page는 1~10000, limit은 1~100 범위여야 합니다.',
})
}
const validTypes = ['abbreviation', 'nameKr', 'nameEn', 'casNumber', 'unNumber', 'cargoCode']
const searchType = type && validTypes.includes(type)
? type as 'abbreviation' | 'nameKr' | 'nameEn' | 'casNumber' | 'unNumber' | 'cargoCode'
: undefined
const result = await searchSubstances({ q, type: searchType, sebc, page, limit })
res.json(result)
} catch {
res.status(500).json({ error: 'HNS 물질 검색 실패' })
}
})
// HNS 물질 상세 조회
router.get('/:id', async (req, res) => {
try {
const id = parseInt(req.params.id, 10)
if (!isValidNumber(id, 1, 999999)) {
return res.status(400).json({ error: '유효하지 않은 물질 ID' })
}
const substance = await getSubstanceById(id)
if (!substance) {
return res.status(404).json({ error: '물질을 찾을 수 없습니다' })
}
res.json(substance)
} catch {
res.status(500).json({ error: 'HNS 물질 조회 실패' })
}
})
export default router