const UnitOfWork = require('../../repositories/UnitOfWork'); const AdminService = require('../../services/AdminService'); class AdminUserController { static async getUserStats(req, res) { const unitOfWork = new UnitOfWork(); await unitOfWork.start(); try { const stats = await AdminService.getUserStats(unitOfWork); await unitOfWork.commit(); res.json({ success: true, stats }); } catch (error) { await unitOfWork.rollback(error); res.status(500).json({ success: false, message: error.message }); } } static async getUserList(req, res) { const unitOfWork = new UnitOfWork(); await unitOfWork.start(); try { const users = await AdminService.getUserList(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 getVerificationPendingUsers(req, res) { const unitOfWork = new UnitOfWork(); await unitOfWork.start(); try { const users = await AdminService.getVerificationPendingUsers(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; const unitOfWork = new UnitOfWork(); await unitOfWork.start(); try { const result = await AdminService.verifyUser(unitOfWork, userId, permissions); await unitOfWork.commit(); res.json({ success: true, ...result }); } catch (error) { await unitOfWork.rollback(error); res.status(500).json({ success: false, message: error.message }); } } static async getFullUserAccountDetails(req, res) { if (!req.user || (req.user.role !== 'admin' && req.user.role !== 'super_admin')) { return res.status(403).json({ success: false, message: 'Forbidden' }); } const userId = req.params.id; const unitOfWork = new UnitOfWork(); await unitOfWork.start(); try { const details = await AdminService.getFullUserAccountDetails(unitOfWork, userId); await unitOfWork.commit(); res.json({ success: true, ...details }); } catch (error) { await unitOfWork.rollback(error); res.status(500).json({ success: false, message: error.message }); } } static async updateUserPermissions(req, res) { const userId = Number(req.params.id); const permissions = req.body.permissions; if (!Array.isArray(permissions) || permissions.some(p => typeof p !== 'string')) { return res.status(400).json({ success: false, message: 'Invalid permissions format.' }); } if (!req.user || req.user.role !== 'admin') { return res.status(403).json({ success: false, message: 'Forbidden: Admins only.' }); } const unitOfWork = new UnitOfWork(); await unitOfWork.start(); try { await AdminService.updateUserPermissions(unitOfWork, userId, permissions); await unitOfWork.commit(); return res.json({ success: true, message: 'Permissions updated.' }); } catch (error) { await unitOfWork.rollback(error); return res.status(500).json({ success: false, message: error.message }); } } static async deleteUser(req, res) { if (!req.user || req.user.role !== 'admin') { return res.status(403).json({ success: false, message: 'Forbidden: Admins only.' }); } const userId = req.params.id; const unitOfWork = new UnitOfWork(); await unitOfWork.start(); try { await AdminService.deleteUser(unitOfWork, userId); await unitOfWork.commit(); res.json({ success: true, message: 'User deleted.' }); } catch (error) { await unitOfWork.rollback(error); res.status(500).json({ success: false, message: error.message }); } } } module.exports = AdminUserController;