UNPKG

education-module-ai

Version:
142 lines (141 loc) 4.94 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.progressTrackingService = void 0; /** * Service for tracking user learning progress */ class ProgressTrackingService { constructor() { this.progressEvents = []; } /** * Track a session completion */ async trackSessionCompletion(userId, sessionId, subject, timeSpent) { this.progressEvents.push({ userId, timestamp: new Date(), eventType: 'session_completed', subject, timeSpent, }); console.log(`Progress: User ${userId} completed a session in ${subject}`); } /** * Track content completion */ async trackContentCompleted(userId, contentId, subject, timeSpent) { this.progressEvents.push({ userId, timestamp: new Date(), eventType: 'content_completed', contentId, subject, timeSpent, }); console.log(`Progress: User ${userId} completed content ${contentId} in ${subject}`); } /** * Track quiz completion */ async trackQuizCompleted(userId, contentId, subject, score, timeSpent) { this.progressEvents.push({ userId, timestamp: new Date(), eventType: 'quiz_completed', contentId, subject, score, timeSpent, }); console.log(`Progress: User ${userId} completed quiz ${contentId} in ${subject} with score ${score}`); } /** * Get progress summary for a user */ async getProgressSummary(userId) { const userEvents = this.progressEvents.filter(event => event.userId === userId); const summary = { totalSessionsCompleted: 0, totalContentCompleted: 0, totalQuizzesCompleted: 0, totalTimeSpent: 0, subjectBreakdown: {}, }; // Process each event userEvents.forEach(event => { // Update total counts switch (event.eventType) { case 'session_completed': summary.totalSessionsCompleted++; break; case 'content_completed': summary.totalContentCompleted++; break; case 'quiz_completed': summary.totalQuizzesCompleted++; break; } // Add time spent if (event.timeSpent) { summary.totalTimeSpent += event.timeSpent; } // Update subject breakdown if (event.subject) { if (!summary.subjectBreakdown[event.subject]) { summary.subjectBreakdown[event.subject] = { sessionsCompleted: 0, contentCompleted: 0, quizzesCompleted: 0, averageScore: 0, timeSpent: 0, }; } const subjectData = summary.subjectBreakdown[event.subject]; // Update subject counts switch (event.eventType) { case 'session_completed': subjectData.sessionsCompleted++; break; case 'content_completed': subjectData.contentCompleted++; break; case 'quiz_completed': subjectData.quizzesCompleted++; break; } // Add subject time spent if (event.timeSpent) { subjectData.timeSpent += event.timeSpent; } // Update average score for quizzes if (event.eventType === 'quiz_completed' && typeof event.score === 'number') { const currentTotal = subjectData.averageScore * (subjectData.quizzesCompleted - 1); subjectData.averageScore = (currentTotal + event.score) / subjectData.quizzesCompleted; } } }); return summary; } /** * Get events for a specific user */ async getUserEvents(userId) { return this.progressEvents.filter(event => event.userId === userId); } /** * Get subject-specific progress for a user */ async getSubjectProgress(userId, subject) { const summary = await this.getProgressSummary(userId); return summary.subjectBreakdown[subject] || { sessionsCompleted: 0, contentCompleted: 0, quizzesCompleted: 0, averageScore: 0, timeSpent: 0, }; } } // Create and export a singleton instance exports.progressTrackingService = new ProgressTrackingService();