maplestory/backend/routes/characters.js
caadiq 4bbb496724 초기 프로젝트 설정
- React + Vite + Tailwind 프론트엔드
- Express + Sequelize + MariaDB 백엔드
- 넥슨 OAuth 2.0 인증 (캐릭터 목록 조회)
- 주간 보스 결정석 수익 계산기 UI (리스트형)
- Docker Compose + Caddy 리버스 프록시 설정
- 보스/난이도 이미지 에셋 포함

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 18:55:06 +09:00

63 lines
2 KiB
JavaScript

import { Router } from 'express';
import { requireAuth } from '../middleware/auth.js';
import { getCharacterList, getCharacterOcid, getCharacterBasic } from '../services/nexon.js';
import { UserCharacter } from '../models/index.js';
const router = Router();
// 내 캐릭터 목록 조회
router.get('/', requireAuth, async (req, res) => {
try {
const characters = await UserCharacter.findAll({
where: { user_id: req.session.userId },
order: [['character_level', 'DESC']],
});
res.json(characters);
} catch (err) {
console.error('캐릭터 목록 조회 오류:', err.message);
res.status(500).json({ error: '캐릭터 목록 조회 실패' });
}
});
// 캐릭터 목록 갱신 (넥슨 API에서 다시 가져오기)
router.post('/refresh', requireAuth, async (req, res) => {
try {
const charList = await getCharacterList(req.session.accessToken);
if (!charList?.account_list) {
return res.status(400).json({ error: '캐릭터 목록을 가져올 수 없습니다' });
}
const results = [];
for (const account of charList.account_list) {
for (const char of account.character_list || []) {
try {
const ocid = await getCharacterOcid(char.character_name);
const basic = await getCharacterBasic(ocid);
const [userChar] = await UserCharacter.upsert({
user_id: req.session.userId,
character_name: char.character_name,
ocid,
world_name: basic.world_name,
job_name: basic.character_class,
character_level: basic.character_level,
character_image: basic.character_image,
});
results.push(userChar);
} catch (err) {
console.error(`캐릭터 조회 실패: ${char.character_name}`, err.message);
}
}
}
res.json(results);
} catch (err) {
console.error('캐릭터 갱신 오류:', err.message);
res.status(500).json({ error: '캐릭터 목록 갱신 실패' });
}
});
export default router;