fix: chart.js legend error + smart cache for date-range queries

- Fix forecast chart confidence band fill config (fill:'+1' → explicit target)
  to resolve 't.legend.handleEvent' TypeError in Chart.js 4.4.1
- Add getOrFetchRange() to cache.js: auto TTL based on data age
  (end date >10 days old → 24h cache, recent → 5min cache)
- Apply smart cache to 6 heavy endpoints: bi, bi/revenue, bi/strategic,
  providers, providers/failed, providers/trend

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-02-16 22:48:53 -05:00
parent 844f931076
commit 6bfd21a111
3 changed files with 44 additions and 11 deletions

View File

@@ -357,7 +357,7 @@ app.get('/admin/api/bi', requireRole('admin'), async (req, res) => {
return row ? row.nome : null;
};
const data = await fetchBIData(start, end, getAgenteName);
const data = await cache.getOrFetchRange('bi', start, end, () => fetchBIData(start, end, getAgenteName));
res.json(data);
} catch (err) {
console.error('Admin BI API error:', err);
@@ -369,7 +369,8 @@ app.get('/admin/api/bi/revenue', requireRole('admin'), async (req, res) => {
try {
const { start, end, granularity } = req.query;
if (!start || !end) return res.status(400).json({ error: 'start and end required' });
const data = await fetchRevenueAnalytics(start, end, granularity || 'dia');
const g = granularity || 'dia';
const data = await cache.getOrFetchRange(`bi-rev-${g}`, start, end, () => fetchRevenueAnalytics(start, end, g));
res.json(data);
} catch (err) {
console.error('Revenue API error:', err);
@@ -381,7 +382,7 @@ app.get('/admin/api/bi/strategic', requireRole('admin'), async (req, res) => {
try {
const { start, end } = req.query;
if (!start || !end) return res.status(400).json({ error: 'start and end required' });
const data = await fetchBIStrategic(start, end);
const data = await cache.getOrFetchRange('bi-strat', start, end, () => fetchBIStrategic(start, end));
res.json(data);
} catch (err) {
console.error('Strategic BI API error:', err);
@@ -917,7 +918,7 @@ app.get('/admin/api/providers', requireRole('admin'), async (req, res) => {
try {
const { start, end } = req.query;
if (!start || !end) return res.status(400).json({ error: 'start and end required' });
const data = await fetchProviderPerformance(start, end);
const data = await cache.getOrFetchRange('providers', start, end, () => fetchProviderPerformance(start, end));
res.json(data);
} catch (err) {
console.error('Provider API error:', err);
@@ -929,7 +930,7 @@ app.get('/admin/api/providers/failed', requireRole('admin'), async (req, res) =>
try {
const { start, end } = req.query;
if (!start || !end) return res.status(400).json({ error: 'start and end required' });
const data = await fetchFailedTransactions(start, end);
const data = await cache.getOrFetchRange('providers-fail', start, end, () => fetchFailedTransactions(start, end));
res.json(data);
} catch (err) {
console.error('Failed TX API error:', err);
@@ -941,7 +942,7 @@ app.get('/admin/api/providers/trend', requireRole('admin'), async (req, res) =>
try {
const { start, end } = req.query;
if (!start || !end) return res.status(400).json({ error: 'start and end required' });
const data = await fetchProviderTrend(start, end);
const data = await cache.getOrFetchRange('providers-trend', start, end, () => fetchProviderTrend(start, end));
res.json(data);
} catch (err) {
console.error('Provider Trend API error:', err);