@memberjunction/actions-bizapps-lms
Version:
LMS system integration actions for MemberJunction
140 lines (121 loc) • 4.75 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';
import { UserInfo } from '@memberjunction/core';
import { GetBundlesParams, GetBundlesResult, LearnWorldsBundle } from '../interfaces';
/**
* Raw bundle shape returned by the LearnWorlds API
*/
interface LWApiBundle {
id?: string;
_id?: string;
title?: string;
description?: string;
price?: number;
currency?: string;
courses?: string[];
is_active?: boolean;
created?: string | number;
created_at?: string;
updated?: string | number;
updated_at?: string;
thumbnail_url?: string;
image?: string;
total_courses?: number;
total_enrollments?: number;
students_count?: number;
}
/**
* Action to retrieve bundles from LearnWorlds
*/
(BaseAction, 'GetBundlesAction')
export class GetBundlesAction extends LearnWorldsBaseAction {
/**
* Retrieves bundles from LearnWorlds with optional search filtering.
*/
public async GetBundles(params: GetBundlesParams, contextUser: UserInfo): Promise<GetBundlesResult> {
this.SetCompanyContext(params.CompanyID);
const queryParams = this.buildBundleQueryParams(params);
const rawBundles = await this.makeLearnWorldsPaginatedRequest<LWApiBundle>('bundles', queryParams, contextUser);
const bundles = rawBundles.map((b) => this.mapApiBundle(b));
return {
Bundles: bundles,
TotalCount: bundles.length,
};
}
/**
* Builds query parameters for the bundles API request
*/
private buildBundleQueryParams(params: GetBundlesParams): Record<string, string | number | boolean> {
const queryParams: Record<string, string | number | boolean> = {};
if (params.SearchText) {
queryParams.search = params.SearchText;
}
if (params.MaxResults) {
queryParams.limit = Math.min(params.MaxResults, 100);
}
return queryParams;
}
/**
* Maps a raw LearnWorlds API bundle to the standard LearnWorldsBundle interface
*/
private mapApiBundle(raw: LWApiBundle): LearnWorldsBundle {
const createdRaw = raw.created || raw.created_at || '';
const updatedRaw = raw.updated || raw.updated_at || '';
return {
id: raw.id || raw._id || '',
title: raw.title || '',
description: raw.description,
price: raw.price,
currency: raw.currency,
courses: raw.courses || [],
isActive: raw.is_active !== false,
createdAt: createdRaw ? this.parseLearnWorldsDate(createdRaw).toISOString() : '',
updatedAt: updatedRaw ? this.parseLearnWorldsDate(updatedRaw).toISOString() : '',
thumbnailUrl: raw.thumbnail_url || raw.image,
totalCourses: raw.total_courses || (raw.courses ? raw.courses.length : 0),
totalEnrollments: raw.total_enrollments || raw.students_count || 0,
};
}
/**
* Framework entry point that delegates to the typed public method
*/
protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
const { Params, ContextUser } = params;
this.params = Params;
try {
const bundleParams: GetBundlesParams = {
CompanyID: this.getRequiredStringParam(Params, 'CompanyID'),
SearchText: this.getOptionalStringParam(Params, 'SearchText'),
MaxResults: this.getOptionalNumberParam(Params, 'MaxResults', LearnWorldsBaseAction.LW_MAX_PAGE_SIZE),
};
const result = await this.GetBundles(bundleParams, ContextUser);
this.setOutputParam(Params, 'Bundles', result.Bundles);
this.setOutputParam(Params, 'TotalCount', result.TotalCount);
return this.buildSuccessResult(`Successfully retrieved ${result.TotalCount} bundle(s) from LearnWorlds`, Params);
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
return this.buildErrorResult('ERROR', `Error retrieving bundles: ${errorMessage}`, Params);
}
}
/**
* Define the parameters this action expects
*/
public get Params(): ActionParam[] {
const baseParams = this.getCommonLMSParams();
const specificParams: ActionParam[] = [
{ Name: 'SearchText', Type: 'Input', Value: null },
{ Name: 'MaxResults', Type: 'Input', Value: null },
{ Name: 'Bundles', Type: 'Output', Value: null },
{ Name: 'TotalCount', Type: 'Output', Value: null },
];
return [...baseParams, ...specificParams];
}
/**
* Metadata about this action
*/
public get Description(): string {
return 'Retrieves course bundles from LearnWorlds with optional search filtering';
}
}