UNPKG

@memberjunction/actions-bizapps-lms

Version:

LMS system integration actions for MemberJunction

234 lines (211 loc) 7.97 kB
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 */ @RegisterClass(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'; } }