const { Feature, ClubFeature, Club, ClubSubscription, SubscriptionPlan, SubscriptionPlanFeature } = 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.body; 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 { ClubSubscription, SubscriptionPlan, SubscriptionPlanFeature } = require('../models'); // 현재 활성화된 구독 조회 const activeSubscription = await ClubSubscription.findOne({ where: { clubId, status: 'active', endDate: { [Op.gt]: new Date() } }, attributes: ['planId'] }); let planFeatureIds = []; // 현재 구독 플랜이 있는 경우, 해당 플랜에 포함된 기능 ID 목록 조회 if (activeSubscription) { const planFeatures = await SubscriptionPlanFeature.findAll({ where: { planId: activeSubscription.planId }, attributes: ['featureId'] }); planFeatureIds = planFeatures.map(pf => pf.featureId); } // 기능 목록에 활성화 상태 및 플랜 포함 여부 추가 const formattedFeatures = features.map(feature => ({ ...feature.toJSON(), isActive: activeFeatureIds.includes(feature.id), isIncludedInPlan: planFeatureIds.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.body; 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', 'createdAt', 'expiryDate'] }); // createdAt을 purchaseDate로 매핑 const formattedFeatures = activeFeatures.map(feature => ({ id: feature.id, featureId: feature.featureId, purchaseDate: feature.createdAt, expiryDate: feature.expiryDate, Feature: feature.Feature })); res.json(formattedFeatures); } catch (error) { console.error('활성화된 기능 목록 조회 오류:', error); res.status(500).json({ message: '활성화된 기능 목록을 가져오는 중 오류가 발생했습니다.' }); } }; // 기능 구매 내역 조회 exports.getFeaturePayments = async (req, res) => { try { const { clubId } = req.body; if (!clubId) { return res.status(400).json({ message: '클럽 ID가 필요합니다.' }); } const payments = await ClubFeature.findAll({ where: { clubId }, include: [{ model: Feature, attributes: ['name', 'price'] }], attributes: [ 'id', 'featureId', 'createdAt', 'expiryDate', 'enabled' ], order: [['createdAt', 'DESC']] }); // 기간 계산 (월 단위) const calculateDuration = (startDate, endDate) => { const start = new Date(startDate); const end = new Date(endDate); const diffTime = Math.abs(end - start); const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); return Math.ceil(diffDays / 30); // 대략적인 월 수 계산 }; const formattedPayments = payments.map(payment => { const duration = calculateDuration(payment.createdAt, payment.expiryDate); const amount = payment.Feature.price * duration; return { id: payment.id, featureName: payment.Feature.name, purchaseDate: payment.createdAt, expiryDate: payment.expiryDate, amount: amount, duration: duration, status: payment.enabled ? 'active' : 'inactive' }; }); 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: '이미 활성화된 기능입니다.' }); } // 만료일 계산 const expiryDate = new Date(); expiryDate.setMonth(expiryDate.getMonth() + parseInt(duration)); const clubFeature = await ClubFeature.create({ clubId, featureId, expiryDate, enabled: true }); // 응답용 객체 생성 const purchaseInfo = { id: clubFeature.id, clubId: clubFeature.clubId, featureId: clubFeature.featureId, purchaseDate: clubFeature.createdAt, expiryDate: clubFeature.expiryDate, amount: feature.price * parseInt(duration), duration: parseInt(duration), status: 'active' }; res.json({ message: '기능 구매가 완료되었습니다.', purchaseInfo }); } catch (error) { console.error('기능 구매 오류:', error); res.status(500).json({ message: '기능 구매 중 오류가 발생했습니다.' }); } };