- 공개 /api/symbols 엔드포인트 추가 (레벨 포함) - 심볼 계산기가 DB 데이터 기반으로 탭·카드 구성, 하드코딩 data.js 제거 - 심볼 카드 입력: 일퀘/주간퀘 Select(회→개 표기)/추가 심볼 3열 - 카드 상단에 '금일 일퀘 완료/미완료' 토글 (완료=에메랄드, 미완료=빨간색) - 관리자 페이지: 목록/폼 실 API 연결, dnd-kit 드래그 순서 변경, 레벨별 메소 입력 쉼표 포매팅 및 한글 요약 표시 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
39 lines
1.1 KiB
JavaScript
39 lines
1.1 KiB
JavaScript
import { Router } from 'express';
|
|
import { Symbol, SymbolLevel } from '../models/index.js';
|
|
import { getPublicUrl } from '../lib/s3.js';
|
|
|
|
const router = Router();
|
|
|
|
router.get('/', async (_req, res) => {
|
|
try {
|
|
const rows = await Symbol.findAll({
|
|
order: [['sort_order', 'ASC'], ['id', 'ASC']],
|
|
include: [{ model: SymbolLevel, as: 'levels' }],
|
|
});
|
|
res.json(rows.map((s) => {
|
|
const j = s.toJSON();
|
|
return {
|
|
id: j.id,
|
|
type: j.type,
|
|
region: j.region,
|
|
image_url: j.image ? getPublicUrl(j.image) : null,
|
|
max_level: j.max_level,
|
|
daily_default: j.daily_default,
|
|
weekly_default: j.weekly_default,
|
|
sort_order: j.sort_order,
|
|
levels: (j.levels || [])
|
|
.sort((a, b) => a.level - b.level)
|
|
.map((l) => ({
|
|
level: l.level,
|
|
required_count: l.required_count,
|
|
meso_cost: Number(l.meso_cost),
|
|
})),
|
|
};
|
|
}));
|
|
} catch (err) {
|
|
console.error('심볼 목록 조회 오류:', err.message);
|
|
res.status(500).json({ error: '심볼 목록 조회 실패' });
|
|
}
|
|
});
|
|
|
|
export default router;
|