| import { Request, Response } from 'express'; | |
| import { AppDataSource } from '../config/database'; | |
| import { User } from '../entities/User'; | |
| import { Agent, AgentStatus } from '../entities/Agent'; | |
| import { ChatMessage } from '../entities/ChatMessage'; | |
| import { Transaction } from '../entities/Transaction'; | |
| const userRepository = AppDataSource.getRepository(User); | |
| const agentRepository = AppDataSource.getRepository(Agent); | |
| const messageRepository = AppDataSource.getRepository(ChatMessage); | |
| const txRepository = AppDataSource.getRepository(Transaction); | |
| export class AdminController { | |
| async overview(req: Request, res: Response) { | |
| try { | |
| const { from, to } = req.query as any; | |
| const [users, agents, messages] = await Promise.all([ | |
| userRepository.count(), | |
| agentRepository.count(), | |
| messageRepository.count(), | |
| ]); | |
| const pendingAgents = await agentRepository.count({ where: { status: AgentStatus.PENDING } }); | |
| let pvQb = txRepository | |
| .createQueryBuilder('t') | |
| .select('SUM(ABS(t.amount))', 'sum'); | |
| if (from) pvQb = pvQb.where('t.createdAt >= :from', { from }); | |
| if (to) pvQb = pvQb.andWhere('t.createdAt <= :to', { to }); | |
| const totalPointsVolumeRow = await pvQb.getRawOne(); | |
| res.json({ | |
| totals: { | |
| users, | |
| agents, | |
| messages, | |
| pendingAgents, | |
| pointsVolume: Number(totalPointsVolumeRow?.sum || 0), | |
| }, | |
| }); | |
| } catch (error) { | |
| console.error('Admin overview error:', error); | |
| res.status(500).json({ error: 'Failed to get overview' }); | |
| } | |
| } | |
| } | |