feat: added referred user endpoint

This commit is contained in:
DeathKaioken 2025-10-22 20:24:48 +02:00
parent dac3f21921
commit 95ba693118
4 changed files with 91 additions and 0 deletions

View File

@ -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;

View File

@ -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)...
}

View File

@ -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);

View File

@ -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;