202 lines
5.3 KiB
JavaScript
202 lines
5.3 KiB
JavaScript
const { Feature, ClubFeature, Club } = require('../models');
|
|
const { Op } = require('sequelize');
|
|
|
|
// 전체 기능 목록 조회
|
|
exports.getFeatures = async (req, res) => {
|
|
try {
|
|
const features = await Feature.findAll({
|
|
where: {
|
|
status: 'active'
|
|
},
|
|
attributes: ['id', 'name', 'description', 'price']
|
|
});
|
|
res.json(features);
|
|
} catch (error) {
|
|
console.error('기능 목록 조회 오류:', error);
|
|
res.status(500).json({ message: '기능 목록을 가져오는 중 오류가 발생했습니다.' });
|
|
}
|
|
};
|
|
|
|
// 사용 가능한 기능 목록 조회
|
|
exports.getAvailableFeatures = async (req, res) => {
|
|
try {
|
|
const { clubId } = req.query;
|
|
|
|
if (!clubId) {
|
|
return res.status(400).json({ message: '클럽 ID가 필요합니다.' });
|
|
}
|
|
|
|
// 모든 기능 목록 조회
|
|
const features = await Feature.findAll({
|
|
where: {
|
|
status: 'active'
|
|
},
|
|
attributes: ['id', 'name', 'description', 'price']
|
|
});
|
|
|
|
// 클럽의 활성화된 기능 조회
|
|
const activeFeatures = await ClubFeature.findAll({
|
|
where: {
|
|
clubId,
|
|
expiryDate: {
|
|
[Op.gt]: new Date()
|
|
}
|
|
},
|
|
attributes: ['featureId']
|
|
});
|
|
|
|
const activeFeatureIds = activeFeatures.map(af => af.featureId);
|
|
|
|
// 기능 목록에 활성화 상태 추가
|
|
const formattedFeatures = features.map(feature => ({
|
|
...feature.toJSON(),
|
|
isActive: activeFeatureIds.includes(feature.id)
|
|
}));
|
|
|
|
res.json(formattedFeatures);
|
|
} catch (error) {
|
|
console.error('사용 가능한 기능 목록 조회 오류:', error);
|
|
res.status(500).json({ message: '기능 목록을 가져오는 중 오류가 발생했습니다.' });
|
|
}
|
|
};
|
|
|
|
// 활성화된 기능 목록 조회
|
|
exports.getActiveFeatures = async (req, res) => {
|
|
try {
|
|
const { clubId } = req.query;
|
|
|
|
if (!clubId) {
|
|
return res.status(400).json({ message: '클럽 ID가 필요합니다.' });
|
|
}
|
|
|
|
const activeFeatures = await ClubFeature.findAll({
|
|
where: {
|
|
clubId,
|
|
expiryDate: {
|
|
[Op.gt]: new Date()
|
|
}
|
|
},
|
|
include: [{
|
|
model: Feature,
|
|
attributes: ['name', 'description']
|
|
}],
|
|
attributes: ['id', 'featureId', 'purchaseDate', 'expiryDate']
|
|
});
|
|
|
|
res.json(activeFeatures);
|
|
} catch (error) {
|
|
console.error('활성화된 기능 목록 조회 오류:', error);
|
|
res.status(500).json({ message: '활성화된 기능 목록을 가져오는 중 오류가 발생했습니다.' });
|
|
}
|
|
};
|
|
|
|
// 기능 구매 내역 조회
|
|
exports.getFeaturePayments = async (req, res) => {
|
|
try {
|
|
const { clubId } = req.query;
|
|
|
|
if (!clubId) {
|
|
return res.status(400).json({ message: '클럽 ID가 필요합니다.' });
|
|
}
|
|
|
|
const payments = await ClubFeature.findAll({
|
|
where: {
|
|
clubId
|
|
},
|
|
include: [{
|
|
model: Feature,
|
|
attributes: ['name']
|
|
}],
|
|
attributes: [
|
|
'id',
|
|
'featureId',
|
|
'purchaseDate',
|
|
'expiryDate',
|
|
'amount',
|
|
'duration',
|
|
'status'
|
|
],
|
|
order: [['purchaseDate', 'DESC']]
|
|
});
|
|
|
|
const formattedPayments = payments.map(payment => ({
|
|
id: payment.id,
|
|
featureName: payment.feature.name,
|
|
purchaseDate: payment.purchaseDate,
|
|
expiryDate: payment.expiryDate,
|
|
amount: payment.amount,
|
|
duration: payment.duration,
|
|
status: payment.status
|
|
}));
|
|
|
|
res.json(formattedPayments);
|
|
} catch (error) {
|
|
console.error('기능 구매 내역 조회 오류:', error);
|
|
res.status(500).json({ message: '구매 내역을 가져오는 중 오류가 발생했습니다.' });
|
|
}
|
|
};
|
|
|
|
// 기능 구매
|
|
exports.purchaseFeature = async (req, res) => {
|
|
try {
|
|
const { clubId, featureId, duration } = req.body;
|
|
|
|
if (!clubId) {
|
|
return res.status(400).json({ message: '클럽 ID가 필요합니다.' });
|
|
}
|
|
|
|
// 기능 정보 조회
|
|
const feature = await Feature.findByPk(featureId);
|
|
if (!feature) {
|
|
return res.status(404).json({ message: '존재하지 않는 기능입니다.' });
|
|
}
|
|
|
|
// 클럽 정보 조회
|
|
const club = await Club.findByPk(clubId);
|
|
if (!club) {
|
|
return res.status(404).json({ message: '존재하지 않는 클럽입니다.' });
|
|
}
|
|
|
|
// 이미 활성화된 기능인지 확인
|
|
const existingFeature = await ClubFeature.findOne({
|
|
where: {
|
|
clubId,
|
|
featureId,
|
|
expiryDate: {
|
|
[Op.gt]: new Date()
|
|
}
|
|
}
|
|
});
|
|
|
|
if (existingFeature) {
|
|
return res.status(400).json({ message: '이미 활성화된 기능입니다.' });
|
|
}
|
|
|
|
// 구매 금액 계산 (duration에 따른 할인 적용 가능)
|
|
const amount = feature.price * duration;
|
|
|
|
// 기능 구매 기록 생성
|
|
const purchaseDate = new Date();
|
|
const expiryDate = new Date();
|
|
expiryDate.setMonth(expiryDate.getMonth() + duration);
|
|
|
|
const clubFeature = await ClubFeature.create({
|
|
clubId,
|
|
featureId,
|
|
purchaseDate,
|
|
expiryDate,
|
|
amount,
|
|
duration,
|
|
status: 'active'
|
|
});
|
|
|
|
res.json({
|
|
message: '기능 구매가 완료되었습니다.',
|
|
purchaseInfo: clubFeature
|
|
});
|
|
} catch (error) {
|
|
console.error('기능 구매 오류:', error);
|
|
res.status(500).json({ message: '기능 구매 중 오류가 발생했습니다.' });
|
|
}
|
|
};
|