UNPKG

@memberjunction/actions-bizapps-lms

Version:

LMS system integration actions for MemberJunction

255 lines 10.8 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.UpdateUserProgressAction = void 0; const global_1 = require("@memberjunction/global"); const learnworlds_base_action_1 = require("../learnworlds-base.action"); const actions_1 = require("@memberjunction/actions"); /** * Action to update a user's course progress in LearnWorlds */ let UpdateUserProgressAction = class UpdateUserProgressAction extends learnworlds_base_action_1.LearnWorldsBaseAction { /** * Update user progress for a course or lesson */ async InternalRunAction(params) { const { Params, ContextUser } = params; this.params = Params; // Set params for base class to use try { // Extract and validate parameters const userId = this.getParamValue(Params, 'UserID'); const courseId = this.getParamValue(Params, 'CourseID'); const lessonId = this.getParamValue(Params, 'LessonID'); const progressPercentage = this.getParamValue(Params, 'ProgressPercentage'); const completed = this.getParamValue(Params, 'Completed'); const timeSpent = this.getParamValue(Params, 'TimeSpent'); const score = this.getParamValue(Params, 'Score'); const notes = this.getParamValue(Params, 'Notes'); if (!userId) { return { Success: false, ResultCode: 'VALIDATION_ERROR', Message: 'UserID is required', Params }; } if (!courseId) { return { Success: false, ResultCode: 'VALIDATION_ERROR', Message: 'CourseID is required', Params }; } // Get current enrollment first let currentEnrollment; try { currentEnrollment = await this.makeLearnWorldsRequest(`users/${userId}/enrollments/${courseId}`, 'GET', undefined, ContextUser); } catch (error) { return { Success: false, ResultCode: 'NOT_ENROLLED', Message: 'User is not enrolled in this course', Params }; } let updateResult = {}; // Update lesson progress if lessonId is provided if (lessonId) { const lessonProgressData = { completed: completed !== undefined ? completed : false, progress_percentage: progressPercentage }; if (timeSpent !== undefined) { lessonProgressData.time_spent = timeSpent; } if (score !== undefined) { lessonProgressData.score = score; } if (notes) { lessonProgressData.notes = notes; } try { const lessonUpdateData = await this.makeLearnWorldsRequest(`users/${userId}/courses/${courseId}/lessons/${lessonId}/progress`, 'PUT', lessonProgressData, ContextUser); updateResult.lessonProgress = lessonUpdateData; } catch (error) { return { Success: false, ResultCode: 'UPDATE_FAILED', Message: error instanceof Error ? error.message : 'Failed to update lesson progress', Params }; } } // Update overall course progress if progressPercentage is provided at course level if (progressPercentage !== undefined && !lessonId) { const courseProgressData = { progress_percentage: progressPercentage }; if (completed !== undefined) { courseProgressData.completed = completed; } if (timeSpent !== undefined) { courseProgressData.total_time_spent = (currentEnrollment.total_time_spent || 0) + timeSpent; } try { const courseUpdateData = await this.makeLearnWorldsRequest(`users/${userId}/enrollments/${courseId}/progress`, 'PUT', courseProgressData, ContextUser); updateResult.courseProgress = courseUpdateData; } catch (error) { return { Success: false, ResultCode: 'UPDATE_FAILED', Message: error instanceof Error ? error.message : 'Failed to update course progress', Params }; } } // Get updated enrollment details let updatedProgress = currentEnrollment; try { updatedProgress = await this.makeLearnWorldsRequest(`users/${userId}/enrollments/${courseId}`, 'GET', undefined, ContextUser); } catch (error) { // If we can't get updated details, use current enrollment console.warn('Failed to get updated enrollment details:', error); } // Format progress details const progressDetails = { userId: userId, courseId: courseId, lessonId: lessonId, previousProgress: { percentage: currentEnrollment.progress_percentage || 0, completedUnits: currentEnrollment.completed_units || 0, totalTimeSpent: currentEnrollment.total_time_spent || 0 }, updatedProgress: { percentage: updatedProgress.progress_percentage || 0, completedUnits: updatedProgress.completed_units || 0, totalUnits: updatedProgress.total_units || 0, totalTimeSpent: updatedProgress.total_time_spent || 0, totalTimeSpentText: this.formatDuration(updatedProgress.total_time_spent || 0), lastAccessedAt: updatedProgress.last_accessed_at || new Date().toISOString(), completed: updatedProgress.completed || false, completedAt: updatedProgress.completed_at }, updateType: lessonId ? 'lesson' : 'course', updateResult: updateResult }; // Create summary const summary = { userId: userId, courseId: courseId, lessonId: lessonId, progressIncreased: (updatedProgress.progress_percentage || 0) > (currentEnrollment.progress_percentage || 0), previousPercentage: currentEnrollment.progress_percentage || 0, newPercentage: updatedProgress.progress_percentage || 0, timeAdded: timeSpent || 0, totalTimeSpent: updatedProgress.total_time_spent || 0, isCompleted: updatedProgress.completed || false, updateType: progressDetails.updateType }; // Update output parameters const outputParams = [...Params]; const progressDetailsParam = outputParams.find(p => p.Name === 'ProgressDetails'); if (progressDetailsParam) progressDetailsParam.Value = progressDetails; const summaryParam = outputParams.find(p => p.Name === 'Summary'); if (summaryParam) summaryParam.Value = summary; return { Success: true, ResultCode: 'SUCCESS', Message: `Successfully updated ${progressDetails.updateType} progress`, Params: outputParams }; } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; return { Success: false, ResultCode: 'ERROR', Message: `Error updating progress: ${errorMessage}`, Params }; } } /** * Define the parameters this action expects */ get Params() { const baseParams = this.getCommonLMSParams(); const specificParams = [ { Name: 'UserID', Type: 'Input', Value: null }, { Name: 'CourseID', Type: 'Input', Value: null }, { Name: 'LessonID', Type: 'Input', Value: null }, { Name: 'ProgressPercentage', Type: 'Input', Value: null }, { Name: 'Completed', Type: 'Input', Value: null }, { Name: 'TimeSpent', Type: 'Input', Value: null }, { Name: 'Score', Type: 'Input', Value: null }, { Name: 'Notes', Type: 'Input', Value: null }, { Name: 'ProgressDetails', Type: 'Output', Value: null }, { Name: 'Summary', Type: 'Output', Value: null } ]; return [...baseParams, ...specificParams]; } /** * Metadata about this action */ get Description() { return 'Updates a user\'s progress for a course or specific lesson in LearnWorlds'; } }; exports.UpdateUserProgressAction = UpdateUserProgressAction; exports.UpdateUserProgressAction = UpdateUserProgressAction = __decorate([ (0, global_1.RegisterClass)(actions_1.BaseAction, 'UpdateUserProgressAction') ], UpdateUserProgressAction); //# sourceMappingURL=update-user-progress.action.js.map