freealberta/map/app/controllers/dashboardController.js
2025-07-30 09:04:21 -06:00

71 lines
2.7 KiB
JavaScript

const nocodbService = require('../services/nocodb');
const logger = require('../utils/logger');
const config = require('../config');
class DashboardController {
async getStats(req, res) {
try {
// Get all locations for support level stats
const locationsResponse = await nocodbService.getAll(config.nocodb.tableId);
const locations = locationsResponse.list || [];
// Calculate support level distribution
const supportLevels = { '1': 0, '2': 0, '3': 0, '4': 0 };
let signRequests = 0;
locations.forEach(loc => {
if (loc['Support Level']) {
supportLevels[loc['Support Level']]++;
}
if (loc.Sign || loc.sign) {
signRequests++;
}
});
// Calculate overall score (weighted average)
const totalResponses = Object.values(supportLevels).reduce((a, b) => a + b, 0);
const weightedScore = (supportLevels['1'] * 4 + supportLevels['2'] * 3 +
supportLevels['3'] * 2 + supportLevels['4'] * 1) /
(totalResponses || 1);
// Get user stats
const usersResponse = await nocodbService.getAll(config.nocodb.loginSheetId);
const users = usersResponse.list || [];
// Get daily entry counts for the last 30 days
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
const dailyEntries = {};
locations.forEach(loc => {
const createdAt = new Date(loc.CreatedAt || loc.created_at);
if (createdAt >= thirtyDaysAgo) {
const dateKey = createdAt.toISOString().split('T')[0];
dailyEntries[dateKey] = (dailyEntries[dateKey] || 0) + 1;
}
});
res.json({
success: true,
data: {
supportLevels,
signRequests,
totalLocations: locations.length,
overallScore: weightedScore.toFixed(2),
totalUsers: users.length,
dailyEntries
}
});
} catch (error) {
logger.error('Error fetching dashboard stats:', error);
res.status(500).json({
success: false,
error: 'Failed to fetch dashboard statistics'
});
}
}
}
module.exports = new DashboardController();