2
2

dashboard.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // controllers/dashboard.js
  2. const db = require('../config/db');
  3. const { successResponse, errorResponse } = require('../utils/apiResponse');
  4. class DashboardController {
  5. static async getStats(req, res) {
  6. try {
  7. const [
  8. [totalJobs],
  9. [activeJobs],
  10. [totalCandidates],
  11. [pendingCandidates],
  12. [passedCandidates],
  13. [rejectedCandidates],
  14. [interviewedCandidates],
  15. [averageMatchScore],
  16. [passRate]
  17. ] = await Promise.all([
  18. db.query('SELECT COUNT(*) as count FROM jobs'),
  19. db.query("SELECT COUNT(*) as count FROM jobs WHERE status = 'active'"),
  20. db.query('SELECT COUNT(*) as count FROM candidates'),
  21. db.query("SELECT COUNT(*) as count FROM candidates WHERE status = 'pending'"),
  22. db.query("SELECT COUNT(*) as count FROM candidates WHERE status = 'passed'"),
  23. db.query("SELECT COUNT(*) as count FROM candidates WHERE status = 'rejected'"),
  24. db.query("SELECT COUNT(*) as count FROM candidates WHERE status = 'interviewed'"),
  25. db.query('SELECT AVG(match_score) as avg FROM candidates'),
  26. db.query(`
  27. SELECT
  28. COUNT(CASE WHEN status = 'passed' THEN 1 END) / COUNT(*) * 100 as rate
  29. FROM candidates
  30. `)
  31. ]);
  32. successResponse(res, {
  33. totalJobs: totalJobs[0].count,
  34. activeJobs: activeJobs[0].count,
  35. totalCandidates: totalCandidates[0].count,
  36. pendingCandidates: pendingCandidates[0].count,
  37. passedCandidates: passedCandidates[0].count,
  38. rejectedCandidates: rejectedCandidates[0].count,
  39. interviewedCandidates: interviewedCandidates[0].count,
  40. averageMatchScore: Math.round(averageMatchScore[0].avg || 0),
  41. passRate: Math.round(passRate[0].rate || 0)
  42. });
  43. } catch (err) {
  44. errorResponse(res, err);
  45. }
  46. }
  47. }
  48. module.exports = DashboardController;