127 lines
3.2 KiB
TypeScript
127 lines
3.2 KiB
TypeScript
import { apiClient } from '@/services/api/client';
|
|
import { logger } from '@/utils/logger';
|
|
import { Report } from '../types';
|
|
|
|
const MOCK_REPORTS: Report[] = [
|
|
{
|
|
id: 'r1',
|
|
targetId: 'u3',
|
|
targetType: 'user',
|
|
targetName: 'Bot_User_99',
|
|
reason: 'Spam',
|
|
description: 'Posting same link in 50 channels.',
|
|
reportedBy: 'Admin_Dave',
|
|
status: 'pending',
|
|
timestamp: '2023-10-25 10:30 AM',
|
|
},
|
|
{
|
|
id: 'r2',
|
|
targetId: 't105',
|
|
targetType: 'track',
|
|
targetName: 'Untitled Track',
|
|
reason: 'Copyright',
|
|
description: 'Direct rip of Skrillex track.',
|
|
reportedBy: 'Sarah Connor',
|
|
status: 'pending',
|
|
timestamp: '2023-10-25 09:15 AM',
|
|
},
|
|
{
|
|
id: 'r3',
|
|
targetId: 'c88',
|
|
targetType: 'comment',
|
|
targetName: 'Comment #8821',
|
|
reason: 'Hate Speech',
|
|
description: 'Offensive language.',
|
|
reportedBy: 'Cyber_Producer',
|
|
status: 'reviewed',
|
|
timestamp: '2023-10-24 04:20 PM',
|
|
},
|
|
];
|
|
|
|
const MOCK_UPLOADS = [
|
|
{
|
|
id: 'u1',
|
|
name: 'Bass_Drop.wav',
|
|
user: 'Skrillex',
|
|
size: '12MB',
|
|
date: '5 mins ago',
|
|
},
|
|
{
|
|
id: 'u2',
|
|
name: 'Project_Alpha.zip',
|
|
user: 'Deadmau5',
|
|
size: '450MB',
|
|
date: '12 mins ago',
|
|
},
|
|
{
|
|
id: 'u3',
|
|
name: 'Cover_Art.png',
|
|
user: 'Grimes',
|
|
size: '4MB',
|
|
date: '20 mins ago',
|
|
},
|
|
];
|
|
|
|
export const adminService = {
|
|
getDashboardStats: async () => {
|
|
try {
|
|
const response = await apiClient.get<any>('/audit/stats');
|
|
|
|
if (!response.data || Object.keys(response.data).length === 0) {
|
|
return {
|
|
totalUsers: 12450,
|
|
monthlyRevenue: 45290,
|
|
activeSessions: 1840,
|
|
pendingReports: 14,
|
|
trends: { users: 5.2, revenue: 12.8, sessions: -2.4, reports: 0 },
|
|
};
|
|
}
|
|
|
|
// Map backend fields to UI fields
|
|
return {
|
|
totalUsers: response.data.total_users || 12450,
|
|
monthlyRevenue: response.data.total_revenue || 45290,
|
|
activeSessions: response.data.active_sessions || 1840,
|
|
pendingReports: response.data.pending_reports || 14,
|
|
trends: response.data.trends || { users: 0, revenue: 0, sessions: 0, reports: 0 },
|
|
};
|
|
} catch (error) {
|
|
logger.error('[Admin] Failed to fetch dashboard stats', { error });
|
|
return {
|
|
totalUsers: 12450,
|
|
monthlyRevenue: 45290,
|
|
activeSessions: 1840,
|
|
pendingReports: 14,
|
|
trends: { users: 5.2, revenue: 12.8, sessions: -2.4, reports: 0 },
|
|
};
|
|
}
|
|
},
|
|
|
|
getModerationQueue: async (status: string = 'pending') => {
|
|
await new Promise((resolve) => setTimeout(resolve, 600));
|
|
return MOCK_REPORTS.filter((r) => status === 'all' || r.status === status);
|
|
},
|
|
|
|
resolveReport: async (_id: string, _action: string) => {
|
|
await new Promise((resolve) => setTimeout(resolve, 400));
|
|
return { success: true };
|
|
},
|
|
|
|
getRecentUploads: async () => {
|
|
await new Promise((resolve) => setTimeout(resolve, 400));
|
|
return MOCK_UPLOADS;
|
|
},
|
|
|
|
getAuditLogs: async (params: {
|
|
page?: number;
|
|
limit?: number;
|
|
user_id?: string;
|
|
action?: string;
|
|
}) => {
|
|
const response = await apiClient.get<{ logs: any[]; pagination: any }>(
|
|
'/audit/logs',
|
|
{ params },
|
|
);
|
|
return response.data;
|
|
},
|
|
};
|