feat: added referred user endpoint
This commit is contained in:
parent
dac3f21921
commit
95ba693118
@ -136,6 +136,27 @@ class ReferralTokenController {
|
|||||||
res.status(500).json({ success: false, message: error.message });
|
res.status(500).json({ success: false, message: error.message });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async referredUsers(req, res) {
|
||||||
|
const userId = req.user.userId;
|
||||||
|
logger.info('ReferralTokenController:referredUsers:start', { userId });
|
||||||
|
const unitOfWork = new UnitOfWork();
|
||||||
|
await unitOfWork.start();
|
||||||
|
try {
|
||||||
|
const result = await ReferralService.getReferredUsers(userId, unitOfWork);
|
||||||
|
await unitOfWork.commit();
|
||||||
|
logger.info('ReferralTokenController:referredUsers:success', { userId, total: result.total_referred_users });
|
||||||
|
return res.json({
|
||||||
|
success: true,
|
||||||
|
total_referred_users: result.total_referred_users,
|
||||||
|
users: result.users
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
await unitOfWork.rollback(error);
|
||||||
|
logger.error('ReferralTokenController:referredUsers:error', { userId, error });
|
||||||
|
return res.status(500).json({ success: false, message: error.message });
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = ReferralTokenController;
|
module.exports = ReferralTokenController;
|
||||||
|
|||||||
@ -284,6 +284,46 @@ class ReferralTokenRepository {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getReferredUsersByCreator(createdByUserId) {
|
||||||
|
logger.info('ReferralTokenRepository.getReferredUsersByCreator:start', { createdByUserId });
|
||||||
|
try {
|
||||||
|
const conn = this.unitOfWork.connection;
|
||||||
|
const sql = `
|
||||||
|
SELECT
|
||||||
|
u.id,
|
||||||
|
u.email,
|
||||||
|
u.user_type,
|
||||||
|
u.created_at AS registered_at,
|
||||||
|
us.status,
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(TRIM(CONCAT(pp.first_name, ' ', pp.last_name)), ''),
|
||||||
|
cp.company_name,
|
||||||
|
cp.contact_person_name,
|
||||||
|
u.email
|
||||||
|
) AS name
|
||||||
|
FROM users u
|
||||||
|
LEFT JOIN user_status us ON us.user_id = u.id
|
||||||
|
LEFT JOIN personal_profiles pp ON pp.user_id = u.id
|
||||||
|
LEFT JOIN company_profiles cp ON cp.user_id = u.id
|
||||||
|
WHERE EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM referral_token_usage rtu
|
||||||
|
JOIN referral_tokens rt ON rtu.referral_token_id = rt.id
|
||||||
|
WHERE rt.created_by_user_id = ?
|
||||||
|
AND rtu.used_by_user_id = u.id
|
||||||
|
)
|
||||||
|
ORDER BY u.created_at DESC
|
||||||
|
`;
|
||||||
|
logger.debug('ReferralTokenRepository.getReferredUsersByCreator:sql', { sql, params: [createdByUserId] });
|
||||||
|
const [rows] = await conn.query(sql, [createdByUserId]);
|
||||||
|
logger.info('ReferralTokenRepository.getReferredUsersByCreator:success', { createdByUserId, count: rows.length });
|
||||||
|
return rows;
|
||||||
|
} catch (error) {
|
||||||
|
logger.error('ReferralTokenRepository.getReferredUsersByCreator:error', { createdByUserId, error: error.message });
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ...add more methods as needed (e.g., update, usage)...
|
// ...add more methods as needed (e.g., update, usage)...
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -67,6 +67,7 @@ router.get('/permissions', authMiddleware, PermissionController.list);
|
|||||||
router.get('/referral/list', authMiddleware, ReferralTokenController.list);
|
router.get('/referral/list', authMiddleware, ReferralTokenController.list);
|
||||||
router.get('/referral/stats', authMiddleware, ReferralTokenController.stats);
|
router.get('/referral/stats', authMiddleware, ReferralTokenController.stats);
|
||||||
router.get('/referral/info/:token', ReferralRegistrationController.getReferrerInfo);
|
router.get('/referral/info/:token', ReferralRegistrationController.getReferrerInfo);
|
||||||
|
router.get('/referral/referred-users', authMiddleware, ReferralTokenController.referredUsers);
|
||||||
|
|
||||||
// userSettings.js GETs
|
// userSettings.js GETs
|
||||||
router.get('/settings', authMiddleware, UserSettingsController.getSettings);
|
router.get('/settings', authMiddleware, UserSettingsController.getSettings);
|
||||||
|
|||||||
@ -570,6 +570,35 @@ class ReferralService {
|
|||||||
`;
|
`;
|
||||||
await conn.query(query, [tokenId]);
|
await conn.query(query, [tokenId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async getReferredUsers(userId, unitOfWork) {
|
||||||
|
logger.info('ReferralService:getReferredUsers:start', { userId });
|
||||||
|
const repo = new ReferralTokenRepository(unitOfWork);
|
||||||
|
const rows = await repo.getReferredUsersByCreator(userId);
|
||||||
|
|
||||||
|
const users = rows.map(r => {
|
||||||
|
let registeredAt = null;
|
||||||
|
if (r.registered_at) {
|
||||||
|
const d = new Date(r.registered_at);
|
||||||
|
registeredAt = isNaN(d.getTime()) ? null : d.toISOString();
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
id: r.id,
|
||||||
|
name: r.name || r.email,
|
||||||
|
email: r.email,
|
||||||
|
type: r.user_type,
|
||||||
|
registeredAt,
|
||||||
|
status: r.status || null
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const result = {
|
||||||
|
total_referred_users: users.length,
|
||||||
|
users
|
||||||
|
};
|
||||||
|
logger.info('ReferralService:getReferredUsers:success', { userId, total: result.total_referred_users });
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = ReferralService;
|
module.exports = ReferralService;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user