File

apps/recallassess/recallassess-api/src/api/client/learning/dto/learning.dto.ts

Index

Properties

Properties

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"
}

results matching ""

    No results matching ""