- 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>
58 lines
1.6 KiB
JavaScript
58 lines
1.6 KiB
JavaScript
import { Router } from 'express';
|
|
import { requireAuth } from '../../middleware/auth.js';
|
|
import { UserBossSelection, BossDifficulty, Boss } from '../../models/index.js';
|
|
|
|
const router = Router();
|
|
|
|
// 내 캐릭터별 보스 선택 현황
|
|
router.get('/', requireAuth, async (req, res) => {
|
|
try {
|
|
const selections = await UserBossSelection.findAll({
|
|
where: { user_id: req.session.userId },
|
|
include: [{
|
|
model: BossDifficulty,
|
|
as: 'difficulty',
|
|
include: [{ model: Boss }],
|
|
}],
|
|
});
|
|
res.json(selections);
|
|
} catch (err) {
|
|
console.error('선택 조회 오류:', err.message);
|
|
res.status(500).json({ error: '보스 선택 조회 실패' });
|
|
}
|
|
});
|
|
|
|
// 캐릭터별 보스 선택 저장
|
|
router.put('/:characterId', requireAuth, async (req, res) => {
|
|
const { characterId } = req.params;
|
|
const { selections } = req.body; // [{ boss_difficulty_id, party_size }]
|
|
|
|
try {
|
|
// 기존 선택 삭제
|
|
await UserBossSelection.destroy({
|
|
where: {
|
|
user_id: req.session.userId,
|
|
user_character_id: characterId,
|
|
},
|
|
});
|
|
|
|
// 새 선택 생성
|
|
if (selections?.length) {
|
|
await UserBossSelection.bulkCreate(
|
|
selections.map((s) => ({
|
|
user_id: req.session.userId,
|
|
user_character_id: characterId,
|
|
boss_difficulty_id: s.boss_difficulty_id,
|
|
party_size: s.party_size || 1,
|
|
}))
|
|
);
|
|
}
|
|
|
|
res.json({ success: true });
|
|
} catch (err) {
|
|
console.error('선택 저장 오류:', err.message);
|
|
res.status(500).json({ error: '보스 선택 저장 실패' });
|
|
}
|
|
});
|
|
|
|
export default router;
|