에버리지, 회원추가 로직 수정

This commit is contained in:
2025-10-23 12:38:39 +09:00
parent 76f5b572e8
commit ce1aee67d6
2 changed files with 110 additions and 21 deletions
+50 -12
View File
@@ -718,6 +718,7 @@ exports.saveEventFileData = async (req, res) => {
}
// 2. 참가자 및 점수 처리
const affectedMemberIds = new Set();
for (const participant of participants) {
let eventParticipant;
@@ -754,15 +755,39 @@ exports.saveEventFileData = async (req, res) => {
comment: ''
}, { transaction: t });
}
affectedMemberIds.add(Number(participant.memberId));
} else {
// 새 회원 생성 및 참가자 등록
// 클럽 여성 기본 핸디캡 기준으로 성별/핸디캡 보정
const femaleBase = Number(clubInstance?.femaleHandicap ?? 0) || 0;
let parsedHandicap = null;
if (participant.handicap !== undefined && participant.handicap !== null) {
const ph = Number(participant.handicap);
if (Number.isFinite(ph)) parsedHandicap = ph;
}
// 점수 객체에 handicap이 개별 제공되는 경우 최댓값을 사용
if (parsedHandicap == null && Array.isArray(participant.scores)) {
for (const s of participant.scores) {
if (s && typeof s === 'object' && s.handicap !== undefined) {
const sh = Number(s.handicap);
if (Number.isFinite(sh)) {
parsedHandicap = parsedHandicap == null ? sh : Math.max(parsedHandicap, sh);
}
}
}
}
const isFemaleByRule = (parsedHandicap != null && parsedHandicap >= femaleBase) ||
(Array.isArray(participant.scores) && participant.scores.some((s) => Number(s?.handicap) >= femaleBase));
const genderNormalized = (participant.gender === 'female' || participant.gender === '여성') ? 'female' : 'male';
const finalGender = isFemaleByRule ? 'female' : genderNormalized;
const newMember = await Member.create({
clubId: effectiveClubId, // required by Member model
name: participant.name,
// normalize enum values to match Member model
gender: (participant.gender === 'female' || participant.gender === '여성') ? 'female' : 'male',
gender: finalGender,
memberType: 'guest',
status: 'active'
status: 'active',
handicap: parsedHandicap ?? 0
}, { transaction: t });
// 클럽 회원으로 등록 (조인 테이블을 association으로 처리)
@@ -788,6 +813,7 @@ exports.saveEventFileData = async (req, res) => {
teamId: teamId,
comment: ''
}, { transaction: t });
affectedMemberIds.add(Number(newMember.id));
}
// 팀에 속한 참가자인 경우 팀 멤버로 등록
@@ -856,21 +882,33 @@ exports.saveEventFileData = async (req, res) => {
}
}
}
return event;
// 트랜잭션 내부에서는 목록만 반환 (커밋 후 워밍업)
return { event, affectedMemberIds: Array.from(affectedMemberIds), effectiveClubId };
});
// 커밋 이후 평균 캐시 무효화 및 워밍업 (신규 점수가 커밋된 뒤 계산되도록)
if (result && Array.isArray(result.affectedMemberIds)) {
for (const mid of result.affectedMemberIds) {
try {
await averageService.invalidateMemberAverageCache(mid);
await averageService.calculateMemberAverageByClubSetting(mid, result.effectiveClubId);
} catch (e) {
console.error('평균 캐시 갱신 실패:', e);
}
}
}
res.json({
message: '이벤트 데이터가 성공적으로 저장되었습니다.',
event: {
id: result.id,
title: result.title,
eventType: result.eventType,
startDate: result.startDate
id: result.event.id,
title: result.event.title,
eventType: result.event.eventType,
startDate: result.event.startDate
},
rollbackToken: {
eventId: result.id,
clubId: Number(result.clubId)
eventId: result.event.id,
clubId: Number(result.event.clubId)
}
});
} catch (error) {