/** * Admin Statistics Models * Type definitions for admin statistics and analytics */ /** * User growth data point for chart */ export interface UserGrowthData { date: string; count: number; } /** * Category popularity data for chart */ export interface CategoryPopularity { categoryId: string; categoryName: string; quizCount: number; percentage: number; } /** * System-wide statistics response */ export interface AdminStatistics { totalUsers: number; activeUsers: number; // Last 7 days totalQuizSessions: number; totalQuestions: number; averageQuizScore: number; userGrowth: UserGrowthData[]; popularCategories: CategoryPopularity[]; stats: { newUsersToday: number; newUsersThisWeek: number; newUsersThisMonth: number; quizzesToday: number; quizzesThisWeek: number; quizzesThisMonth: number; }; } /** * API response wrapper for statistics */ export interface AdminStatisticsResponse { success: boolean; data: AdminStatistics; message?: string; } /** * Date range filter for statistics */ export interface DateRangeFilter { startDate: Date | null; endDate: Date | null; } /** * Cache entry for admin data */ export interface AdminCacheEntry { data: T; timestamp: number; expiresAt: number; } /** * Guest session timeline data point */ export interface GuestSessionTimelineData { date: string; activeSessions: number; newSessions: number; convertedSessions: number; } /** * Conversion funnel stage */ export interface ConversionFunnelStage { stage: string; count: number; percentage: number; dropoff?: number; } /** * Guest analytics data */ export interface GuestAnalytics { totalGuestSessions: number; activeGuestSessions: number; conversionRate: number; // Percentage averageQuizzesPerGuest: number; totalConversions: number; timeline: GuestSessionTimelineData[]; conversionFunnel: ConversionFunnelStage[]; stats: { sessionsToday: number; sessionsThisWeek: number; sessionsThisMonth: number; conversionsToday: number; conversionsThisWeek: number; conversionsThisMonth: number; }; } /** * API response wrapper for guest analytics */ export interface GuestAnalyticsResponse { success: boolean; data: GuestAnalytics; message?: string; } /** * Guest access settings */ export interface GuestSettings { guestAccessEnabled: boolean; maxQuizzesPerDay: number; maxQuestionsPerQuiz: number; sessionExpiryHours: number; upgradePromptMessage: string; allowedCategories?: string[]; features?: { canBookmark: boolean; canViewHistory: boolean; canExportResults: boolean; }; } /** * API response wrapper for guest settings */ export interface GuestSettingsResponse { success: boolean; data: GuestSettings; message?: string; } /** * Admin user data */ export interface AdminUser { id: string; username: string; email: string; role: 'user' | 'admin'; isActive: boolean; createdAt: string; lastLoginAt?: string; profilePicture?: string | null; quizzesTaken?: number; averageScore?: number; } /** * User list query parameters */ export interface UserListParams { page?: number; limit?: number; role?: 'all' | 'user' | 'admin'; isActive?: 'all' | 'active' | 'inactive'; sortBy?: 'username' | 'email' | 'createdAt' | 'lastLoginAt'; sortOrder?: 'asc' | 'desc'; search?: string; } /** * Paginated user list response */ export interface AdminUserListResponse { success: boolean; data: { users: AdminUser[]; pagination: { currentPage: number; totalPages: number; totalUsers: number; limit: number; hasNext: boolean; hasPrev: boolean; }; }; message?: string; } /** * User activity entry */ export interface UserActivity { id: string; type: 'login' | 'quiz_start' | 'quiz_complete' | 'bookmark' | 'profile_update' | 'role_change'; description: string; timestamp: string; metadata?: { categoryName?: string; score?: number; questionCount?: number; oldRole?: string; newRole?: string; }; } /** * Quiz history entry for user detail */ export interface UserQuizHistoryEntry { id: string; categoryId: string; categoryName: string; score: number; totalQuestions: number; percentage: number; timeTaken: number; // seconds completedAt: string; } /** * User statistics for detail view */ export interface UserStatistics { totalQuizzes: number; averageScore: number; totalQuestionsAnswered: number; correctAnswers: number; accuracy: number; currentStreak: number; longestStreak: number; totalTimeSpent: number; // seconds favoriteCategory?: { id: string; name: string; quizCount: number; }; recentActivity: { lastQuizDate?: string; lastLoginDate?: string; quizzesThisWeek: number; quizzesThisMonth: number; }; } /** * Detailed user profile */ export interface AdminUserDetail { id: string; username: string; email: string; role: 'user' | 'admin'; isActive: boolean; createdAt: string; lastLoginAt?: string; statistics: UserStatistics; quizHistory: UserQuizHistoryEntry[]; activityTimeline: UserActivity[]; metadata?: { ipAddress?: string; userAgent?: string; registrationMethod?: 'direct' | 'guest_conversion'; guestSessionId?: string; }; } /** * API response wrapper for user detail */ export interface AdminUserDetailResponse { success: boolean; data: AdminUserDetail; message?: string; }