Merge pull request 'Add getUnverifiedUsers functionality to AdminUserController and AdminService, and update routes' (#2) from admin-site into main

Reviewed-on: #2
This commit is contained in:
Seazn 2025-10-15 16:47:28 +00:00
commit 776824b324
5 changed files with 53 additions and 2 deletions

View File

@ -41,6 +41,19 @@ class AdminUserController {
}
}
static async getUnverifiedUsers(req, res) {
const unitOfWork = new UnitOfWork();
await unitOfWork.start();
try {
const users = await AdminService.getUnverifiedUsers(unitOfWork);
await unitOfWork.commit();
res.json({ success: true, users });
} catch (error) {
await unitOfWork.rollback(error);
res.status(500).json({ success: false, message: error.message });
}
}
static async verifyUser(req, res) {
const userId = req.params.id;
const { permissions = [] } = req.body;

View File

@ -86,6 +86,31 @@ class AdminRepository {
}
}
static async getUnverifiedUsers(conn) {
logger.info('AdminRepository.getUnverifiedUsers:start');
try {
const [rows] = await conn.query(`
SELECT
u.id, u.email, u.user_type, u.role, u.created_at, u.last_login_at,
us.status, us.is_admin_verified, us.email_verified, us.profile_completed,
us.documents_uploaded, us.contract_signed,
pp.first_name, pp.last_name,
cp.company_name
FROM users u
LEFT JOIN user_status us ON u.id = us.user_id
LEFT JOIN personal_profiles pp ON u.id = pp.user_id
LEFT JOIN company_profiles cp ON u.id = cp.user_id
WHERE us.is_admin_verified = 0
ORDER BY u.created_at DESC
`);
logger.info('AdminRepository.getUnverifiedUsers:success', { count: rows.length });
return rows;
} catch (error) {
logger.error('AdminRepository.getUnverifiedUsers:error', { error: error.message });
throw error;
}
}
static async getUserDocuments(conn, userId) {
logger.info('AdminRepository.getUserDocuments:start', { userId });
try {

View File

@ -54,6 +54,7 @@ router.get('/verify-password-reset', (req, res) => { /* Note: was moved from Pas
router.get('/admin/user-stats', authMiddleware, requireAdmin, AdminUserController.getUserStats);
router.get('/admin/user-list', authMiddleware, requireAdmin, AdminUserController.getUserList);
router.get('/admin/verification-pending-users', authMiddleware, requireAdmin, AdminUserController.getVerificationPendingUsers);
router.get('/admin/unverified-users', authMiddleware, requireAdmin, AdminUserController.getUnverifiedUsers);
router.get('/admin/user/:id/documents', authMiddleware, requireAdmin, UserDocumentController.getAllDocumentsForUser);
router.get('/admin/server-status', authMiddleware, requireAdmin, ServerStatusController.getStatus);

View File

@ -3,8 +3,8 @@ const UnitOfWork = require('../database/UnitOfWork');
const argon2 = require('argon2');
async function createAdminUser() {
// const adminEmail = process.env.ADMIN_EMAIL || 'office@profit-planet.com';
const adminEmail = process.env.ADMIN_EMAIL || 'loki.aahi@gmail.com';
const adminEmail = process.env.ADMIN_EMAIL || 'office@profit-planet.com';
// const adminEmail = process.env.ADMIN_EMAIL || 'loki.aahi@gmail.com';
const adminPassword = process.env.ADMIN_PASSWORD || 'W.profit-planet.com.2025'; // Set a secure password in production!
const firstName = process.env.ADMIN_FIRST_NAME || 'Admin';
const lastName = process.env.ADMIN_LAST_NAME || 'User';

View File

@ -46,6 +46,18 @@ class AdminService {
}
}
static async getUnverifiedUsers(unitOfWork) {
logger.info('AdminService.getUnverifiedUsers:start');
try {
const users = await AdminRepository.getUnverifiedUsers(unitOfWork.connection);
logger.info('AdminService.getUnverifiedUsers:success', { count: users.length });
return users;
} catch (error) {
logger.error('AdminService.getUnverifiedUsers:error', { error: error.message });
throw error;
}
}
static async verifyUser(unitOfWork, userId, permissions) {
logger.info('AdminService.verifyUser:start', { userId, permissions });
try {