오류 수정, 통계 보강
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
const { Event, EventParticipant, Member, Club, EventScore, ClubMember, EventTeam, EventTeamMember, sequelize } = require('../models');
|
||||
const { Op } = require('sequelize');
|
||||
const { signPublicEventToken, verifyPublicEventToken } = require('../utils/publicJwt');
|
||||
const averageService = require('../services/averageService');
|
||||
|
||||
// 공개 이벤트 최초 진입 (토큰 또는 비밀번호 인증)
|
||||
exports.publicEventEntry = async (req, res) => {
|
||||
@@ -84,13 +85,37 @@ exports.getEventByPublicHash = async (event, token = null) => {
|
||||
try {
|
||||
const allMembers = await Member.findAll({
|
||||
where: { clubId: event.clubId },
|
||||
attributes: [[sequelize.col('id'), 'memberId'], 'name', 'memberType', 'gender', 'handicap', 'average']
|
||||
attributes: [[sequelize.col('id'), 'memberId'], 'name', 'memberType', 'gender', 'handicap']
|
||||
});
|
||||
const participants = await EventParticipant.findAll({
|
||||
where: { eventId: event.id, status: { [Op.ne]: '취소' } },
|
||||
include: [ { model: Member, attributes: [[sequelize.col('id'), 'memberId'], 'name', 'memberType', 'gender', 'handicap', 'average'] } ]
|
||||
include: [ { model: Member, attributes: [[sequelize.col('id'), 'memberId'], 'name', 'memberType', 'gender', 'handicap'] } ]
|
||||
});
|
||||
const allMemberObjs = allMembers.map(m => m.dataValues);
|
||||
// 모든 회원에 대한 에버리지 계산
|
||||
const allMemberObjs = await Promise.all(allMembers.map(async m => {
|
||||
const memberData = m.dataValues;
|
||||
try {
|
||||
const averageData = await averageService.calculateMemberAverageByClubSetting(memberData.memberId, event.clubId);
|
||||
memberData.average = averageData.average;
|
||||
} catch (error) {
|
||||
console.error(`회원 ${memberData.memberId}의 에버리지 계산 중 오류:`, error);
|
||||
memberData.average = 0;
|
||||
}
|
||||
return memberData;
|
||||
}));
|
||||
|
||||
// 참가자에 대한 에버리지 추가
|
||||
for (const participant of participants) {
|
||||
if (participant.Member) {
|
||||
try {
|
||||
const averageData = await averageService.calculateMemberAverageByClubSetting(participant.Member.dataValues.memberId, event.clubId);
|
||||
participant.Member.dataValues.average = averageData.average;
|
||||
} catch (error) {
|
||||
console.error(`참가자 ${participant.Member.dataValues.memberId}의 에버리지 계산 중 오류:`, error);
|
||||
participant.Member.dataValues.average = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
const participantMemberIds = [
|
||||
...new Set(participants.filter(p => p.dataValues.status !== '취소').map(p => parseInt(p.dataValues.memberId)))
|
||||
];
|
||||
@@ -108,10 +133,26 @@ exports.getEventByPublicHash = async (event, token = null) => {
|
||||
include: [{
|
||||
model: EventParticipant,
|
||||
where: { status: { [Op.ne]: '취소' } },
|
||||
include: [{ model: Member, attributes: [[sequelize.col('id'), 'memberId'], 'name', 'memberType', 'gender', 'handicap', 'average'] }]
|
||||
include: [{ model: Member, attributes: [[sequelize.col('id'), 'memberId'], 'name', 'memberType', 'gender', 'handicap'] }]
|
||||
}]
|
||||
}]
|
||||
});
|
||||
|
||||
// 팀 멤버들에게 에버리지 정보 추가
|
||||
for (const team of teams) {
|
||||
for (const teamMember of team.EventTeamMembers || []) {
|
||||
if (teamMember.EventParticipant?.Member) {
|
||||
const member = teamMember.EventParticipant.Member;
|
||||
try {
|
||||
const averageData = await averageService.calculateMemberAverageByClubSetting(member.dataValues.memberId, event.clubId);
|
||||
member.dataValues.average = averageData.average;
|
||||
} catch (error) {
|
||||
console.error(`팀 멤버 ${member.dataValues.memberId}의 에버리지 계산 중 오류:`, error);
|
||||
member.dataValues.average = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
const scores = await EventScore.findAll({ where: { eventId: event.id } });
|
||||
// 참가자 id → 참가자 객체 Map
|
||||
const participantMap = new Map();
|
||||
@@ -140,12 +181,12 @@ exports.getEventByPublicHash = async (event, token = null) => {
|
||||
name: member?.name || `참가자 ${participant?.id}`,
|
||||
gender: member?.gender,
|
||||
memberType: member?.memberType,
|
||||
average: member?.average || 0,
|
||||
average: allMemberObjs.find(m => Number(m.memberId) === Number(member?.memberId))?.average,
|
||||
handicap: member?.handicap || 0,
|
||||
status: participant?.status,
|
||||
paymentStatus: participant?.paymentStatus,
|
||||
comment: participant?.comment,
|
||||
isGuest: member?.memberType === '게스트',
|
||||
isGuest: member?.memberType === 'guest',
|
||||
scores: scoresArr
|
||||
};
|
||||
})
|
||||
@@ -170,11 +211,11 @@ exports.getEventByPublicHash = async (event, token = null) => {
|
||||
gender: member?.gender,
|
||||
memberType: member?.memberType,
|
||||
handicap: member?.handicap || 0,
|
||||
average: member?.average || 0,
|
||||
average: allMemberObjs.find(m => Number(m.memberId) === Number(p?.memberId))?.average,
|
||||
status: p.status,
|
||||
paymentStatus: p.paymentStatus,
|
||||
comment: p.comment,
|
||||
isGuest: member?.memberType === '게스트',
|
||||
isGuest: member?.memberType === 'guest',
|
||||
scores: scoresArr
|
||||
};
|
||||
});
|
||||
@@ -194,14 +235,15 @@ exports.getEventByPublicHash = async (event, token = null) => {
|
||||
gender: member?.gender,
|
||||
memberType: member?.memberType,
|
||||
handicap: member?.handicap || 0,
|
||||
average: member?.average || 0,
|
||||
average: allMemberObjs.find(m => Number(m.memberId) === Number(p?.memberId))?.average,
|
||||
status: p.status,
|
||||
paymentStatus: p.paymentStatus,
|
||||
comment: p.comment,
|
||||
isGuest: member?.memberType === '게스트',
|
||||
isGuest: member?.memberType === 'guest',
|
||||
scores: scoresArr
|
||||
};
|
||||
});
|
||||
// 디버깅: 최종 average 값 확인
|
||||
return {
|
||||
clubName: event.Club.name,
|
||||
event: {
|
||||
@@ -294,7 +336,7 @@ exports.addPublicGuest = async (req, res) => {
|
||||
|
||||
// 여성 핸디캡 적용
|
||||
let handicap = 0;
|
||||
if (gender === '여성' && club.femaleHandicap) {
|
||||
if (gender === 'female' && club.femaleHandicap) {
|
||||
handicap = club.femaleHandicap;
|
||||
}
|
||||
|
||||
@@ -304,11 +346,21 @@ exports.addPublicGuest = async (req, res) => {
|
||||
phone,
|
||||
gender,
|
||||
clubId: event.clubId,
|
||||
memberType: '게스트',
|
||||
average: average || 0,
|
||||
memberType: 'guest',
|
||||
average: 0, // 에버리지는 이제 사용하지 않지만 기본값은 설정
|
||||
handicap: handicap // 여성 핸디캡 적용
|
||||
});
|
||||
const participant = await EventParticipant.create({ eventId: event.id, memberId: member.id });
|
||||
|
||||
// 클럽 설정에 따른 에버리지 계산
|
||||
let calculatedAverage = 0;
|
||||
try {
|
||||
const averageData = await averageService.calculateMemberAverageByClubSetting(member.id, event.clubId);
|
||||
calculatedAverage = averageData.average;
|
||||
} catch (error) {
|
||||
console.error(`게스트 ${member.id}의 에버리지 계산 중 오류:`, error);
|
||||
}
|
||||
|
||||
res.json({
|
||||
message: '게스트가 추가되었습니다.',
|
||||
data: {
|
||||
@@ -319,7 +371,7 @@ exports.addPublicGuest = async (req, res) => {
|
||||
gender: member.gender,
|
||||
memberType: member.memberType,
|
||||
handicap: member.handicap,
|
||||
average: member.average,
|
||||
average: calculatedAverage,
|
||||
group: '미신청'
|
||||
}
|
||||
});
|
||||
@@ -339,7 +391,7 @@ exports.updatePublicScore = async (req, res) => {
|
||||
try {
|
||||
const event = await Event.findOne({ where: { publicHash } });
|
||||
if (!event) return res.status(404).json({ message: '이벤트를 찾을 수 없습니다.' });
|
||||
if (event.status !== '준비' && event.status !== '활성') return res.status(403).json({ message: '점수 수정이 불가능한 상태입니다.' });
|
||||
if (event.status !== 'ready' && event.status !== 'active') return res.status(403).json({ message: '점수 수정이 불가능한 상태입니다.' });
|
||||
// publicAuth 미들웨어로 인증됨
|
||||
let eventScore = await EventScore.findOne({ where: { eventId: event.id, participantId, gameNumber } });
|
||||
if (!eventScore) {
|
||||
@@ -347,6 +399,18 @@ exports.updatePublicScore = async (req, res) => {
|
||||
} else {
|
||||
await eventScore.update({ teamNumber, score, handicap, totalScore: score + handicap });
|
||||
}
|
||||
|
||||
// 점수 변경 시 해당 회원의 에버리지 캩0시 무효화
|
||||
try {
|
||||
const participant = await EventParticipant.findByPk(participantId);
|
||||
if (participant) {
|
||||
await averageService.invalidateMemberAverageCache(participant.memberId);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('에버리지 캐시 무효화 중 오류:', error);
|
||||
// 캩0시 무효화 오류는 점수 저장에 영향을 주지 않음
|
||||
}
|
||||
|
||||
res.json({ message: '점수가 저장되었습니다.' });
|
||||
} catch (e) {
|
||||
console.error('공개 점수 수정 오류:', e);
|
||||
|
||||
Reference in New Issue
Block a user