From a7f0b0dd6230cd02429cad7a6ad40134cc5ec4e0 Mon Sep 17 00:00:00 2001 From: souravbhowmik1999 Date: Mon, 27 Oct 2025 17:07:06 +0530 Subject: [PATCH 1/3] Answer Sheet Submissions - Parent ID Feature Specification --- migrations/add_performance_indexes.sql | 65 ------------------- migrations/rollback_performance_indexes.sql | 34 ---------- .../answer_sheet_submissions.service.ts | 28 +++++++- .../answer-sheet-submissions-create-dto.ts | 4 ++ .../answer-sheet-submissions-entity.ts | 3 + 5 files changed, 34 insertions(+), 100 deletions(-) delete mode 100644 migrations/add_performance_indexes.sql delete mode 100644 migrations/rollback_performance_indexes.sql diff --git a/migrations/add_performance_indexes.sql b/migrations/add_performance_indexes.sql deleted file mode 100644 index 560c341..0000000 --- a/migrations/add_performance_indexes.sql +++ /dev/null @@ -1,65 +0,0 @@ --- Migration: Add performance indexes for content tracking --- Purpose: Optimize searchStatusCourseTracking endpoint performance --- Date: 2025-10-10 - --- ===================================================== --- Indexes for content_tracking table --- ===================================================== - --- Composite index for main query filter (userId + courseId + tenantId) -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_user_course_tenant -ON content_tracking ("userId", "courseId", "tenantId"); - --- Index for filtering by user and tenant -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_user_tenant -ON content_tracking ("userId", "tenantId"); - --- Index for filtering by course and tenant -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_course_tenant -ON content_tracking ("courseId", "tenantId"); - --- Index for ordering by created date -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_created_on -ON content_tracking ("createdOn"); - --- ===================================================== --- Indexes for content_tracking_details table --- ===================================================== - --- Index for JOIN with content_tracking -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_details_tracking_id -ON content_tracking_details ("contentTrackingId"); - --- Index for filtering by userId -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_details_user_id -ON content_tracking_details ("userId"); - --- Index for filtering by event id (eid) - used to determine status -CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_content_tracking_details_eid -ON content_tracking_details ("eid"); - --- ===================================================== --- Verify indexes were created --- ===================================================== - --- Run this query to verify all indexes: --- SELECT --- schemaname, --- tablename, --- indexname, --- indexdef --- FROM pg_indexes --- WHERE tablename IN ('content_tracking', 'content_tracking_details') --- ORDER BY tablename, indexname; - --- ===================================================== --- Performance Notes --- ===================================================== --- These indexes will significantly improve query performance by: --- 1. Enabling efficient filtering on userId + courseId + tenantId combinations --- 2. Speeding up JOINs between content_tracking and content_tracking_details --- 3. Optimizing status determination by indexing the 'eid' field --- 4. Supporting ORDER BY operations on createdOn --- --- Expected improvement: 50+ seconds → 1-2 seconds for typical queries --- ===================================================== diff --git a/migrations/rollback_performance_indexes.sql b/migrations/rollback_performance_indexes.sql deleted file mode 100644 index 32ecf9c..0000000 --- a/migrations/rollback_performance_indexes.sql +++ /dev/null @@ -1,34 +0,0 @@ --- Rollback Migration: Remove performance indexes for content tracking --- Purpose: Rollback the performance optimization indexes if needed --- Date: 2025-10-10 - --- ===================================================== --- Drop indexes for content_tracking table --- ===================================================== - -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_user_course_tenant; -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_user_tenant; -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_course_tenant; -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_created_on; - --- ===================================================== --- Drop indexes for content_tracking_details table --- ===================================================== - -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_details_tracking_id; -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_details_user_id; -DROP INDEX CONCURRENTLY IF EXISTS idx_content_tracking_details_eid; - --- ===================================================== --- Verify indexes were dropped --- ===================================================== - --- Run this query to verify indexes were removed: --- SELECT --- schemaname, --- tablename, --- indexname, --- indexdef --- FROM pg_indexes --- WHERE tablename IN ('content_tracking', 'content_tracking_details') --- ORDER BY tablename, indexname; diff --git a/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts b/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts index f5c6f31..fe2f995 100644 --- a/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts +++ b/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts @@ -19,6 +19,7 @@ import { SubmitAssessmentToAiDto } from '../ai_assessment/dto/submit_assessment_ type TrackerInsertObject = { questionSetId: string; userId: string; + parentId?: string; fileUrls: string[]; status: 'RECEIVED' | 'PROCESSING' | 'COMPLETED' | 'FAILED'; metadata: Record; @@ -220,6 +221,7 @@ export class AnswerSheetSubmissionsService { 'Answer Sheet submitted successfully.', ); } catch (e) { + console.log('error -->>', e); const errorMessage = e.message || 'Internal Server Error'; this.loggerService.error( 'Something went wrong in Answer Sheet Submission' + @@ -246,9 +248,16 @@ export class AnswerSheetSubmissionsService { const urlObj = new URL(url); return urlObj.pathname.slice(1); // removes the leading '/' }); + + // Handle parentId logic: If not provided or empty, use questionSetId + const parentId = input.parentId && input.parentId.trim() !== '' + ? input.parentId + : input.questionSetId; + return { questionSetId: input.questionSetId, userId: input.userId, + parentId: parentId, fileUrls: fileUrls, status: 'RECEIVED', metadata: input.metadata, @@ -388,6 +397,11 @@ export class AnswerSheetSubmissionsService { params.push(searchFilter.questionSetId); } + if (searchFilter?.parentId) { + conditions.push(`"parent_id" = $${params.length + 1}`); + params.push(searchFilter.parentId); + } + if (searchFilter?.status) { conditions.push(`"status" = $${params.length + 1}`); params.push(searchFilter.status); @@ -402,10 +416,22 @@ export class AnswerSheetSubmissionsService { params, ); + // Transform parent_id to parentId for camelCase consistency + const transformedResult = result.map(row => { + if (row.parent_id !== undefined) { + const { parent_id, ...rest } = row; + return { + ...rest, + parentId: parent_id + }; + } + return row; + }); + return response.status(200).send({ success: true, message: 'success', - data: result, + data: transformedResult, }); } catch (error) { const errorMessage = error.message || 'Internal Server Error'; diff --git a/src/modules/answer_sheet_submissions/dto/answer-sheet-submissions-create-dto.ts b/src/modules/answer_sheet_submissions/dto/answer-sheet-submissions-create-dto.ts index 8262507..538cd37 100644 --- a/src/modules/answer_sheet_submissions/dto/answer-sheet-submissions-create-dto.ts +++ b/src/modules/answer_sheet_submissions/dto/answer-sheet-submissions-create-dto.ts @@ -36,6 +36,10 @@ export class AnswerSheetSubmissionsCreateDto { @IsString() questionSetId: string; + @IsOptional() + @IsString() + parentId?: string; + @IsArray() @IsString({ each: true }) fileUrls: string[]; diff --git a/src/modules/answer_sheet_submissions/entities/answer-sheet-submissions-entity.ts b/src/modules/answer_sheet_submissions/entities/answer-sheet-submissions-entity.ts index 745b572..37ea199 100644 --- a/src/modules/answer_sheet_submissions/entities/answer-sheet-submissions-entity.ts +++ b/src/modules/answer_sheet_submissions/entities/answer-sheet-submissions-entity.ts @@ -17,6 +17,9 @@ export class AnswerSheetSubmissions { @Column({ name: 'question_set_id' }) questionSetId: string; + @Column({ name: 'parent_id', type: 'text', nullable: true }) + parentId: string; + @Column('text', { array: true, name: 'file_urls' }) fileUrls: string[]; From 6ce6b9a8f609caa2ac26c58c5d1435b0e5901faf Mon Sep 17 00:00:00 2001 From: souravbhowmik1999 Date: Tue, 28 Oct 2025 17:08:52 +0530 Subject: [PATCH 2/3] remove transformedResult --- .../answer_sheet_submissions.service.ts | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts b/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts index fe2f995..ab9acf6 100644 --- a/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts +++ b/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts @@ -416,22 +416,10 @@ export class AnswerSheetSubmissionsService { params, ); - // Transform parent_id to parentId for camelCase consistency - const transformedResult = result.map(row => { - if (row.parent_id !== undefined) { - const { parent_id, ...rest } = row; - return { - ...rest, - parentId: parent_id - }; - } - return row; - }); - return response.status(200).send({ success: true, message: 'success', - data: transformedResult, + data: result, }); } catch (error) { const errorMessage = error.message || 'Internal Server Error'; From c4b220a80e2d20f6b7af1ec59b0d980719509fd7 Mon Sep 17 00:00:00 2001 From: souravbhowmik1999 Date: Tue, 28 Oct 2025 17:10:46 +0530 Subject: [PATCH 3/3] remove log --- .../answer_sheet_submissions/answer_sheet_submissions.service.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts b/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts index ab9acf6..fc156f6 100644 --- a/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts +++ b/src/modules/answer_sheet_submissions/answer_sheet_submissions.service.ts @@ -221,7 +221,6 @@ export class AnswerSheetSubmissionsService { 'Answer Sheet submitted successfully.', ); } catch (e) { - console.log('error -->>', e); const errorMessage = e.message || 'Internal Server Error'; this.loggerService.error( 'Something went wrong in Answer Sheet Submission' +