forked from MyZubster-Ecosystem/myzubster
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreferralController.js
More file actions
125 lines (110 loc) 路 3.62 KB
/
Copy pathreferralController.js
File metadata and controls
125 lines (110 loc) 路 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
const Referral = require('../models/referralModel');
const { v4: uuidv4 } = require('uuid');
exports.generateReferral = async (req, res) => {
try {
const userId = req.user.userId || req.user.id;
const referralCode = uuidv4().substring(0, 8);
const referral = new Referral({
referralCode,
referrerId: userId,
status: 'pending'
});
await referral.save();
const baseUrl = process.env.BASE_URL || 'https://myzubsterapp.onrender.com';
res.json({
referralCode,
referralLink: `${baseUrl}/register?ref=${referralCode}`,
status: 'pending'
});
} catch (error) {
res.status(500).json({ error: error.message });
}
};
exports.getReferral = async (req, res) => {
try {
const referral = await Referral.findOne({ referralCode: req.params.code });
if (!referral) {
return res.status(404).json({ error: 'Referral not found' });
}
res.json({
referralCode: referral.referralCode,
status: referral.status,
createdAt: referral.createdAt
});
} catch (error) {
res.status(500).json({ error: error.message });
}
};
exports.trackReferral = async (req, res) => {
try {
const { referralCode, userId } = req.body;
if (!referralCode || !userId) {
return res.status(400).json({ error: 'referralCode and userId are required' });
}
const referral = await Referral.findOne({ referralCode });
if (!referral) {
return res.status(404).json({ error: 'Referral not found' });
}
if (referral.status !== 'pending') {
return res.status(400).json({ error: 'Referral already used' });
}
referral.referredUserId = userId;
referral.status = 'completed';
referral.completedAt = new Date();
await referral.save();
res.json({ message: 'Referral tracked successfully' });
} catch (error) {
res.status(500).json({ error: error.message });
}
};
exports.creditReferral = async (req, res) => {
try {
const { referralCode } = req.body;
if (!referralCode) {
return res.status(400).json({ error: 'referralCode is required' });
}
const referral = await Referral.findOne({ referralCode });
if (!referral) {
return res.status(404).json({ error: 'Referral not found' });
}
if (referral.rewardCredited) {
return res.status(400).json({ error: 'Reward already credited' });
}
referral.rewardCredited = true;
referral.status = 'rewarded';
await referral.save();
res.json({
message: 'Referral reward credited successfully',
referrerReward: 5,
referredReward: 5,
currency: 'MYZ'
});
} catch (error) {
res.status(500).json({ error: error.message });
}
};
exports.getStats = async (req, res) => {
try {
const totalReferrals = await Referral.countDocuments();
const pendingReferrals = await Referral.countDocuments({ status: 'pending' });
const completedReferrals = await Referral.countDocuments({ status: 'completed' });
const rewardedReferrals = await Referral.countDocuments({ status: 'rewarded' });
const totalMYZCredited = rewardedReferrals * 10;
const topReferrers = await Referral.aggregate([
{ $match: { status: 'rewarded' } },
{ $group: { _id: '$referrerId', count: { $sum: 1 } } },
{ $sort: { count: -1 } },
{ $limit: 10 }
]);
res.json({
total: totalReferrals,
pending: pendingReferrals,
completed: completedReferrals,
rewarded: rewardedReferrals,
totalMYZCredited: totalMYZCredited,
topReferrers: topReferrers
});
} catch (error) {
res.status(500).json({ error: error.message });
}
};