From 3a54f95ca56d40713c625e6200ac671e495f573a Mon Sep 17 00:00:00 2001 From: souravbhowmik1999 Date: Tue, 4 Nov 2025 21:25:38 +0530 Subject: [PATCH 1/2] Assessment search status without courseId and courseId --- .../tracking_assessment.service.ts | 55 ++++++++++++------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/src/modules/tracking_assessment/tracking_assessment.service.ts b/src/modules/tracking_assessment/tracking_assessment.service.ts index 6d9e4f4..d68f166 100644 --- a/src/modules/tracking_assessment/tracking_assessment.service.ts +++ b/src/modules/tracking_assessment/tracking_assessment.service.ts @@ -657,31 +657,51 @@ export class TrackingAssessmentService { contentId_text = `${contentId_text},'${contentId}'`; } } - //courseId + + //courseId - optional let courseIdArray = searchFilter?.courseId; let courseId_text = ''; - for (let i = 0; i < courseIdArray.length; i++) { - let courseId = courseIdArray[i]; - if (i == 0) { - courseId_text = `${courseId_text}'${courseId}'`; - } else { - courseId_text = `${courseId_text},'${courseId}'`; + let hasCourseId = courseIdArray && courseIdArray.length > 0; + if (hasCourseId) { + for (let i = 0; i < courseIdArray.length; i++) { + let courseId = courseIdArray[i]; + if (i == 0) { + courseId_text = `${courseId_text}'${courseId}'`; + } else { + courseId_text = `${courseId_text},'${courseId}'`; + } } } - //unitId + + //unitId - optional let unitIdArray = searchFilter?.unitId; let unitId_text = ''; - for (let i = 0; i < unitIdArray.length; i++) { - let unitId = unitIdArray[i]; - if (i == 0) { - unitId_text = `${unitId_text}'${unitId}'`; - } else { - unitId_text = `${unitId_text},'${unitId}'`; + let hasUnitId = unitIdArray && unitIdArray.length > 0; + if (hasUnitId) { + for (let i = 0; i < unitIdArray.length; i++) { + let unitId = unitIdArray[i]; + if (i == 0) { + unitId_text = `${unitId_text}'${unitId}'`; + } else { + unitId_text = `${unitId_text},'${unitId}'`; + } } } + let userIdArray = searchFilter?.userId; for (let i = 0; i < userIdArray.length; i++) { let userId = userIdArray[i]; + + // Build dynamic WHERE clause + let whereConditions = `"evaluatedBy" IS DISTINCT FROM 'AI' AND "userId" = $1`; + if (hasCourseId) { + whereConditions += ` AND "courseId" IN (${courseId_text})`; + } + if (hasUnitId) { + whereConditions += ` AND "unitId" IN (${unitId_text})`; + } + whereConditions += ` AND "contentId" IN (${contentId_text}) AND "tenantId" = $2`; + const result = await this.dataSource.query( `WITH latest_assessment AS ( SELECT @@ -702,12 +722,7 @@ export class TrackingAssessmentService { FROM assessment_tracking WHERE - "evaluatedBy" IS DISTINCT FROM 'AI' AND - "userId" = $1 - AND "courseId" IN (${courseId_text}) - AND "unitId" IN (${unitId_text}) - AND "contentId" IN (${contentId_text}) - AND "tenantId" = $2 + ${whereConditions} ) SELECT "assessmentTrackingId", From 4029f705c8fcac84eea49e25ab7837dcb4ffe465 Mon Sep 17 00:00:00 2001 From: souravbhowmik1999 Date: Mon, 24 Nov 2025 17:56:26 +0530 Subject: [PATCH 2/2] send evaluatedBy column to kafka --- .../dto/tracking-assessment-create-dto.ts | 20 +++++++++++++------ .../dto/tracking-assessment-search-dto.ts | 13 ++++++++++++ .../entities/tracking-assessment-entity.ts | 6 +++++- .../tracking_assessment.service.ts | 8 +++++--- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/modules/tracking_assessment/dto/tracking-assessment-create-dto.ts b/src/modules/tracking_assessment/dto/tracking-assessment-create-dto.ts index 2d2b0f8..db498ce 100644 --- a/src/modules/tracking_assessment/dto/tracking-assessment-create-dto.ts +++ b/src/modules/tracking_assessment/dto/tracking-assessment-create-dto.ts @@ -6,9 +6,16 @@ import { IsUUID, IsArray, IsOptional, + IsEnum, } from 'class-validator'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +export enum EvaluationType { + AI = 'AI', + ONLINE = 'Online', + MANUAL = 'Manual', +} + export class CreateAssessmentTrackingDto { @Expose() assessmentTrackingId: string; @@ -114,8 +121,14 @@ export class CreateAssessmentTrackingDto { @IsOptional() submitedBy: string; - @IsString() + @ApiPropertyOptional({ + enum: EvaluationType, + description: 'Evaluation type: AI, Online, or Manual', + }) @IsOptional() + @IsEnum(EvaluationType, { + message: 'evaluatedBy must be one of: AI, Online, Manual', + }) evaluatedBy?: EvaluationType; constructor(obj?: Partial) { @@ -124,8 +137,3 @@ export class CreateAssessmentTrackingDto { } } } -export enum EvaluationType { - AI = 'AI', - ONLINE = 'Online', - MANUAL = 'Manual', -} diff --git a/src/modules/tracking_assessment/dto/tracking-assessment-search-dto.ts b/src/modules/tracking_assessment/dto/tracking-assessment-search-dto.ts index 1567f86..0812fb7 100644 --- a/src/modules/tracking_assessment/dto/tracking-assessment-search-dto.ts +++ b/src/modules/tracking_assessment/dto/tracking-assessment-search-dto.ts @@ -6,11 +6,13 @@ import { IsUUID, IsObject, IsOptional, + IsEnum, ValidationOptions, registerDecorator, ValidationArguments, } from "class-validator"; import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; +import { EvaluationType } from "./tracking-assessment-create-dto"; export class setFilters { @@ -64,6 +66,17 @@ export class setFilters { @IsOptional() @IsNotEmpty() contentId: string; + + @ApiPropertyOptional({ + enum: EvaluationType, + description: "Evaluation type: AI, Online, or Manual", + }) + @Expose() + @IsOptional() + @IsEnum(EvaluationType, { + message: 'evaluatedBy must be one of: AI, Online, Manual', + }) + evaluatedBy?: EvaluationType; } export class paginationDto { diff --git a/src/modules/tracking_assessment/entities/tracking-assessment-entity.ts b/src/modules/tracking_assessment/entities/tracking-assessment-entity.ts index 3cc68b9..912ca21 100644 --- a/src/modules/tracking_assessment/entities/tracking-assessment-entity.ts +++ b/src/modules/tracking_assessment/entities/tracking-assessment-entity.ts @@ -63,7 +63,11 @@ export class AssessmentTracking { showFlag: boolean; @IsOptional() - @Column() + @Column({ + type: 'enum', + enum: EvaluationType, + nullable: true, + }) @IsEnum(EvaluationType, { message: 'evaluatedBy must be one of: AI, Online, Manual', }) diff --git a/src/modules/tracking_assessment/tracking_assessment.service.ts b/src/modules/tracking_assessment/tracking_assessment.service.ts index d68f166..2d218f0 100644 --- a/src/modules/tracking_assessment/tracking_assessment.service.ts +++ b/src/modules/tracking_assessment/tracking_assessment.service.ts @@ -510,7 +510,7 @@ export class TrackingAssessmentService { let output_result = []; const result = await this.dataSource.query( - `SELECT "assessmentTrackingId","userId","courseId","contentId","attemptId","createdOn","lastAttemptedOn","totalMaxScore","totalScore","updatedOn","timeSpent","unitId","tenantId" FROM assessment_tracking WHERE "userId"=$1 and "contentId"=$2 and "courseId"=$3 and "unitId"=$4 and "tenantId"=$5`, + `SELECT "assessmentTrackingId","userId","courseId","contentId","attemptId","createdOn","lastAttemptedOn","totalMaxScore","totalScore","updatedOn","timeSpent","unitId","tenantId","evaluatedBy" FROM assessment_tracking WHERE "userId"=$1 and "contentId"=$2 and "courseId"=$3 and "unitId"=$4 and "tenantId"=$5`, [ searchFilter?.userId, searchFilter?.contentId, @@ -585,7 +585,7 @@ export class TrackingAssessmentService { conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : ''; const result = await this.dataSource.query( - `SELECT "assessmentTrackingId", "userId", "courseId", "contentId", "attemptId", "createdOn", "lastAttemptedOn", "totalMaxScore", "totalScore", "updatedOn", "timeSpent", "unitId" + `SELECT "assessmentTrackingId", "userId", "courseId", "contentId", "attemptId", "createdOn", "lastAttemptedOn", "totalMaxScore", "totalScore", "updatedOn", "timeSpent", "unitId", "tenantId", "evaluatedBy" FROM assessment_tracking ${whereClause}`, params, ); @@ -718,6 +718,7 @@ export class TrackingAssessmentService { "timeSpent", "unitId", "tenantId", + "evaluatedBy", ROW_NUMBER() OVER (PARTITION BY "userId", "courseId", "unitId", "contentId" ORDER BY CAST("totalScore" AS INTEGER) DESC) as row_num FROM assessment_tracking @@ -737,7 +738,8 @@ export class TrackingAssessmentService { "updatedOn", "timeSpent", "unitId", - "tenantId" + "tenantId", + "evaluatedBy" FROM latest_assessment WHERE