@memberjunction/actions-bizapps-lms
Version:
LMS system integration actions for MemberJunction
255 lines • 10.8 kB
JavaScript
;
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