diff --git a/controller/referral/ReferralTokenController.js b/controller/referral/ReferralTokenController.js index def9832..13fa3a5 100644 --- a/controller/referral/ReferralTokenController.js +++ b/controller/referral/ReferralTokenController.js @@ -136,6 +136,27 @@ class ReferralTokenController { 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; diff --git a/repositories/referral/ReferralTokenRepository.js b/repositories/referral/ReferralTokenRepository.js index d7fe3cb..d490a76 100644 --- a/repositories/referral/ReferralTokenRepository.js +++ b/repositories/referral/ReferralTokenRepository.js @@ -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)... } diff --git a/routes/getRoutes.js b/routes/getRoutes.js index f22e430..0c23cf0 100644 --- a/routes/getRoutes.js +++ b/routes/getRoutes.js @@ -67,6 +67,7 @@ router.get('/permissions', authMiddleware, PermissionController.list); router.get('/referral/list', authMiddleware, ReferralTokenController.list); router.get('/referral/stats', authMiddleware, ReferralTokenController.stats); router.get('/referral/info/:token', ReferralRegistrationController.getReferrerInfo); +router.get('/referral/referred-users', authMiddleware, ReferralTokenController.referredUsers); // userSettings.js GETs router.get('/settings', authMiddleware, UserSettingsController.getSettings); diff --git a/services/referral/ReferralService.js b/services/referral/ReferralService.js index b69ecb5..b077927 100644 --- a/services/referral/ReferralService.js +++ b/services/referral/ReferralService.js @@ -570,6 +570,35 @@ class ReferralService { `; 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;