kol overview

This commit is contained in:
2025-03-13 18:17:27 +08:00
parent f5c660217a
commit 6d29a208f1
7 changed files with 806 additions and 1 deletions

View File

@@ -0,0 +1,119 @@
import { Context } from 'hono';
import { analyticsService } from '../services/analyticsService';
import { logger } from '../utils/logger';
/**
* Controller for analytics endpoints
*/
export class AnalyticsController {
/**
* Get KOL performance overview
* Returns card-style layout showing key performance metrics for each KOL
*
* @param c Hono Context
* @returns Response with KOL performance data
*/
async getKolOverview(c: Context) {
const requestId = `req_${Date.now()}_${Math.random().toString(36).substring(2, 10)}`;
const startTime = Date.now();
try {
// Get query parameters for time range filtering
const timeRange = c.req.query('timeRange') || '30'; // Default to 30 days
const projectId = c.req.query('projectId'); // Optional project filter
const sortBy = c.req.query('sortBy') || 'followers_change'; // Default sort by followers change
const sortOrder = c.req.query('sortOrder') || 'desc'; // Default to descending order
const limit = parseInt(c.req.query('limit') || '20', 10); // Default limit to 20 KOLs
const offset = parseInt(c.req.query('offset') || '0', 10); // Default offset to 0
const debug = c.req.query('debug') || 'false'; // Default debug to false
logger.info(`[${requestId}] KOL overview request received`, {
timeRange,
projectId,
sortBy,
sortOrder,
limit,
offset,
debug,
userAgent: c.req.header('user-agent'),
ip: c.req.header('x-forwarded-for') || 'unknown'
});
// Validate time range
if (!['7', '30', '90'].includes(timeRange)) {
logger.warn(`[${requestId}] Invalid timeRange: ${timeRange}`);
return c.json({
success: false,
error: 'Invalid timeRange. Must be 7, 30, or 90.'
}, 400);
}
// Validate sort order
if (!['asc', 'desc'].includes(sortOrder)) {
logger.warn(`[${requestId}] Invalid sortOrder: ${sortOrder}`);
return c.json({
success: false,
error: 'Invalid sortOrder. Must be asc or desc.'
}, 400);
}
// Validate sort field
const validSortFields = ['followers_change', 'likes_change', 'follows_change', 'followers_count'];
if (!validSortFields.includes(sortBy)) {
logger.warn(`[${requestId}] Invalid sortBy: ${sortBy}`);
return c.json({
success: false,
error: `Invalid sortBy. Must be one of: ${validSortFields.join(', ')}`
}, 400);
}
// Get KOL overview data from the service
const data = await analyticsService.getKolPerformanceOverview(
parseInt(timeRange, 10),
projectId,
sortBy,
sortOrder,
limit,
offset
);
// Debug mode - log additional event data
if (debug.toLowerCase() === 'true' && process.env.NODE_ENV !== 'production') {
await analyticsService.debugEventData();
}
// Log successful response
const duration = Date.now() - startTime;
logger.info(`[${requestId}] KOL overview response sent successfully`, {
duration,
resultCount: data.kols.length,
totalRecords: data.total
});
// Return the data
return c.json({
success: true,
data: data.kols,
pagination: {
limit,
offset,
total: data.total
}
});
} catch (error) {
// Log error
const duration = Date.now() - startTime;
logger.error(`[${requestId}] Error fetching KOL overview (${duration}ms)`, error);
// Return error response
return c.json({
success: false,
error: 'Failed to fetch KOL overview data',
message: error instanceof Error ? error.message : 'Unknown error'
}, 500);
}
}
}
// Export singleton instance
export const analyticsController = new AnalyticsController();