팀 생성 임시 완료

This commit is contained in:
2025-04-26 07:06:03 +09:00
parent f01bcbdf39
commit d1b22d4272
20 changed files with 730 additions and 171 deletions
+98 -12
View File
@@ -2,7 +2,7 @@
* 이벤트 컨트롤러
* 이벤트 관련 기능을 처리하는 컨트롤러
*/
const { Event, EventParticipant, Member, Club, EventScore, ClubMember } = require('../models');
const { Event, EventParticipant, Member, Club, EventScore, ClubMember, EventTeam, EventTeamMember } = require('../models');
const { Op } = require('sequelize');
const { sequelize } = require('../models');
@@ -78,7 +78,7 @@ exports.getEventById = async (req, res) => {
},
{
model: EventParticipant,
attributes: ['id', 'status', 'paymentStatus', 'teamNumber'],
attributes: ['id', 'status', 'paymentStatus'],
where: { status: { [Op.ne]: '취소' } },
required: false,
include: [
@@ -538,7 +538,6 @@ exports.updateEventScore = async (req, res) => {
const newScore = await EventScore.create({
eventId,
participantId: existingScore.participantId,
teamNumber: existingScore.teamNumber,
gameNumber,
score,
handicap,
@@ -1004,9 +1003,8 @@ exports.addEventParticipant = async (req, res) => {
const {
clubId,
memberId,
teamNumber,
paymentStatus,
paymentAmount
status,
paymentStatus
} = req.body;
const eventId = req.params.id;
if (!eventId || !clubId || !memberId) {
@@ -1071,12 +1069,10 @@ exports.addEventParticipant = async (req, res) => {
const participant = await EventParticipant.create({
eventId,
memberId,
teamNumber: teamNumber || 1,
status: req.body.status || '참가예정',
attendance: false,
paymentStatus: req.body.paymentStatus || '미납',
paymentAmount: paymentAmount || event.entryFee || 0,
registeredAt: new Date()
status: status || '참가예정',
paymentStatus: paymentStatus || '미납',
createdAt: new Date(),
updatedAt: new Date()
});
// 참가자 정보 조회
@@ -1166,6 +1162,96 @@ exports.updateEventParticipant = async (req, res) => {
}
};
// [팀 생성 기능] 이벤트별 팀 목록 조회
exports.getEventTeams = async (req, res) => {
try {
const eventId = req.params.id;
if (!eventId) {
return res.status(400).json({ message: '이벤트 ID가 필요합니다.' });
}
const teams = await EventTeam.findAll({
where: { eventId },
include: [
{
model: EventTeamMember,
include: [
{
model: EventParticipant,
include: [{ model: Member }]
}
]
}
],
order: [['teamNumber', 'ASC']]
});
const result = teams.map(team => ({
id: team.id,
teamNumber: team.teamNumber,
handicap: team.handicap,
members: (team.EventTeamMembers || [])
.sort((a, b) => a.order - b.order)
.map(tm => ({
id: tm.eventParticipantId,
name: tm.EventParticipant?.Member?.name || `참가자 ${tm.eventParticipantId}`,
order: tm.order
}))
}));
res.json({ teams: result });
} catch (error) {
console.error('팀 목록 조회 오류:', error);
res.status(500).json({ message: '팀 목록을 가져오는 중 오류가 발생했습니다.' });
}
};
// [팀 생성 기능] 이벤트별 팀 배정 저장
exports.createOrUpdateEventTeams = async (req, res) => {
const eventId = req.params.id;
const { teams } = req.body; // [{teamNumber, handicap, members:[id]}]
if (!eventId || !Array.isArray(teams)) {
return res.status(400).json({ message: '이벤트 ID와 팀 정보가 필요합니다.' });
}
try {
await sequelize.transaction(async (t) => {
// 기존 팀 및 팀멤버 데이터 삭제
await EventTeam.destroy({ where: { eventId }, transaction: t });
await EventTeamMember.destroy({
where: {}, // eventId로만 삭제하려면, eventTeamId로 팀 id 목록을 먼저 조회해서 삭제
transaction: t
});
// 새 팀 및 팀멤버 데이터 저장
for (const team of teams) {
// 팀 생성
const createdTeam = await EventTeam.create({
eventId,
teamNumber: team.teamNumber,
handicap: team.handicap || 0
}, { transaction: t });
// 팀 멤버(순서 포함) 저장
if (Array.isArray(team.members) && team.members.length > 0) {
const teamMemberRows = team.members
.filter(m => m.id != null)
.map(m => ({
eventTeamId: createdTeam.id,
eventParticipantId: m.id,
order: m.order ?? 1
}));
if (teamMemberRows.length > 0) {
await EventTeamMember.bulkCreate(teamMemberRows, { transaction: t });
}
}
}
});
res.json({ message: '팀 배정이 저장되었습니다.' });
} catch (error) {
console.error('팀 배정 저장 오류:', error);
res.status(500).json({ message: '팀 배정 저장 중 오류가 발생했습니다.' });
}
};
// 참가자 삭제 (소프트 삭제)
exports.deleteEventParticipant = async (req, res) => {
try {