education-module-ai
Version:
AI Education Module using Agent Framework
142 lines (141 loc) • 4.94 kB
JavaScript
;
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();