CentralBackend/repositories/admin/AdminRepository.js
2025-09-08 16:05:37 +02:00

239 lines
9.4 KiB
JavaScript

const { logger } = require('../../middleware/logger');
class AdminRepository {
static async getUserStats(conn) {
logger.info('AdminRepository.getUserStats:start');
try {
const [[{ totalUsers }]] = await conn.query(`SELECT COUNT(*) AS totalUsers FROM users`);
const [[{ adminUsers }]] = await conn.query(`SELECT COUNT(*) AS adminUsers FROM users WHERE role IN ('admin', 'super_admin')`);
const [[{ verificationPending }]] = await conn.query(`
SELECT COUNT(*) AS verificationPending
FROM user_status
WHERE
status = 'pending'
AND email_verified = 1
AND profile_completed = 1
AND documents_uploaded = 1
AND contract_signed = 1
AND is_admin_verified = 0
`);
const [[{ activeUsers }]] = await conn.query(`
SELECT COUNT(*) AS activeUsers
FROM user_status us
JOIN users u ON us.user_id = u.id
WHERE us.is_admin_verified = 1 AND u.role = 'user'
`);
const [[{ personalUsers }]] = await conn.query(`SELECT COUNT(*) AS personalUsers FROM users WHERE user_type = 'personal'`);
const [[{ companyUsers }]] = await conn.query(`SELECT COUNT(*) AS companyUsers FROM users WHERE user_type = 'company'`);
logger.info('AdminRepository.getUserStats:success', { totalUsers, adminUsers, verificationPending, activeUsers, personalUsers, companyUsers });
return { totalUsers, adminUsers, verificationPending, activeUsers, personalUsers, companyUsers };
} catch (error) {
logger.error('AdminRepository.getUserStats:error', { error: error.message });
throw error;
}
}
static async getUserList(conn) {
logger.info('AdminRepository.getUserList: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,
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
ORDER BY u.created_at DESC
`);
logger.info('AdminRepository.getUserList:success', { count: rows.length });
return rows;
} catch (error) {
logger.error('AdminRepository.getUserList:error', { error: error.message });
throw error;
}
}
static async getVerificationPendingUsers(conn) {
logger.info('AdminRepository.getVerificationPendingUsers: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,
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.status = 'pending'
AND us.email_verified = 1
AND us.profile_completed = 1
AND us.documents_uploaded = 1
AND us.contract_signed = 1
AND us.is_admin_verified = 0
ORDER BY u.created_at DESC
`);
logger.info('AdminRepository.getVerificationPendingUsers:success', { count: rows.length });
return rows;
} catch (error) {
logger.error('AdminRepository.getVerificationPendingUsers:error', { error: error.message });
throw error;
}
}
static async getUserDocuments(conn, userId) {
logger.info('AdminRepository.getUserDocuments:start', { userId });
try {
const [documents] = await conn.query(`SELECT * FROM user_documents WHERE user_id = ?`, [userId]);
logger.info('AdminRepository.getUserDocuments:success', { userId, count: documents.length });
return documents;
} catch (error) {
logger.error('AdminRepository.getUserDocuments:error', { userId, error: error.message });
throw error;
}
}
static async getUserContracts(conn, userId) {
logger.info('AdminRepository.getUserContracts:start', { userId });
try {
const [contracts] = await conn.query(
`SELECT * FROM user_documents WHERE user_id = ? AND document_type = 'contract'`, [userId]
);
logger.info('AdminRepository.getUserContracts:success', { userId, count: contracts.length });
return contracts;
} catch (error) {
logger.error('AdminRepository.getUserContracts:error', { userId, error: error.message });
throw error;
}
}
static async getUserIdDocuments(conn, userId) {
logger.info('AdminRepository.getUserIdDocuments:start', { userId });
try {
const [idDocs] = await conn.query(`SELECT * FROM user_id_documents WHERE user_id = ?`, [userId]);
logger.info('AdminRepository.getUserIdDocuments:success', { userId, count: idDocs.length });
return idDocs;
} catch (error) {
logger.error('AdminRepository.getUserIdDocuments:error', { userId, error: error.message });
throw error;
}
}
static async verifyUser(conn, userId) {
logger.info('AdminRepository.verifyUser:start', { userId });
try {
await conn.query(
`UPDATE user_status SET is_admin_verified = 1, admin_verified_at = NOW(), status = 'active' WHERE user_id = ?`,
[userId]
);
logger.info('AdminRepository.verifyUser:success', { userId });
} catch (error) {
logger.error('AdminRepository.verifyUser:error', { userId, error: error.message });
throw error;
}
}
static async assignPermissions(conn, userId, permissions) {
logger.info('AdminRepository.assignPermissions:start', { userId, permissions });
try {
const [permRows] = await conn.query(
`SELECT id, name FROM permissions WHERE name IN (?)`, [permissions]
);
for (const perm of permRows) {
await conn.query(
`INSERT IGNORE INTO user_permissions (user_id, permission_id) VALUES (?, ?)`,
[userId, perm.id]
);
}
logger.info('AdminRepository.assignPermissions:success', { userId, permissions });
} catch (error) {
logger.error('AdminRepository.assignPermissions:error', { userId, error: error.message });
throw error;
}
}
static async getUserById(conn, userId) {
logger.info('AdminRepository.getUserById:start', { userId });
try {
const [rows] = await conn.query(`SELECT * FROM users WHERE id = ? LIMIT 1`, [userId]);
logger.info('AdminRepository.getUserById:success', { userId, found: !!(rows.length) });
return rows.length ? rows[0] : null;
} catch (error) {
logger.error('AdminRepository.getUserById:error', { userId, error: error.message });
throw error;
}
}
static async getPersonalProfile(conn, userId) {
logger.info('AdminRepository.getPersonalProfile:start', { userId });
try {
const [rows] = await conn.query(`SELECT * FROM personal_profiles WHERE user_id = ? LIMIT 1`, [userId]);
logger.info('AdminRepository.getPersonalProfile:success', { userId, found: !!(rows.length) });
return rows.length ? rows[0] : null;
} catch (error) {
logger.error('AdminRepository.getPersonalProfile:error', { userId, error: error.message });
throw error;
}
}
static async getCompanyProfile(conn, userId) {
logger.info('AdminRepository.getCompanyProfile:start', { userId });
try {
const [rows] = await conn.query(`SELECT * FROM company_profiles WHERE user_id = ? LIMIT 1`, [userId]);
logger.info('AdminRepository.getCompanyProfile:success', { userId, found: !!(rows.length) });
return rows.length ? rows[0] : null;
} catch (error) {
logger.error('AdminRepository.getCompanyProfile:error', { userId, error: error.message });
throw error;
}
}
static async getUserPermissions(conn, userId) {
logger.info('AdminRepository.getUserPermissions:start', { userId });
try {
const [permRows] = await conn.query(
`SELECT p.id, p.name, p.description, p.is_active
FROM user_permissions up
JOIN permissions p ON up.permission_id = p.id
WHERE up.user_id = ? AND p.is_active = TRUE`,
[userId]
);
logger.info('AdminRepository.getUserPermissions:success', { userId, count: permRows.length });
return permRows;
} catch (error) {
logger.error('AdminRepository.getUserPermissions:error', { userId, error: error.message });
throw error;
}
}
static async updateUserPermissions(conn, userId, permissions) {
logger.info('AdminRepository.updateUserPermissions:start', { userId, permissions });
try {
await conn.query(`DELETE FROM user_permissions WHERE user_id = ?`, [userId]);
if (permissions.length > 0) {
const [permRows] = await conn.query(
`SELECT id, name FROM permissions WHERE name IN (?) AND is_active = TRUE`, [permissions]
);
const permIds = permRows.map(row => row.id);
if (permIds.length > 0) {
const values = permIds.map(pid => [userId, pid]);
await conn.query(
`INSERT INTO user_permissions (user_id, permission_id) VALUES ?`, [values]
);
}
}
logger.info('AdminRepository.updateUserPermissions:success', { userId, permissions });
} catch (error) {
logger.error('AdminRepository.updateUserPermissions:error', { userId, error: error.message });
throw error;
}
}
}
module.exports = AdminRepository;