All files / learning/schemas assessment.schema.ts

100% Statements 45/45
77.27% Branches 34/44
100% Functions 0/0
100% Lines 37/37

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 961x 1x     1x   1x     1x     1x     1x 1x     1x   1x     1x     1x     1x     1x     1x     1x     1x 1x     1x   1x     1x     1x     1x     1x     1x     1x 1x     1x   1x     1x     1x     1x     1x     1x     1x     1x 1x  
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document, Schema as MongooseSchema } from 'mongoose';
 
@Schema({ timestamps: true, collection: 'learning_question_banks' })
export class AssessmentQuestionBank extends Document {
  @Prop({ type: MongooseSchema.Types.ObjectId, required: true, index: true })
  tenantId: MongooseSchema.Types.ObjectId;
 
  @Prop({ required: true })
  topic: string;
 
  @Prop()
  description: string;
}
 
export const AssessmentQuestionBankSchema = SchemaFactory.createForClass(AssessmentQuestionBank);
AssessmentQuestionBankSchema.index({ tenantId: 1 });
 
@Schema({ timestamps: true, collection: 'learning_questions' })
export class AssessmentQuestion extends Document {
  @Prop({ type: MongooseSchema.Types.ObjectId, required: true, index: true })
  tenantId: MongooseSchema.Types.ObjectId;
 
  @Prop({ type: MongooseSchema.Types.ObjectId, ref: 'AssessmentQuestionBank', required: true, index: true })
  bankId: MongooseSchema.Types.ObjectId;
 
  @Prop({ required: true })
  questionText: string;
 
  @Prop({ default: 'single_choice', enum: ['single_choice', 'multiple_choice', 'true_false', 'short_answer'] })
  questionType: string;
 
  @Prop({ type: [String], required: true })
  options: string[];
 
  @Prop({ type: [Number], required: true }) // Indexes of correct options
  correctOptionIndexes: number[];
 
  @Prop({ default: 10 })
  points: number;
}
 
export const AssessmentQuestionSchema = SchemaFactory.createForClass(AssessmentQuestion);
AssessmentQuestionSchema.index({ tenantId: 1, bankId: 1 });
 
@Schema({ timestamps: true, collection: 'learning_assessments' })
export class LearningAssessment extends Document {
  @Prop({ type: MongooseSchema.Types.ObjectId, required: true, index: true })
  tenantId: MongooseSchema.Types.ObjectId;
 
  @Prop({ type: MongooseSchema.Types.ObjectId, ref: 'Course', required: true, index: true })
  courseId: MongooseSchema.Types.ObjectId;
 
  @Prop({ required: true })
  title: string;
 
  @Prop({ type: [MongooseSchema.Types.ObjectId], ref: 'AssessmentQuestion', required: true })
  questionsList: MongooseSchema.Types.ObjectId[];
 
  @Prop({ default: 80 })
  passingScorePercentage: number;
 
  @Prop({ default: 60 })
  timeLimitMinutes: number;
}
 
export const LearningAssessmentSchema = SchemaFactory.createForClass(LearningAssessment);
LearningAssessmentSchema.index({ tenantId: 1, courseId: 1 });
 
@Schema({ timestamps: true, collection: 'learning_assessment_attempts' })
export class AssessmentAttempt extends Document {
  @Prop({ type: MongooseSchema.Types.ObjectId, required: true, index: true })
  tenantId: MongooseSchema.Types.ObjectId;
 
  @Prop({ type: MongooseSchema.Types.ObjectId, ref: 'LearningAssessment', required: true, index: true })
  assessmentId: MongooseSchema.Types.ObjectId;
 
  @Prop({ type: MongooseSchema.Types.ObjectId, ref: 'Employee', required: true, index: true })
  employeeId: MongooseSchema.Types.ObjectId;
 
  @Prop({ type: MongooseSchema.Types.Mixed }) // map questionId -> selectedOptionIndexes
  answersSubmitted: Record<string, number[]>;
 
  @Prop({ default: 0 })
  scorePercentage: number;
 
  @Prop({ default: false })
  passed: boolean;
 
  @Prop({ default: 'completed', enum: ['in_progress', 'completed'] })
  status: string;
}
 
export const AssessmentAttemptSchema = SchemaFactory.createForClass(AssessmentAttempt);
AssessmentAttemptSchema.index({ tenantId: 1, employeeId: 1, assessmentId: 1 });