File
|
Optional
blockingModuleSequence
|
Type : number
|
Decorators :
@Expose() @IsOptional() @IsInt()
|
|
|
|
Optional
blockingModuleTitle
|
Type : string
|
Decorators :
@Expose() @IsOptional() @IsString()
|
|
|
|
Optional
blockingPageSequence
|
Type : number
|
Decorators :
@Expose() @IsOptional() @IsInt()
|
|
|
|
Optional
firstIncompleteModuleSequence
|
Type : number
|
Decorators :
@Expose() @IsOptional() @IsInt()
|
|
|
|
Optional
firstIncompletePageSequence
|
Type : number
|
Decorators :
@Expose() @IsOptional() @IsInt()
|
|
|
|
isValid
|
Type : number
|
Decorators :
@Expose() @IsInt()
|
|
|
|
Optional
message
|
Type : string
|
Decorators :
@Expose() @IsOptional() @IsString()
|
|
|
import { ContentType } from "@prisma/client";
import { Exclude, Expose, Type } from "class-transformer";
import { IsEnum, IsInt, IsOptional, IsString } from "class-validator";
@Exclude()
export class CourseModuleDto {
@Expose()
@IsInt()
id!: number;
@Expose()
@IsString()
course_module_code!: string;
@Expose()
@IsString()
title!: string;
@Expose()
@IsOptional()
@IsString()
description?: string | null;
@Expose()
@IsOptional()
@IsString()
short_description?: string | null;
@Expose()
@IsInt()
sort_order!: number;
@Expose()
@IsOptional()
progress_percentage?: number | null;
@Expose()
@IsOptional()
status?: string;
@Expose()
@IsOptional()
@IsInt()
pages_completed?: number;
@Expose()
@IsOptional()
@IsInt()
total_pages?: number;
@Expose()
@IsOptional()
@IsString()
pre_bat_grade_level?: string | null; // PRE BAT assessment grade level for this module (FOUNDATION, INTERMEDIATE, ADVANCED, EXPERT) - for testing
}
@Exclude()
export class CourseModulePageMediaItemDto {
@Expose() id!: number;
@Expose() media_path!: string;
@Expose() media_name!: string;
@Expose() caption?: string | null;
@Expose() description?: string | null;
@Expose() original_filename?: string | null;
@Expose() file_extension?: string | null;
@Expose() mime_type?: string | null;
@Expose() media_size?: number | null;
}
@Exclude()
export class CourseModulePageDto {
@Expose()
@IsInt()
id!: number;
@Expose()
@IsInt()
course_module_id!: number;
@Expose()
@IsInt()
course_id!: number;
@Expose()
@IsString()
title!: string;
@Expose()
@IsOptional()
outline?: string | null;
@Expose()
@IsOptional()
topic_objectives?: string | null;
@Expose()
@IsOptional()
top_tips?: string | null;
@Expose()
@IsOptional()
@IsEnum(ContentType)
content_type?: ContentType;
@Expose()
@IsOptional()
@IsInt()
knowledge_review_id?: number | null;
@Expose()
@IsInt()
sort_order!: number;
@Expose()
@IsOptional()
@IsString()
time_frame?: string | null;
@Expose()
@IsOptional()
is_completed?: boolean;
@Expose()
@IsOptional()
is_locked?: boolean; // For trial packages - indicates if page is locked due to limit
@Expose()
@IsOptional()
@IsString()
module_title?: string;
@Expose()
@IsOptional()
@IsInt()
module_sort_order?: number;
@Expose()
@IsOptional()
@IsString()
quiz_difficulty_level?: string | null;
/** General per-page difficulty: FOUNDATION | INTERMEDIATE | ADVANCED | EXPERT. */
@Expose()
@IsOptional()
@IsString()
difficulty_level?: string | null;
@Expose()
@IsOptional()
@IsString()
pre_bat_grade_level?: string | null; // PRE BAT assessment grade level for this module (FOUNDATION, INTERMEDIATE, ADVANCED, EXPERT) - for testing
@Expose()
@IsOptional()
@Type(() => CourseModulePageMediaItemDto)
mediaPhotos?: CourseModulePageMediaItemDto[];
@Expose()
@IsOptional()
@Type(() => CourseModulePageMediaItemDto)
mediaVideos?: CourseModulePageMediaItemDto[];
@Expose()
@IsOptional()
@Type(() => CourseModulePageMediaItemDto)
mediaDocuments?: CourseModulePageMediaItemDto[];
@Expose()
@IsOptional()
knowledgeReview?: {
id: number;
title: string;
description?: string | null;
questions?: Array<{
id: number;
question_text: string;
question_type: string;
sort_order: number;
knowledgeReviewAnswers?: Array<{
id: number;
answer_text?: string | null;
is_correct: boolean;
sort_order: number;
}>;
}>;
} | null;
}
@Exclude()
export class PageSequenceInfoDto {
@Expose()
@IsInt()
moduleSequence!: number;
@Expose()
@IsInt()
pageSequence!: number;
@Expose()
@IsString()
moduleTitle!: string;
@Expose()
@IsInt()
totalModules!: number;
@Expose()
@IsInt()
totalPagesInModule!: number;
}
@Exclude()
export class PageAccessValidationDto {
@Expose()
@IsInt()
isValid!: number; // 1 for valid, 0 for invalid
@Expose()
@IsOptional()
@IsString()
message?: string;
@Expose()
@IsOptional()
@IsInt()
firstIncompleteModuleSequence?: number;
@Expose()
@IsOptional()
@IsInt()
firstIncompletePageSequence?: number;
@Expose()
@IsOptional()
@IsString()
blockingModuleTitle?: string;
@Expose()
@IsOptional()
@IsInt()
blockingModuleSequence?: number;
@Expose()
@IsOptional()
@IsInt()
blockingPageSequence?: number;
}
@Exclude()
export class FirstIncompletePageDto {
@Expose()
@IsInt()
moduleSequence!: number;
@Expose()
@IsInt()
pageSequence!: number;
@Expose()
@IsInt()
pageId!: number; // Page ID for direct URL access
@Expose()
@IsString()
url!: string; // Full URL path like "/portal/my-courses/10/learning/123"
}