@memberjunction/actions-bizapps-lms
Version:
LMS system integration actions for MemberJunction
234 lines (211 loc) • 7.97 kB
text/typescript
import { RegisterClass } from '@memberjunction/global';
import { LearnWorldsBaseAction } from '../learnworlds-base.action';
import { ActionParam, ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
import { BaseAction } from '@memberjunction/actions';
/**
* Action to enroll a user in a LearnWorlds course
*/
(BaseAction, 'EnrollUserAction')
export class EnrollUserAction extends LearnWorldsBaseAction {
/**
* Enroll a user in a course
*/
public async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
const { Params, ContextUser } = params;
this.params = Params;
try {
// Extract and validate parameters
const userId = this.getParamValue(Params, 'UserID');
const courseId = this.getParamValue(Params, 'CourseID');
const price = this.getParamValue(Params, 'Price') || 0;
const justification = this.getParamValue(Params, 'Justification') || 'API Enrollment';
const notifyUser = this.getParamValue(Params, 'NotifyUser') !== false;
const startDate = this.getParamValue(Params, 'StartDate');
const expiryDate = this.getParamValue(Params, 'ExpiryDate');
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
};
}
// Prepare enrollment data
const enrollmentData: any = {
user_id: userId,
justification: justification,
price: price,
notify_user: notifyUser
};
if (startDate) {
enrollmentData.starts_at = new Date(startDate).toISOString();
}
if (expiryDate) {
enrollmentData.expires_at = new Date(expiryDate).toISOString();
}
// Create enrollment
const enrollmentResponse = await this.makeLearnWorldsRequest(
`/courses/${courseId}/enrollments`,
'POST',
enrollmentData,
ContextUser
);
if (!enrollmentResponse.success) {
return {
Success: false,
ResultCode: 'API_ERROR',
Message: enrollmentResponse.message || 'Failed to enroll user',
Params
};
}
const enrollment = enrollmentResponse.data;
// Format enrollment details
const enrollmentDetails = {
id: enrollment.id,
userId: enrollment.user_id || userId,
courseId: enrollment.course_id || courseId,
enrolledAt: enrollment.enrolled_at || enrollment.created_at,
startsAt: enrollment.starts_at,
expiresAt: enrollment.expires_at,
status: enrollment.status || 'active',
price: enrollment.price || price,
progress: {
percentage: enrollment.progress_percentage || 0,
completedUnits: enrollment.completed_units || 0,
totalUnits: enrollment.total_units || 0,
lastAccessedAt: enrollment.last_accessed_at
},
certificateEligible: enrollment.certificate_eligible || false,
certificateIssuedAt: enrollment.certificate_issued_at
};
// Get course and user details for summary
let courseTitle = 'Unknown Course';
let userName = 'Unknown User';
// Try to get course details
const courseResponse = await this.makeLearnWorldsRequest(
`/courses/${courseId}`,
'GET',
null,
ContextUser
);
if (courseResponse.success && courseResponse.data) {
courseTitle = courseResponse.data.title || courseTitle;
}
// Try to get user details
const userResponse = await this.makeLearnWorldsRequest(
`/users/${userId}`,
'GET',
null,
ContextUser
);
if (userResponse.success && userResponse.data) {
const user = userResponse.data;
userName = user.email || user.username || userName;
}
// Create summary
const summary = {
enrollmentId: enrollmentDetails.id,
userId: userId,
userName: userName,
courseId: courseId,
courseTitle: courseTitle,
enrolledAt: enrollmentDetails.enrolledAt,
status: enrollmentDetails.status,
price: enrollmentDetails.price,
notificationSent: notifyUser
};
// Update output parameters
const outputParams = [...Params];
const enrollmentDetailsParam = outputParams.find(p => p.Name === 'EnrollmentDetails');
if (enrollmentDetailsParam) {
enrollmentDetailsParam.Value = enrollmentDetails;
}
const summaryParam = outputParams.find(p => p.Name === 'Summary');
if (summaryParam) {
summaryParam.Value = summary;
}
return {
Success: true,
ResultCode: 'SUCCESS',
Message: `Successfully enrolled user ${userName} in course ${courseTitle}`,
Params: outputParams
};
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
return {
Success: false,
ResultCode: 'EXECUTION_ERROR',
Message: `Error enrolling user: ${errorMessage}`,
Params
};
}
}
/**
* Define the parameters this action expects
*/
public get Params(): ActionParam[] {
const baseParams = this.getCommonLMSParams();
const specificParams: ActionParam[] = [
{
Name: 'UserID',
Type: 'Input',
Value: null
},
{
Name: 'CourseID',
Type: 'Input',
Value: null
},
{
Name: 'Price',
Type: 'Input',
Value: 0
},
{
Name: 'Justification',
Type: 'Input',
Value: 'API Enrollment'
},
{
Name: 'NotifyUser',
Type: 'Input',
Value: true
},
{
Name: 'StartDate',
Type: 'Input',
Value: null
},
{
Name: 'ExpiryDate',
Type: 'Input',
Value: null
},
{
Name: 'EnrollmentDetails',
Type: 'Output',
Value: null
},
{
Name: 'Summary',
Type: 'Output',
Value: null
}
];
return [...baseParams, ...specificParams];
}
/**
* Metadata about this action
*/
public get Description(): string {
return 'Enrolls a user in a LearnWorlds course with optional pricing and notification settings';
}
}