버그 수정, 모임장 설정 수정
This commit is contained in:
@@ -188,6 +188,36 @@ exports.createClub = async (req, res) => {
|
||||
console.log(`${ownerEmail}에게 초대 이메일 발송 예정`);
|
||||
}
|
||||
|
||||
// 베이직 1개월 플랜 자동 추가
|
||||
try {
|
||||
// 베이직 플랜 조회 (ID가 1이라고 가정, 실제 환경에 맞게 조정 필요)
|
||||
const basicPlan = await require('../models').SubscriptionPlan.findOne({
|
||||
where: { name: 'Basic' }
|
||||
});
|
||||
|
||||
if (basicPlan) {
|
||||
const startDate = new Date();
|
||||
const endDate = new Date();
|
||||
endDate.setMonth(endDate.getMonth() + 1); // 1개월 추가
|
||||
|
||||
await require('../models').ClubSubscription.create({
|
||||
clubId: newClub.id,
|
||||
planId: basicPlan.id,
|
||||
startDate,
|
||||
endDate,
|
||||
status: 'active',
|
||||
price: basicPlan.price || 0
|
||||
});
|
||||
|
||||
console.log(`클럽 ${newClub.id}에 베이직 1개월 플랜 자동 추가됨`);
|
||||
} else {
|
||||
console.warn('베이직 플랜을 찾을 수 없어 자동 구독이 추가되지 않았습니다.');
|
||||
}
|
||||
} catch (subscriptionError) {
|
||||
console.error('자동 구독 추가 오류:', subscriptionError);
|
||||
// 구독 추가 실패해도 클럽 생성은 성공으로 처리
|
||||
}
|
||||
|
||||
res.status(201).json(newClub);
|
||||
} catch (error) {
|
||||
console.error('클럽 생성 오류:', error);
|
||||
@@ -198,18 +228,24 @@ exports.createClub = async (req, res) => {
|
||||
// 클럽 정보 업데이트
|
||||
exports.updateClub = async (req, res) => {
|
||||
try {
|
||||
const { clubId, name, location, description, contact, ownerEmail, status, femaleHandicap } = req.body;
|
||||
const { clubId, name, location, description, contact, ownerEmail, status, femaleHandicap, ownerId } = req.body;
|
||||
const club = await Club.findByPk(clubId);
|
||||
|
||||
if (!club) {
|
||||
return res.status(404).json({ message: '클럽을 찾을 수 없습니다.' });
|
||||
}
|
||||
|
||||
// 이메일이 변경된 경우 새 모임장 확인
|
||||
// 모임장 변경 확인 (직접 ownerId를 전달받거나 이메일로 변경)
|
||||
let newOwnerId = club.ownerId;
|
||||
let ownerChanged = false;
|
||||
|
||||
if (ownerEmail && ownerEmail !== club.ownerEmail) {
|
||||
// ownerId가 직접 전달된 경우 (클럽 설정에서 모임장 선택)
|
||||
if (ownerId && ownerId !== club.ownerId) {
|
||||
newOwnerId = ownerId;
|
||||
ownerChanged = true;
|
||||
}
|
||||
// 이메일을 통한 모임장 변경 (기존 기능 유지)
|
||||
else if (ownerEmail && ownerEmail !== club.ownerEmail) {
|
||||
const newOwner = await User.findOne({ where: { email: ownerEmail } });
|
||||
if (!newOwner) {
|
||||
return res.status(404).json({ message: '해당 이메일로 등록된 사용자를 찾을 수 없습니다.' });
|
||||
@@ -229,48 +265,13 @@ exports.updateClub = async (req, res) => {
|
||||
ownerId: newOwnerId
|
||||
});
|
||||
|
||||
// 모임장이 변경된 경우 Members 테이블 업데이트
|
||||
// 모임장이 변경된 경우 모임장 변경 메소드 호출
|
||||
if (ownerChanged) {
|
||||
// 기존 모임장을 정회원으로 변경
|
||||
await Member.update(
|
||||
{ memberType: '정회원' },
|
||||
{
|
||||
where: {
|
||||
clubId: clubId,
|
||||
userId: club.ownerId,
|
||||
memberType: '모임장'
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// 새 모임장 확인 및 업데이트
|
||||
const newOwnerMember = await Member.findOne({
|
||||
where: {
|
||||
clubId: clubId,
|
||||
userId: newOwnerId
|
||||
}
|
||||
});
|
||||
|
||||
if (newOwnerMember) {
|
||||
// 기존 회원인 경우 모임장으로 변경
|
||||
await newOwnerMember.update({ memberType: '모임장' });
|
||||
} else {
|
||||
// 새로운 사용자 정보 가져오기
|
||||
const newOwnerUser = await User.findByPk(newOwnerId);
|
||||
if (!newOwnerUser) {
|
||||
return res.status(404).json({ message: '새 모임장 사용자 정보를 찾을 수 없습니다.' });
|
||||
}
|
||||
|
||||
// 새 회원으로 모임장 추가
|
||||
await Member.create({
|
||||
userId: newOwnerId,
|
||||
clubId: clubId,
|
||||
name: newOwnerUser.name || ownerEmail.split('@')[0], // 이름이 없는 경우 이메일 아이디 사용
|
||||
gender: '남성', // 성별 정보가 없는 경우 기본값
|
||||
memberType: '모임장',
|
||||
joinDate: new Date(),
|
||||
status: 'active'
|
||||
});
|
||||
try {
|
||||
// 모임장 변경 내부 메소드 호출
|
||||
await changeClubOwnerInternal(clubId, newOwnerId, ownerEmail);
|
||||
} catch (error) {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -362,6 +363,7 @@ exports.getClubMembers = async (req, res) => {
|
||||
const memberData = member.toJSON();
|
||||
return {
|
||||
id: memberData.id,
|
||||
userId: memberData.userId || null,
|
||||
name: memberData.name,
|
||||
gender: memberData.gender,
|
||||
memberType: memberData.memberType,
|
||||
@@ -437,28 +439,17 @@ exports.updateClubMember = async (req, res) => {
|
||||
if (!member) {
|
||||
return res.status(404).json({ message: '회원을 찾을 수 없습니다.' });
|
||||
}
|
||||
|
||||
// 모임장은 한 명만 존재할 수 있음
|
||||
if (memberType === '모임장') {
|
||||
const existingOwner = await Member.findOne({
|
||||
where: {
|
||||
clubId: clubId,
|
||||
memberType: '모임장',
|
||||
status: 'active',
|
||||
id: { [Op.ne]: memberId }
|
||||
}
|
||||
});
|
||||
|
||||
if (existingOwner) {
|
||||
return res.status(400).json({ message: '이미 다른 모임장이 존재합니다.' });
|
||||
}
|
||||
|
||||
// 모임장으로 변경 금지 - 모임장 변경은 별도 API로 처리
|
||||
if (memberType === '모임장' && member.memberType !== '모임장') {
|
||||
return res.status(403).json({ message: '모임장 변경은 클럽 설정에서만 가능합니다.' });
|
||||
}
|
||||
|
||||
// 회원 정보 업데이트
|
||||
// 회원 정보 업데이트 (모임장 유지 또는 다른 유형으로 변경만 허용)
|
||||
await member.update({
|
||||
name: name || member.name,
|
||||
gender: gender || member.gender,
|
||||
memberType: memberType || member.memberType,
|
||||
memberType: (member.memberType === '모임장' && memberType !== '모임장') ? '모임장' : memberType || member.memberType,
|
||||
email: email || member.email,
|
||||
phone: phone || member.phone,
|
||||
handicap: handicap || member.handicap,
|
||||
@@ -479,6 +470,67 @@ exports.updateClubMember = async (req, res) => {
|
||||
}
|
||||
};
|
||||
|
||||
// 모임장 변경 내부 메소드
|
||||
const changeClubOwnerInternal = async (clubId, newOwnerId, ownerEmail = null) => {
|
||||
// 트랜잭션 시작
|
||||
const t = await sequelize.transaction();
|
||||
|
||||
try {
|
||||
// 기존 모임장을 운영진으로 변경
|
||||
await Member.update(
|
||||
{ memberType: '운영진' },
|
||||
{
|
||||
where: {
|
||||
clubId: clubId,
|
||||
memberType: '모임장',
|
||||
status: 'active'
|
||||
},
|
||||
transaction: t
|
||||
}
|
||||
);
|
||||
|
||||
// 새 모임장 확인 및 업데이트
|
||||
const newOwnerMember = await Member.findOne({
|
||||
where: {
|
||||
clubId: clubId,
|
||||
userId: newOwnerId,
|
||||
status: 'active'
|
||||
}
|
||||
});
|
||||
|
||||
if (newOwnerMember) {
|
||||
// 기존 회원인 경우 모임장으로 변경
|
||||
await newOwnerMember.update({ memberType: '모임장' }, { transaction: t });
|
||||
} else {
|
||||
// 새로운 사용자 정보 가져오기
|
||||
const newOwnerUser = await User.findByPk(newOwnerId);
|
||||
if (!newOwnerUser) {
|
||||
await t.rollback();
|
||||
throw new Error('새 모임장 사용자 정보를 찾을 수 없습니다.');
|
||||
}
|
||||
|
||||
// 새 회원으로 모임장 추가
|
||||
await Member.create({
|
||||
userId: newOwnerId,
|
||||
clubId: clubId,
|
||||
name: newOwnerUser.name || (ownerEmail ? ownerEmail.split('@')[0] : ''), // 이름이 없는 경우 이메일 아이디 사용
|
||||
gender: '남성', // 성별 정보가 없는 경우 기본값
|
||||
memberType: '모임장',
|
||||
joinDate: new Date(),
|
||||
status: 'active'
|
||||
}, { transaction: t });
|
||||
}
|
||||
|
||||
// 트랜잭션 커밋
|
||||
await t.commit();
|
||||
return true;
|
||||
} catch (error) {
|
||||
// 오류 발생 시 트랜잭션 롤백
|
||||
await t.rollback();
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
// 클럽 회원 삭제
|
||||
exports.deleteClubMember = async (req, res) => {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user