Prima importazione
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const pool = require('../db');
|
||||
|
||||
// GET /api/dashboard/stats — Dashboard statistics
|
||||
router.get('/stats', async (req, res) => {
|
||||
try {
|
||||
// All queries in parallel for speed
|
||||
const [
|
||||
byState,
|
||||
byPriority,
|
||||
byQueue,
|
||||
todayCount,
|
||||
weekCount,
|
||||
totalOpen,
|
||||
recentTickets,
|
||||
escalated,
|
||||
] = await Promise.all([
|
||||
// Tickets by state (only open-ish states)
|
||||
pool.query(
|
||||
`SELECT ts.name AS state, tst.name AS state_type, COUNT(*) AS count
|
||||
FROM ticket t
|
||||
JOIN ticket_state ts ON t.ticket_state_id = ts.id
|
||||
JOIN ticket_state_type tst ON ts.type_id = tst.id
|
||||
WHERE tst.name IN ('new', 'open', 'pending reminder', 'pending auto')
|
||||
GROUP BY ts.name, tst.name
|
||||
ORDER BY count DESC`
|
||||
),
|
||||
// Tickets by priority (open only)
|
||||
pool.query(
|
||||
`SELECT tp.name AS priority, tp.color, COUNT(*) AS count
|
||||
FROM ticket t
|
||||
JOIN ticket_priority tp ON t.ticket_priority_id = tp.id
|
||||
JOIN ticket_state ts ON t.ticket_state_id = ts.id
|
||||
JOIN ticket_state_type tst ON ts.type_id = tst.id
|
||||
WHERE tst.name IN ('new', 'open', 'pending reminder', 'pending auto')
|
||||
GROUP BY tp.name, tp.color, tp.id
|
||||
ORDER BY tp.id`
|
||||
),
|
||||
// Tickets by queue (open only, top 10)
|
||||
pool.query(
|
||||
`SELECT q.name AS queue, COUNT(*) AS count
|
||||
FROM ticket t
|
||||
JOIN queue q ON t.queue_id = q.id
|
||||
JOIN ticket_state ts ON t.ticket_state_id = ts.id
|
||||
JOIN ticket_state_type tst ON ts.type_id = tst.id
|
||||
WHERE tst.name IN ('new', 'open', 'pending reminder', 'pending auto')
|
||||
GROUP BY q.name
|
||||
ORDER BY count DESC
|
||||
LIMIT 10`
|
||||
),
|
||||
// Created today
|
||||
pool.query(
|
||||
`SELECT COUNT(*) AS count FROM ticket
|
||||
WHERE create_time >= CURRENT_DATE`
|
||||
),
|
||||
// Created this week
|
||||
pool.query(
|
||||
`SELECT COUNT(*) AS count FROM ticket
|
||||
WHERE create_time >= date_trunc('week', CURRENT_DATE)`
|
||||
),
|
||||
// Total open
|
||||
pool.query(
|
||||
`SELECT COUNT(*) AS count
|
||||
FROM ticket t
|
||||
JOIN ticket_state ts ON t.ticket_state_id = ts.id
|
||||
JOIN ticket_state_type tst ON ts.type_id = tst.id
|
||||
WHERE tst.name IN ('new', 'open', 'pending reminder', 'pending auto')`
|
||||
),
|
||||
// 10 most recent tickets
|
||||
pool.query(
|
||||
`SELECT t.id, t.tn, t.title, ts.name AS state_name,
|
||||
tp.name AS priority_name, tp.color AS priority_color,
|
||||
q.name AS queue_name, t.create_time
|
||||
FROM ticket t
|
||||
JOIN ticket_state ts ON t.ticket_state_id = ts.id
|
||||
JOIN ticket_priority tp ON t.ticket_priority_id = tp.id
|
||||
JOIN queue q ON t.queue_id = q.id
|
||||
ORDER BY t.create_time DESC
|
||||
LIMIT 10`
|
||||
),
|
||||
// Escalated tickets
|
||||
pool.query(
|
||||
`SELECT COUNT(*) AS count FROM ticket
|
||||
WHERE escalation_time > 0
|
||||
AND escalation_time < EXTRACT(EPOCH FROM NOW())`
|
||||
),
|
||||
]);
|
||||
|
||||
res.json({
|
||||
by_state: byState.rows,
|
||||
by_priority: byPriority.rows,
|
||||
by_queue: byQueue.rows,
|
||||
created_today: parseInt(todayCount.rows[0].count),
|
||||
created_this_week: parseInt(weekCount.rows[0].count),
|
||||
total_open: parseInt(totalOpen.rows[0].count),
|
||||
recent_tickets: recentTickets.rows,
|
||||
escalated: parseInt(escalated.rows[0].count),
|
||||
});
|
||||
} catch (err) {
|
||||
console.error('Error fetching dashboard stats:', err);
|
||||
res.status(500).json({ error: err.message });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user