diff --git a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-alerts.controller.ts b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-alerts.controller.ts index e33d3dd..998a6dc 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-alerts.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-alerts.controller.ts @@ -152,7 +152,7 @@ export class AdminAlertsController { @ApiResponse({ status: 403, description: 'Forbidden - Admin role required' }) async createAlert( @Body() createDto: CreateAlertDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user?.id || req.user?.sub; return this.alertsService.createAlert(createDto, userId); @@ -184,7 +184,7 @@ export class AdminAlertsController { async acknowledgeAlert( @Param('id') id: string, @Body() dto: AcknowledgeAlertDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user?.id || req.user?.sub; return this.alertsService.acknowledgeAlert(id, dto.acknowledgment_note, userId); @@ -216,7 +216,7 @@ export class AdminAlertsController { async resolveAlert( @Param('id') id: string, @Body() dto: ResolveAlertDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user?.id || req.user?.sub; return this.alertsService.resolveAlert(id, dto.resolution_note, userId); diff --git a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-bulk-operations.controller.ts b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-bulk-operations.controller.ts index 9c41099..b6faf99 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-bulk-operations.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-bulk-operations.controller.ts @@ -60,7 +60,7 @@ export class AdminBulkOperationsController { @ApiResponse({ status: 403, description: 'Forbidden - Admin access required' }) async bulkSuspendUsers( @Body() dto: BulkSuspendUsersDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user.sub; // JWT payload contiene sub = user.id return this.bulkOpsService.bulkSuspendUsers(dto, adminId); @@ -82,7 +82,7 @@ export class AdminBulkOperationsController { }) async bulkActivateUsers( @Body() dto: BulkActivateUsersDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user.sub; return this.bulkOpsService.bulkActivateUsers(dto, adminId); @@ -104,7 +104,7 @@ export class AdminBulkOperationsController { }) async bulkUpdateRole( @Body() dto: BulkUpdateRoleDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user.sub; return this.bulkOpsService.bulkUpdateRole(dto, adminId); @@ -126,7 +126,7 @@ export class AdminBulkOperationsController { }) async bulkDeleteUsers( @Body() dto: BulkDeleteUsersDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user.sub; return this.bulkOpsService.bulkDeleteUsers(dto, adminId); diff --git a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-content.controller.ts b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-content.controller.ts index ec4dad2..a7680a0 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-content.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-content.controller.ts @@ -69,7 +69,7 @@ export class AdminContentController { async approveContent( @Param('id') id: string, @Body() approvalDto: ApproveContentDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.adminContentService.approveContent( @@ -87,7 +87,7 @@ export class AdminContentController { async approveExercise( @Param('id') id: string, @Body() approvalDto: ApproveContentDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.adminContentService.approveContent( @@ -106,7 +106,7 @@ export class AdminContentController { async rejectContent( @Param('id') id: string, @Body() rejectionDto: RejectContentDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.adminContentService.rejectContent( @@ -124,7 +124,7 @@ export class AdminContentController { async rejectExercise( @Param('id') id: string, @Body() rejectionDto: RejectContentDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.adminContentService.rejectContent( @@ -157,7 +157,7 @@ export class AdminContentController { }) async createVersion( @Body() dto: CreateVersionDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.adminContentService.createVersion(dto, adminId); diff --git a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-gamification-config.controller.ts b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-gamification-config.controller.ts index 9520de7..99b5bc2 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-gamification-config.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-gamification-config.controller.ts @@ -175,7 +175,7 @@ export class AdminGamificationConfigController { }) async updateGamificationSettings( @Body() dto: UpdateGamificationSettingsDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user.sub; return this.gamificationConfigService.updateGamificationSettings( @@ -282,7 +282,7 @@ export class AdminGamificationConfigController { description: 'Forbidden - User is not an admin', }) async restoreDefaults( - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user.sub; return this.gamificationConfigService.restoreDefaults(adminId); @@ -323,7 +323,7 @@ export class AdminGamificationConfigController { description: 'Forbidden - User is not an admin', }) async restoreDefaultsAlternative( - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user.sub; return this.gamificationConfigService.restoreDefaults(adminId); @@ -503,7 +503,7 @@ export class AdminGamificationConfigController { async updateParameterById( @Param('id') id: string, @Body() dto: UpdateParameterDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user.sub; return this.gamificationConfigService.updateParameterById( @@ -635,7 +635,7 @@ export class AdminGamificationConfigController { async updateMayaRank( @Param('rankName') rankName: string, @Body() dto: UpdateMayaRankDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user.sub; return this.gamificationConfigService.updateMayaRank( diff --git a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-interventions.controller.ts b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-interventions.controller.ts index c257421..df0a3c4 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-interventions.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-interventions.controller.ts @@ -163,7 +163,7 @@ export class AdminInterventionsController { async acknowledgeIntervention( @Param('id') id: string, @Body() dto: AcknowledgeInterventionDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user?.id || req.user?.sub; return this.interventionsService.acknowledgeIntervention(id, dto.acknowledgment_note, userId); @@ -211,7 +211,7 @@ export class AdminInterventionsController { async resolveIntervention( @Param('id') id: string, @Body() dto: ResolveInterventionDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user?.id || req.user?.sub; return this.interventionsService.resolveIntervention(id, dto.resolution_notes, userId); diff --git a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-reports.controller.ts b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-reports.controller.ts index 60ea5ce..abc535f 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-reports.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-reports.controller.ts @@ -37,7 +37,7 @@ export class AdminReportsController { }) async generateReport( @Body() generateDto: GenerateReportDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user?.id || req.user?.sub; return this.adminReportsService.generateReport(generateDto, userId); diff --git a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-system.controller.ts b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-system.controller.ts index 04a8648..6cc2560 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-system.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-system.controller.ts @@ -71,7 +71,7 @@ export class AdminSystemController { }) async updateSystemConfig( @Body() configDto: UpdateSystemConfigDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.adminSystemService.updateSystemConfig(configDto, adminId); @@ -94,7 +94,7 @@ export class AdminSystemController { }) async getConfigByCategory( @Param('category') category: string, - ): Promise> { + ): Promise> { return this.adminSystemService.getConfigByCategory(category); } @@ -106,9 +106,9 @@ export class AdminSystemController { }) async updateConfigByCategory( @Param('category') category: string, - @Body() configDto: Record, - @Request() req: any, - ): Promise> { + @Body() configDto: Record, + @Request() req: AuthRequest, + ): Promise> { const adminId = req.user?.id || req.user?.sub; return this.adminSystemService.updateConfigByCategory( category, @@ -125,7 +125,7 @@ export class AdminSystemController { }) async toggleMaintenance( @Body() toggleDto: ToggleMaintenanceDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.adminSystemService.toggleMaintenance( diff --git a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-users.controller.ts b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-users.controller.ts index edaff0d..d89f952 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-users.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/controllers/admin-users.controller.ts @@ -137,7 +137,7 @@ export class AdminUsersController { }) async bulkSuspend( @Body() dto: BulkSuspendUsersDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.bulkOpsService.bulkSuspendUsers(dto, adminId); @@ -151,7 +151,7 @@ export class AdminUsersController { }) async bulkDelete( @Body() dto: BulkDeleteUsersDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.bulkOpsService.bulkDeleteUsers(dto, adminId); @@ -165,7 +165,7 @@ export class AdminUsersController { }) async bulkUpdateRole( @Body() dto: BulkUpdateRoleDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.bulkOpsService.bulkUpdateRole(dto, adminId); diff --git a/projects/gamilit/apps/backend/src/modules/admin/controllers/feature-flags.controller.ts b/projects/gamilit/apps/backend/src/modules/admin/controllers/feature-flags.controller.ts index 0898df8..d32674e 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/controllers/feature-flags.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/controllers/feature-flags.controller.ts @@ -114,7 +114,7 @@ export class FeatureFlagsController { }) async create( @Body() dto: CreateFeatureFlagDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.featureFlagsService.create(dto, adminId); @@ -140,7 +140,7 @@ export class FeatureFlagsController { async update( @Param('key') key: string, @Body() dto: UpdateFeatureFlagDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.featureFlagsService.update(key, dto, adminId); @@ -161,7 +161,7 @@ export class FeatureFlagsController { }) async enable( @Param('key') key: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.featureFlagsService.enable(key, adminId); @@ -182,7 +182,7 @@ export class FeatureFlagsController { }) async disable( @Param('key') key: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.featureFlagsService.disable(key, adminId); @@ -204,7 +204,7 @@ export class FeatureFlagsController { async updateRollout( @Param('key') key: string, @Body('percentage') percentage: number, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const adminId = req.user?.id || req.user?.sub; return this.featureFlagsService.updateRollout(key, percentage, adminId); diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/alerts/alert-response.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/alerts/alert-response.dto.ts index 2348a40..5aac976 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/alerts/alert-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/alerts/alert-response.dto.ts @@ -75,10 +75,10 @@ export class AlertResponseDto { suppress_similar!: boolean; @ApiPropertyOptional({ description: 'Additional context data' }) - context_data?: Record; + context_data?: Record; @ApiPropertyOptional({ description: 'Metrics data' }) - metrics?: Record; + metrics?: Record; @ApiPropertyOptional({ description: 'Related alert IDs', type: [String] }) related_alerts?: string[]; diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/alerts/create-alert.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/alerts/create-alert.dto.ts index 5154e5b..7d0e618 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/alerts/create-alert.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/alerts/create-alert.dto.ts @@ -45,10 +45,10 @@ export class CreateAlertDto { @ApiPropertyOptional({ description: 'Additional context data (JSON)' }) @IsOptional() @IsObject() - context_data?: Record; + context_data?: Record; @ApiPropertyOptional({ description: 'Metrics data (JSON)' }) @IsOptional() @IsObject() - metrics?: Record; + metrics?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/content/content.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/content/content.dto.ts index f7ab35a..85326ac 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/content/content.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/content/content.dto.ts @@ -61,5 +61,5 @@ export class ContentDto { @ApiPropertyOptional({ description: 'Additional metadata' }) @Expose() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/content/version-response.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/content/version-response.dto.ts index 3aeac0f..d6e221d 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/content/version-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/content/version-response.dto.ts @@ -65,5 +65,5 @@ export class VersionResponseDto { is_published: true, }, }) - snapshot!: Record; + snapshot!: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/dashboard/recent-activity.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/dashboard/recent-activity.dto.ts index 09aa23b..ba9dcdd 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/dashboard/recent-activity.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/dashboard/recent-activity.dto.ts @@ -48,7 +48,7 @@ export class AdminActionDto { @ApiPropertyOptional({ description: 'Additional metadata in JSON format', }) - metadata?: Record; + metadata?: Record; @ApiProperty({ description: 'Timestamp when the action occurred', diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/feature-flags/create-feature-flag.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/feature-flags/create-feature-flag.dto.ts index ac54e3d..0134f74 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/feature-flags/create-feature-flag.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/feature-flags/create-feature-flag.dto.ts @@ -88,7 +88,7 @@ export class CreateFeatureFlagDto { }) @IsObject() @IsOptional() - targetConditions?: Record; + targetConditions?: Record; @ApiProperty({ description: 'Categoría de la feature flag', @@ -106,5 +106,5 @@ export class CreateFeatureFlagDto { }) @IsObject() @IsOptional() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/gamification-config/gamification-settings-response.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/gamification-config/gamification-settings-response.dto.ts index 42eccc1..ecca572 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/gamification-config/gamification-settings-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/gamification-config/gamification-settings-response.dto.ts @@ -15,7 +15,7 @@ export class GamificationSettingsResponseDto { perfect_score_bonus: 2.0, }, }) - xp!: Record; + xp!: Record; @ApiProperty({ description: 'Rank thresholds', @@ -27,7 +27,7 @@ export class GamificationSettingsResponseDto { expert: 5000, }, }) - ranks!: Record; + ranks!: Record; @ApiProperty({ description: 'ML Coins rewards', @@ -37,13 +37,13 @@ export class GamificationSettingsResponseDto { exercise_completion_reward: 100, }, }) - coins!: Record; + coins!: Record; @ApiPropertyOptional({ description: 'Achievement criteria', example: { criteria: [] }, }) - achievements?: Record; + achievements?: Record; @ApiProperty({ description: 'Default values from system', @@ -52,7 +52,7 @@ export class GamificationSettingsResponseDto { 'gamification.xp.completion_multiplier': 1.5, }, }) - defaults!: Record; + defaults!: Record; @ApiProperty({ description: 'Timestamp of last update', diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/gamification-config/parameter-response.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/gamification-config/parameter-response.dto.ts index 79225c2..eae563d 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/gamification-config/parameter-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/gamification-config/parameter-response.dto.ts @@ -109,13 +109,13 @@ export class ParameterResponseDto { description: 'Validation rules in JSON format', example: { regex: '^[0-9]+$' }, }) - validation_rules?: Record; + validation_rules?: Record; @ApiPropertyOptional({ description: 'Additional metadata', example: { unit: 'points', category_order: 1 }, }) - metadata?: Record; + metadata?: Record; @ApiProperty({ description: 'Timestamp when parameter was created', diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/gamification-config/update-gamification-settings.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/gamification-config/update-gamification-settings.dto.ts index 74deda2..69ed658 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/gamification-config/update-gamification-settings.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/gamification-config/update-gamification-settings.dto.ts @@ -182,5 +182,5 @@ export class UpdateGamificationSettingsDto { }) @IsOptional() @IsObject() - achievements?: Record; + achievements?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/interventions/intervention-alert.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/interventions/intervention-alert.dto.ts index cf987a7..a15f990 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/interventions/intervention-alert.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/interventions/intervention-alert.dto.ts @@ -80,7 +80,7 @@ export class InterventionAlertDto { description: 'Additional metrics and context data', example: { average_score: 45, exercises_failed: 3 }, }) - metrics?: Record; + metrics?: Record; @ApiProperty({ enum: InterventionStatus, diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/monitoring/recent-errors.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/monitoring/recent-errors.dto.ts index 1104855..2981d08 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/monitoring/recent-errors.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/monitoring/recent-errors.dto.ts @@ -58,7 +58,7 @@ export class RecentErrorDto { nullable: true, example: { stack: '...', code: 'ECONNREFUSED' }, }) - context!: Record | null; + context!: Record | null; @ApiProperty({ description: 'Source of the error', diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/organizations/create-organization.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/organizations/create-organization.dto.ts index d92b83f..042af32 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/organizations/create-organization.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/organizations/create-organization.dto.ts @@ -91,7 +91,7 @@ export class CreateOrganizationDto { }) @IsOptional() @IsObject() - settings?: Record; + settings?: Record; @ApiPropertyOptional({ description: 'Organization metadata (JSONB)', @@ -99,5 +99,5 @@ export class CreateOrganizationDto { }) @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/organizations/organization.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/organizations/organization.dto.ts index e2d20c8..b8e8d28 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/organizations/organization.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/organizations/organization.dto.ts @@ -49,11 +49,11 @@ export class OrganizationDto { @ApiProperty({ description: 'Organization settings', example: { theme: 'detective' } }) @Expose() - settings!: Record; + settings!: Record; @ApiProperty({ description: 'Organization metadata', example: { notes: '...' } }) @Expose() - metadata!: Record; + metadata!: Record; @ApiProperty({ description: 'Creation date', example: '2025-01-15T10:00:00Z' }) @Expose() diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/organizations/update-organization.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/organizations/update-organization.dto.ts index 72d07a5..80f1d77 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/organizations/update-organization.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/organizations/update-organization.dto.ts @@ -83,7 +83,7 @@ export class UpdateOrganizationDto { }) @IsOptional() @IsObject() - settings?: Record; + settings?: Record; @ApiPropertyOptional({ description: 'Organization metadata (JSONB)', @@ -91,5 +91,5 @@ export class UpdateOrganizationDto { }) @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/reports/report.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/reports/report.dto.ts index 2a9474a..1ba1722 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/reports/report.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/reports/report.dto.ts @@ -48,7 +48,7 @@ export class ReportDto { @ApiPropertyOptional({ description: 'Report metadata', }) - metadata?: Record; + metadata?: Record; @ApiProperty({ description: 'Report creation timestamp', diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/system/maintenance-operations.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/system/maintenance-operations.dto.ts index 9c16b6c..abb2c63 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/system/maintenance-operations.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/system/maintenance-operations.dto.ts @@ -60,7 +60,7 @@ export class MaintenanceOperationResultDto { description: 'Additional metadata about the operation', example: { execution_time_ms: 1523 }, }) - metadata?: Record; + metadata?: Record; } /** diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/system/system-config.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/system/system-config.dto.ts index 52c43d5..ded1d4f 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/system/system-config.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/system/system-config.dto.ts @@ -20,7 +20,7 @@ export class SystemConfigDto { session_timeout_minutes!: number; @ApiPropertyOptional({ description: 'Custom settings' }) - custom_settings?: Record; + custom_settings?: Record; @ApiProperty({ description: 'Last updated timestamp', example: '2025-11-02T18:00:00Z' }) updated_at!: string; diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/system/update-system-config.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/system/update-system-config.dto.ts index d5029c0..432d9d6 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/system/update-system-config.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/system/update-system-config.dto.ts @@ -61,5 +61,5 @@ export class UpdateSystemConfigDto { }) @IsOptional() @IsObject() - custom_settings?: Record; + custom_settings?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/users/update-user.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/users/update-user.dto.ts index b13b077..31e267c 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/users/update-user.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/users/update-user.dto.ts @@ -24,5 +24,5 @@ export class UpdateUserDto { @IsOptional() @IsObject() - raw_user_meta_data?: Record; + raw_user_meta_data?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/admin/dto/users/user-details.dto.ts b/projects/gamilit/apps/backend/src/modules/admin/dto/users/user-details.dto.ts index 1641093..3f6894f 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/dto/users/user-details.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/dto/users/user-details.dto.ts @@ -39,7 +39,7 @@ export class UserDetailsDto { last_sign_in_at?: Date; @Expose() - raw_user_meta_data!: Record; + raw_user_meta_data!: Record; @Expose() created_at!: Date; diff --git a/projects/gamilit/apps/backend/src/modules/admin/entities/admin-report.entity.ts b/projects/gamilit/apps/backend/src/modules/admin/entities/admin-report.entity.ts index 8458e5d..17ccea0 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/entities/admin-report.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/entities/admin-report.entity.ts @@ -88,7 +88,7 @@ export class AdminReport { * Formato: { startDate: '2025-01-01', endDate: '2025-12-31', classroomId: 'abc', ... } */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Mensaje de error si la generación falla diff --git a/projects/gamilit/apps/backend/src/modules/admin/entities/feature-flag.entity.ts b/projects/gamilit/apps/backend/src/modules/admin/entities/feature-flag.entity.ts index fd80fd1..1754331 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/entities/feature-flag.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/entities/feature-flag.entity.ts @@ -101,7 +101,7 @@ export class FeatureFlag { * @example { "min_level": 5, "schools": ["uuid1", "uuid2"] } */ @Column({ type: 'jsonb', default: {} }) - target_conditions!: Record; + target_conditions!: Record; /** * Fecha y hora de inicio de la feature @@ -122,7 +122,7 @@ export class FeatureFlag { * @example { "ab_test_group": "A", "tracking_id": "GA-123" } */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * ID del usuario que creó la feature flag diff --git a/projects/gamilit/apps/backend/src/modules/admin/entities/notification-settings.entity.ts b/projects/gamilit/apps/backend/src/modules/admin/entities/notification-settings.entity.ts index 23e371c..31f50b2 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/entities/notification-settings.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/entities/notification-settings.entity.ts @@ -121,20 +121,20 @@ export class NotificationSettings { * @example { "max_retries": 3, "backoff": "exponential" } */ @Column({ type: 'jsonb', default: {} }) - retry_policy!: Record; + retry_policy!: Record; /** * Configuraciones específicas del canal de entrega * @example { "email_format": "html", "reply_to": "support@example.com" } */ @Column({ type: 'jsonb', default: {} }) - delivery_settings!: Record; + delivery_settings!: Record; /** * Metadatos adicionales */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * ID del usuario que creó el setting diff --git a/projects/gamilit/apps/backend/src/modules/admin/entities/system-alert.entity.ts b/projects/gamilit/apps/backend/src/modules/admin/entities/system-alert.entity.ts index b860887..66e1e2e 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/entities/system-alert.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/entities/system-alert.entity.ts @@ -176,14 +176,14 @@ export class SystemAlert { * @example { "endpoint": "/api/users", "statusCode": 500, "requestId": "abc123" } */ @Column({ type: 'jsonb', default: {} }) - context_data!: Record; + context_data!: Record; /** * Métricas asociadas en formato JSONB * @example { "responseTime": 5000, "errorRate": 0.15, "cpuUsage": 0.95 } */ @Column({ type: 'jsonb', default: {} }) - metrics!: Record; + metrics!: Record; /** * Array de IDs de alertas relacionadas diff --git a/projects/gamilit/apps/backend/src/modules/admin/entities/system-setting.entity.ts b/projects/gamilit/apps/backend/src/modules/admin/entities/system-setting.entity.ts index ff86d6f..a7c6c9f 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/entities/system-setting.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/entities/system-setting.entity.ts @@ -133,7 +133,7 @@ export class SystemSetting { * @example { "regex": "^[a-z]+$", "minLength": 3 } */ @Column({ type: 'jsonb', default: {} }) - validation_rules!: Record; + validation_rules!: Record; /** * Valores permitidos para el setting (array de strings) @@ -158,7 +158,7 @@ export class SystemSetting { * Metadatos adicionales en formato JSONB */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * ID del usuario que creó el setting diff --git a/projects/gamilit/apps/backend/src/modules/admin/services/admin-alerts.service.ts b/projects/gamilit/apps/backend/src/modules/admin/services/admin-alerts.service.ts index ddf20f4..3881e89 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/services/admin-alerts.service.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/services/admin-alerts.service.ts @@ -194,7 +194,7 @@ export class AdminAlertsService { * @param userId - ID del usuario que crea la alerta (para auditoría) * @returns Alerta creada */ - async createAlert(createDto: CreateAlertDto: string): Promise { + async createAlert(createDto: CreateAlertDto, _userId: string): Promise { const alert = this.alertRepo.create({ alert_type: createDto.alert_type, severity: createDto.severity, diff --git a/projects/gamilit/apps/backend/src/modules/admin/services/admin-content.service.ts b/projects/gamilit/apps/backend/src/modules/admin/services/admin-content.service.ts index ce5f34f..ef80182 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/services/admin-content.service.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/services/admin-content.service.ts @@ -577,7 +577,7 @@ export class AdminContentService { private createSnapshot( content: any, content_type: string, - ): Record { + ): Record { switch (content_type) { case 'module': return { @@ -804,7 +804,7 @@ export class AdminContentService { }); content_title = template?.name; } - } catch (_error) { + } catch { // Content might have been deleted, just leave title as undefined content_title = undefined; } diff --git a/projects/gamilit/apps/backend/src/modules/admin/services/admin-system.service.ts b/projects/gamilit/apps/backend/src/modules/admin/services/admin-system.service.ts index 3ceb6d3..ea89776 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/services/admin-system.service.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/services/admin-system.service.ts @@ -279,7 +279,7 @@ export class AdminSystemService { adminId: string, ): Promise { // Update settings in database - const settingsToUpdate: Record = { + const settingsToUpdate: Record = { maintenance_mode: updateDto.maintenance_mode, maintenance_message: updateDto.maintenance_message, allow_registrations: updateDto.allow_registrations, @@ -360,7 +360,7 @@ export class AdminSystemService { /** * Get system configuration by category */ - async getConfigByCategory(category: string): Promise> { + async getConfigByCategory(category: string): Promise> { // Validate category const validCategories = ['general', 'email', 'notifications', 'security', 'maintenance']; if (!validCategories.includes(category)) { @@ -387,7 +387,7 @@ export class AdminSystemService { }); // Build config object for this category - const config: Record = {}; + const config: Record = {}; settings.forEach((setting) => { config[setting.setting_key] = this.parseValue(setting); }); @@ -400,9 +400,9 @@ export class AdminSystemService { */ async updateConfigByCategory( category: string, - configDto: Record, + configDto: Record, adminId: string, - ): Promise> { + ): Promise> { // Validate category const validCategories = ['general', 'email', 'notifications', 'security', 'maintenance']; if (!validCategories.includes(category)) { @@ -744,7 +744,8 @@ export class AdminSystemService { pool_size: poolSize, active_connections: activeConnections, }; - } catch () { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (_error) { return { status: 'down', response_time_ms: -1, diff --git a/projects/gamilit/apps/backend/src/modules/admin/services/gamification-config.service.ts b/projects/gamilit/apps/backend/src/modules/admin/services/gamification-config.service.ts index 419ac48..f7575e5 100644 --- a/projects/gamilit/apps/backend/src/modules/admin/services/gamification-config.service.ts +++ b/projects/gamilit/apps/backend/src/modules/admin/services/gamification-config.service.ts @@ -425,8 +425,8 @@ export class GamificationConfigService { * Parse settings array into structured config * @private */ - private parseSettings(settings: SystemSetting[]): Record { - const config: Record = { + private parseSettings(settings: SystemSetting[]): Record { + const config: Record = { xp: {}, ranks: {}, coins: {}, @@ -446,7 +446,7 @@ export class GamificationConfigService { } else if (setting.value_type === 'json') { try { value = JSON.parse(value); - } catch (_error) { + } catch { this.logger.warn(`Failed to parse JSON for ${setting.setting_key}`); value = {}; } @@ -471,8 +471,8 @@ export class GamificationConfigService { * Parse default values from settings * @private */ - private parseDefaults(settings: SystemSetting[]): Record { - const defaults: Record = {}; + private parseDefaults(settings: SystemSetting[]): Record { + const defaults: Record = {}; for (const setting of settings) { if (setting.default_value) { @@ -484,7 +484,7 @@ export class GamificationConfigService { } else if (setting.value_type === 'json') { try { value = JSON.parse(value); - } catch (_error) { + } catch { this.logger.warn( `Failed to parse default JSON for ${setting.setting_key}`, ); @@ -542,7 +542,7 @@ export class GamificationConfigService { * @private */ private async updateXpSettings( - xp: Record, + xp: Record, adminId: string, ): Promise { for (const [key, value] of Object.entries(xp)) { @@ -556,7 +556,7 @@ export class GamificationConfigService { * @private */ private async updateRankSettings( - ranks: Record, + ranks: Record, adminId: string, ): Promise { const settingKey = 'gamification.ranks.thresholds'; @@ -568,7 +568,7 @@ export class GamificationConfigService { * @private */ private async updateCoinsSettings( - coins: Record, + coins: Record, adminId: string, ): Promise { for (const [key, value] of Object.entries(coins)) { @@ -582,7 +582,7 @@ export class GamificationConfigService { * @private */ private async updateAchievementSettings( - achievements: Record, + achievements: Record, adminId: string, ): Promise { const settingKey = 'gamification.achievements.criteria'; @@ -992,7 +992,7 @@ export class GamificationConfigService { if (parameter.value_type === 'json') { try { JSON.parse(value); - } catch (_error) { + } catch { throw new BadRequestException( `Invalid JSON value for ${parameter.setting_key}`, ); diff --git a/projects/gamilit/apps/backend/src/modules/assignments/controllers/assignments.controller.ts b/projects/gamilit/apps/backend/src/modules/assignments/controllers/assignments.controller.ts index c36e8bd..fee2a14 100644 --- a/projects/gamilit/apps/backend/src/modules/assignments/controllers/assignments.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/assignments/controllers/assignments.controller.ts @@ -69,7 +69,7 @@ export class AssignmentsController { }, }) @ApiResponse({ status: 400, description: 'Datos inválidos' }) - async create(@Body() createDto: CreateAssignmentDto, @Request() req: any) { + async create(@Body() createDto: CreateAssignmentDto, @Request() req: AuthRequest) { const teacherId = req.user?.userId || req.user?.sub; return this.assignmentsService.create(createDto, teacherId); } @@ -116,7 +116,7 @@ export class AssignmentsController { }], }, }) - async findAll(@Query() query: any, @Request() req: any) { + async findAll(@Query() query: any, @Request() req: AuthRequest) { const teacherId = req.user?.userId || req.user?.sub; return this.assignmentsService.findAll(teacherId, { isPublished: query.isPublished !== undefined ? query.isPublished === 'true' : undefined, @@ -164,7 +164,7 @@ export class AssignmentsController { status: 404, description: 'Asignación no encontrada o acceso denegado', }) - async findOne(@Param('id') id: string, @Request() req: any) { + async findOne(@Param('id') id: string, @Request() req: AuthRequest) { const teacherId = req.user?.userId || req.user?.sub; return this.assignmentsService.findOne(id, teacherId); } @@ -199,7 +199,7 @@ export class AssignmentsController { async update( @Param('id') id: string, @Body() updateDto: UpdateAssignmentDto, - @Request() req: any, + @Request() req: AuthRequest, ) { const teacherId = req.user?.userId || req.user?.sub; return this.assignmentsService.update(id, updateDto, teacherId); @@ -228,7 +228,7 @@ export class AssignmentsController { status: 404, description: 'Asignación no encontrada o acceso denegado', }) - async remove(@Param('id') id: string, @Request() req: any) { + async remove(@Param('id') id: string, @Request() req: AuthRequest) { const teacherId = req.user?.userId || req.user?.sub; await this.assignmentsService.remove(id, teacherId); } @@ -266,7 +266,7 @@ export class AssignmentsController { async assignToClassrooms( @Param('id') id: string, @Body() dto: AssignToClassroomsDto, - @Request() req: any, + @Request() req: AuthRequest, ) { const teacherId = req.user?.userId || req.user?.sub; return this.assignmentsService.assignToClassrooms(id, dto, teacherId); @@ -320,7 +320,7 @@ export class AssignmentsController { async getSubmissions( @Param('id') id: string, @Query() query: any, - @Request() req: any, + @Request() req: AuthRequest, ) { const teacherId = req.user?.userId || req.user?.sub; return this.assignmentsService.getSubmissions(id, teacherId, { @@ -373,7 +373,7 @@ export class AssignmentsController { async gradeSubmission( @Param('submissionId') submissionId: string, @Body() dto: AssignmentGradeDto, - @Request() req: any, + @Request() req: AuthRequest, ) { const teacherId = req.user?.userId || req.user?.sub; return this.assignmentsService.gradeSubmission(submissionId, dto, teacherId); @@ -407,7 +407,7 @@ export class AssignmentsController { async patch( @Param('id') id: string, @Body() patchDto: PatchAssignmentDto, - @Request() req: any, + @Request() req: AuthRequest, ) { const teacherId = req.user?.userId || req.user?.sub; return this.assignmentsService.patchAssignment(id, patchDto, teacherId); @@ -441,7 +441,7 @@ export class AssignmentsController { async distribute( @Param('id') id: string, @Body() distributeDto: DistributeAssignmentDto, - @Request() req: any, + @Request() req: AuthRequest, ) { const teacherId = req.user?.userId || req.user?.sub; return this.assignmentsService.distributeAssignment(id, distributeDto, teacherId); @@ -472,7 +472,7 @@ export class AssignmentsController { async duplicate( @Param('id') id: string, @Body() duplicateDto: DuplicateAssignmentDto, - @Request() req: any, + @Request() req: AuthRequest, ) { const teacherId = req.user?.userId || req.user?.sub; return this.assignmentsService.duplicateAssignment(id, duplicateDto, teacherId); @@ -528,7 +528,7 @@ export class AssignmentsController { async publish( @Param('id') id: string, @Body('notifyStudents') notifyStudents: boolean = false, - @Request() req: any, + @Request() req: AuthRequest, ) { const teacherId = req.user?.userId || req.user?.sub; return this.assignmentsService.publishAssignment(id, teacherId, notifyStudents); @@ -569,7 +569,7 @@ export class AssignmentsController { status: 404, description: 'Assignment not found or access denied', }) - async close(@Param('id') id: string, @Request() req: any) { + async close(@Param('id') id: string, @Request() req: AuthRequest) { const teacherId = req.user?.userId || req.user?.sub; return this.assignmentsService.closeAssignment(id, teacherId); } diff --git a/projects/gamilit/apps/backend/src/modules/assignments/controllers/student-assignments.controller.ts b/projects/gamilit/apps/backend/src/modules/assignments/controllers/student-assignments.controller.ts index b1ae1de..1ea8059 100644 --- a/projects/gamilit/apps/backend/src/modules/assignments/controllers/student-assignments.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/assignments/controllers/student-assignments.controller.ts @@ -73,7 +73,7 @@ export class StudentAssignmentsController { }], }, }) - async getMyAssignments(@Query() query: any, @Request() req: any) { + async getMyAssignments(@Query() query: any, @Request() req: AuthRequest) { const studentId = req.user?.userId || req.user?.sub; return this.assignmentsService.findStudentAssignments(studentId, { status: query.status, @@ -104,7 +104,7 @@ export class StudentAssignmentsController { status: 404, description: 'Tarea no encontrada o no asignada a este estudiante', }) - async getAssignmentDetails(@Param('id') id: string, @Request() req: any) { + async getAssignmentDetails(@Param('id') id: string, @Request() req: AuthRequest) { const studentId = req.user?.userId || req.user?.sub; return this.assignmentsService.findStudentAssignmentById(id, studentId); } @@ -137,7 +137,7 @@ export class StudentAssignmentsController { }, }, }) - async getGradesSummary(@Request() req: any) { + async getGradesSummary(@Request() req: AuthRequest) { const studentId = req.user?.userId || req.user?.sub; return this.assignmentsService.getStudentGradesSummary(studentId); } diff --git a/projects/gamilit/apps/backend/src/modules/assignments/services/assignments.service.ts b/projects/gamilit/apps/backend/src/modules/assignments/services/assignments.service.ts index c0a7367..923aa42 100644 --- a/projects/gamilit/apps/backend/src/modules/assignments/services/assignments.service.ts +++ b/projects/gamilit/apps/backend/src/modules/assignments/services/assignments.service.ts @@ -859,7 +859,7 @@ export class AssignmentsService { */ async findStudentAssignments( studentId: string, - filters?: { status?: string; classroomId?: string }, + _filters?: { status?: string; classroomId?: string }, ): Promise { // Get direct student assignments (without relation join - relations commented out) const studentAssignments = await this.assignmentStudentRepository.find({ diff --git a/projects/gamilit/apps/backend/src/modules/audit/interceptors/audit.interceptor.ts b/projects/gamilit/apps/backend/src/modules/audit/interceptors/audit.interceptor.ts index 2ce3cc7..d0947c4 100644 --- a/projects/gamilit/apps/backend/src/modules/audit/interceptors/audit.interceptor.ts +++ b/projects/gamilit/apps/backend/src/modules/audit/interceptors/audit.interceptor.ts @@ -25,7 +25,7 @@ export class AuditInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable { const request = context.switchToHttp().getRequest(); - const { method, url, _body, _user} = request; + const { method, url, body: _body, user: _user} = request; // Skip audit logging for certain endpoints if (this.shouldSkipAudit(url)) { diff --git a/projects/gamilit/apps/backend/src/modules/auth/auth.service.ts b/projects/gamilit/apps/backend/src/modules/auth/auth.service.ts index 8e6537c..9c42432 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/auth.service.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/auth.service.ts @@ -45,7 +45,7 @@ export class AuthService { * 4. Generate JWT tokens * 5. Return sanitized user + tokens */ - async register(dto: any): Promise { + async register(_dto: any): Promise { throw new Error('Register method not implemented - UsersService required'); } @@ -59,7 +59,7 @@ export class AuthService { * 4. Generate JWT tokens * 5. Return sanitized user + tokens */ - async login(dto: LoginDto): Promise { + async login(_dto: LoginDto): Promise { throw new Error('Login method not implemented - UsersService required'); } @@ -76,14 +76,14 @@ export class AuthService { * 3. Validate user is active * 4. Generate new access + refresh tokens */ - async refreshToken(dto: RefreshTokenDto): Promise { + async refreshToken(_dto: RefreshTokenDto): Promise { throw new Error('RefreshToken method not implemented - UsersService required'); } /** * Logout - Invalida tokens (client-side) */ - async logout(userId: string): Promise<{ message: string }> { + async logout(_userId: string): Promise<{ message: string }> { // TODO: Implementar blacklist de tokens en Redis (opcional) // Por ahora, el logout es client-side (eliminar tokens de localStorage) @@ -99,7 +99,7 @@ export class AuthService { * 2. Check if user exists and is active * 3. Return sanitized user (without password) */ - async validateUser(userId: string) { + async validateUser(_userId: string) { throw new Error('ValidateUser method not implemented - UsersService required'); } diff --git a/projects/gamilit/apps/backend/src/modules/auth/controllers/auth.controller.ts b/projects/gamilit/apps/backend/src/modules/auth/controllers/auth.controller.ts index c28a042..f17cfeb 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/controllers/auth.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/controllers/auth.controller.ts @@ -72,7 +72,7 @@ export class AuthController { @ApiBody({ type: RegisterUserDto }) async register( @Body() dto: RegisterUserDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise<{ user: UserResponseDto; accessToken: string; refreshToken: string }> { const ip = req.ip; const userAgent = req.headers['user-agent']; @@ -104,7 +104,7 @@ export class AuthController { @ApiBody({ type: LoginDto }) async login( @Body() dto: LoginDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise<{ user: UserResponseDto; accessToken: string; refreshToken: string }> { const ip = req.ip; const userAgent = req.headers['user-agent']; @@ -129,7 +129,7 @@ export class AuthController { @ApiOperation({ summary: 'Cerrar sesión de usuario' }) @ApiResponse({ status: 200, description: 'Sesión cerrada exitosamente' }) @ApiResponse({ status: 401, description: 'No autenticado' }) - async logout(@Request() req: any): Promise<{ message: string }> { + async logout(@Request() req: AuthRequest): Promise<{ message: string }> { // Extraer userId y sessionId del token JWT const userId = req.user?.id; const sessionId = req.user?.sessionId || 'current-session'; @@ -175,7 +175,7 @@ export class AuthController { type: UserResponseDto, }) @ApiResponse({ status: 401, description: 'No autenticado' }) - async getProfile(@Request() req: any): Promise { + async getProfile(@Request() req: AuthRequest): Promise { // Extraer userId del token JWT const userId = req.user?.id; const user = await this.authService.validateUser(userId); @@ -185,7 +185,7 @@ export class AuthController { } // Convertir a UserResponseDto (sin password) - const { _encrypted_password, ...userResponse } = user; + const { encrypted_password: _encrypted_password, ...userResponse } = user; return userResponse as UserResponseDto; } @@ -206,7 +206,7 @@ export class AuthController { @ApiResponse({ status: 400, description: 'Datos inválidos' }) @ApiBody({ type: UpdateProfileDto }) async updateProfile( - @Request() req: any, + @Request() req: AuthRequest, @Body() dto: UpdateProfileDto, ): Promise { // Extraer userId del token JWT @@ -220,7 +220,7 @@ export class AuthController { } // Convertir a UserResponseDto (sin password) - const { _encrypted_password, ...userResponse } = updatedUser; + const { encrypted_password: _encrypted_password, ...userResponse } = updatedUser; return userResponse as UserResponseDto; } @@ -247,7 +247,7 @@ export class AuthController { }, }, }) - async verifyEmail(@Body('token') token: string): Promise<{ message: string }> { + async verifyEmail(@Body('token') _token: string): Promise<{ message: string }> { // TODO: Implementar lógica de verificación de email // Por ahora retornamos éxito return { message: 'Email verificado exitosamente' }; @@ -275,7 +275,7 @@ export class AuthController { }, }, }) - async forgotPassword(@Body('email') email: string): Promise<{ message: string }> { + async forgotPassword(@Body('email') _email: string): Promise<{ message: string }> { // TODO: Implementar lógica de forgot password return { message: 'Si el email existe, recibirás instrucciones para resetear tu contraseña' }; } @@ -305,8 +305,8 @@ export class AuthController { }, }) async resetPassword( - @Body('token') token: string, - @Body('newPassword') newPassword: string, + @Body('token') _token: string, + @Body('newPassword') _newPassword: string, ): Promise<{ message: string }> { // TODO: Implementar lógica de reset password return { message: 'Contraseña reseteada exitosamente' }; @@ -340,9 +340,9 @@ export class AuthController { }, }) async changePassword( - @Request() req: any, - @Body('currentPassword') currentPassword: string, - @Body('newPassword') newPassword: string, + @Request() req: AuthRequest, + @Body('currentPassword') _currentPassword: string, + @Body('newPassword') _newPassword: string, ): Promise<{ message: string }> { const _userId = req.user?.id; // TODO: Implementar lógica de cambio de contraseña @@ -363,7 +363,7 @@ export class AuthController { isArray: true, }) @ApiResponse({ status: 401, description: 'No autenticado' }) - async getSessions(@Request() req: any): Promise { + async getSessions(@Request() req: AuthRequest): Promise { const userId = req.user?.id; return this.sessionService.getSessions(userId); } @@ -391,7 +391,7 @@ export class AuthController { @ApiResponse({ status: 401, description: 'No autenticado' }) @ApiResponse({ status: 404, description: 'Sesión no encontrada o no pertenece al usuario' }) async revokeSession( - @Request() req: any, + @Request() req: AuthRequest, @Param('sessionId') sessionId: string, ): Promise<{ message: string }> { const userId = req.user?.id; @@ -420,7 +420,7 @@ export class AuthController { }, }) @ApiResponse({ status: 401, description: 'No autenticado' }) - async revokeAllSessions(@Request() req: any): Promise<{ message: string; count: number }> { + async revokeAllSessions(@Request() req: AuthRequest): Promise<{ message: string; count: number }> { const userId = req.user?.id; const currentSessionId = req.user?.sessionId || 'unknown'; return this.sessionService.revokeAllSessions(userId, currentSessionId); diff --git a/projects/gamilit/apps/backend/src/modules/auth/controllers/password.controller.ts b/projects/gamilit/apps/backend/src/modules/auth/controllers/password.controller.ts index 13ad14e..126dc24 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/controllers/password.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/controllers/password.controller.ts @@ -140,7 +140,7 @@ export class PasswordController { @ApiResponse({ status: 404, description: 'Usuario no encontrado' }) @ApiBody({ type: ChangePasswordDto }) async changePassword( - @Request() req: any, + @Request() req: AuthRequest, @Body() dto: ChangePasswordDto, ): Promise<{ message: string }> { // Extraer userId del token JWT @@ -201,7 +201,7 @@ export class PasswordController { }) @ApiResponse({ status: 401, description: 'No autenticado' }) @ApiResponse({ status: 409, description: 'Email ya verificado' }) - async resendVerification(@Request() req: any): Promise<{ message: string }> { + async resendVerification(@Request() req: AuthRequest): Promise<{ message: string }> { // Extraer userId del token JWT const userId = req.user?.id; return this.emailVerificationService.resendVerification(userId); @@ -226,7 +226,7 @@ export class PasswordController { }, }) @ApiResponse({ status: 401, description: 'No autenticado' }) - async checkVerificationStatus(@Request() req: any): Promise<{ verified: boolean }> { + async checkVerificationStatus(@Request() req: AuthRequest): Promise<{ verified: boolean }> { // Extraer userId del token JWT const userId = req.user?.id; return this.emailVerificationService.checkVerificationStatus(userId); diff --git a/projects/gamilit/apps/backend/src/modules/auth/controllers/users.controller.ts b/projects/gamilit/apps/backend/src/modules/auth/controllers/users.controller.ts index 05895bd..ecfdaff 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/controllers/users.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/controllers/users.controller.ts @@ -59,7 +59,7 @@ export class UsersController { type: UserResponseDto, }) @ApiResponse({ status: 401, description: 'No autenticado' }) - async getProfile(@Request() req: any): Promise { + async getProfile(@Request() req: AuthRequest): Promise { const userId = req.user?.id; const user = await this.authService.validateUser(userId); @@ -67,7 +67,7 @@ export class UsersController { throw new UnauthorizedException('Usuario no encontrado'); } - const { _encrypted_password, ...userResponse } = user; + const { encrypted_password: _encrypted_password, ...userResponse } = user; return userResponse as UserResponseDto; } @@ -88,7 +88,7 @@ export class UsersController { @ApiResponse({ status: 400, description: 'Datos inválidos' }) @ApiBody({ type: UpdateProfileDto }) async updateProfile( - @Request() req: any, + @Request() req: AuthRequest, @Body() dto: UpdateProfileDto, ): Promise { const userId = req.user?.id; @@ -98,7 +98,7 @@ export class UsersController { throw new UnauthorizedException('Usuario no encontrado'); } - const { _encrypted_password, ...userResponse } = updatedUser; + const { encrypted_password: _encrypted_password, ...userResponse } = updatedUser; return userResponse as UserResponseDto; } @@ -119,7 +119,7 @@ export class UsersController { }, }) @ApiResponse({ status: 401, description: 'No autenticado' }) - async getPreferences(@Request() req: any): Promise<{ preferences: any }> { + async getPreferences(@Request() req: AuthRequest): Promise<{ preferences: any }> { const userId = req.user?.id; const preferences = await this.authService.getUserPreferences(userId); return { preferences }; @@ -151,7 +151,7 @@ export class UsersController { }, }) async updatePreferences( - @Request() req: any, + @Request() req: AuthRequest, @Body('preferences') preferences: any, ): Promise<{ preferences: any }> { const userId = req.user?.id; @@ -194,7 +194,7 @@ export class UsersController { }, }) async uploadAvatar( - @Request() req: any, + @Request() req: AuthRequest, @UploadedFile() file: any, ): Promise<{ avatar_url: string }> { const userId = req.user?.id; @@ -230,7 +230,7 @@ export class UsersController { }, }) @ApiResponse({ status: 401, description: 'No autenticado' }) - async getStatistics(@Request() req: any): Promise { + async getStatistics(@Request() req: AuthRequest): Promise { const userId = req.user?.id; const statistics = await this.authService.getUserStatistics(userId); return statistics; diff --git a/projects/gamilit/apps/backend/src/modules/auth/dto/assign-role.dto.ts b/projects/gamilit/apps/backend/src/modules/auth/dto/assign-role.dto.ts index 5f506f1..6050bf0 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/dto/assign-role.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/dto/assign-role.dto.ts @@ -52,7 +52,7 @@ export class AssignRoleDto { */ @IsObject({ message: 'permissions debe ser un objeto JSON válido' }) @IsOptional() - permissions?: Record; + permissions?: Record; /** * Fecha y hora de expiración del rol (opcional) @@ -81,5 +81,5 @@ export class AssignRoleDto { */ @IsObject({ message: 'metadata debe ser un objeto JSON válido' }) @IsOptional() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/auth/dto/create-profile.dto.ts b/projects/gamilit/apps/backend/src/modules/auth/dto/create-profile.dto.ts index 8392c8d..9c8f052 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/dto/create-profile.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/dto/create-profile.dto.ts @@ -205,7 +205,7 @@ export class CreateProfileDto { */ @IsObject() @IsOptional() - metadata?: Record; + metadata?: Record; /** * ID del usuario en auth.users diff --git a/projects/gamilit/apps/backend/src/modules/auth/dto/create-tenant.dto.ts b/projects/gamilit/apps/backend/src/modules/auth/dto/create-tenant.dto.ts index 9ce01d3..3428c10 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/dto/create-tenant.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/dto/create-tenant.dto.ts @@ -126,7 +126,7 @@ export class CreateTenantDto { */ @IsObject({ message: 'Las configuraciones deben ser un objeto JSON válido' }) @IsOptional() - settings?: Record; + settings?: Record; /** * Metadata adicional del tenant (JSONB) @@ -135,5 +135,5 @@ export class CreateTenantDto { */ @IsObject({ message: 'La metadata debe ser un objeto JSON válido' }) @IsOptional() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/auth/dto/create-user-preferences.dto.ts b/projects/gamilit/apps/backend/src/modules/auth/dto/create-user-preferences.dto.ts index de1260c..c687f43 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/dto/create-user-preferences.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/dto/create-user-preferences.dto.ts @@ -141,5 +141,5 @@ export class CreateUserPreferencesDto { }) @IsOptional() @IsObject() - preferences?: Record; + preferences?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/auth/dto/create-user.dto.ts b/projects/gamilit/apps/backend/src/modules/auth/dto/create-user.dto.ts index 1702b25..bc3c42e 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/dto/create-user.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/dto/create-user.dto.ts @@ -55,5 +55,5 @@ export class CreateUserDto { */ @IsObject({ message: 'Los metadatos deben ser un objeto JSON' }) @IsOptional() - raw_user_meta_data?: Record; + raw_user_meta_data?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/auth/dto/profile-response.dto.ts b/projects/gamilit/apps/backend/src/modules/auth/dto/profile-response.dto.ts index 45b6710..e358a8b 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/dto/profile-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/dto/profile-response.dto.ts @@ -87,7 +87,7 @@ export class ProfileResponseDto { last_activity_at!: Date | null; @Expose() - metadata!: Record; + metadata!: Record; @Expose() created_at!: Date; diff --git a/projects/gamilit/apps/backend/src/modules/auth/dto/register-user.dto.ts b/projects/gamilit/apps/backend/src/modules/auth/dto/register-user.dto.ts index 12f2fe6..ea28c7f 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/dto/register-user.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/dto/register-user.dto.ts @@ -39,7 +39,7 @@ export class RegisterUserDto { */ @IsObject({ message: 'Los metadatos deben ser un objeto JSON' }) @IsOptional() - raw_user_meta_data?: Record; + raw_user_meta_data?: Record; // Campos opcionales adicionales para registro: // Nota: Estos campos se podrían mapear al Profile (auth_management.profiles) diff --git a/projects/gamilit/apps/backend/src/modules/auth/dto/tenant-response.dto.ts b/projects/gamilit/apps/backend/src/modules/auth/dto/tenant-response.dto.ts index f7d5237..f7b38a8 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/dto/tenant-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/dto/tenant-response.dto.ts @@ -75,13 +75,13 @@ export class TenantResponseDto { * Configuraciones del tenant (JSONB) */ @Expose() - settings!: Record; + settings!: Record; /** * Metadata adicional del tenant (JSONB) */ @Expose() - metadata!: Record; + metadata!: Record; /** * Fecha de creación del tenant diff --git a/projects/gamilit/apps/backend/src/modules/auth/dto/update-user.dto.ts b/projects/gamilit/apps/backend/src/modules/auth/dto/update-user.dto.ts index 4849f63..fb2d1f9 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/dto/update-user.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/dto/update-user.dto.ts @@ -20,7 +20,7 @@ export class UpdateUserDto extends PartialType( ) { // Hereda de CreateUserDto excepto password y email: // - role?: GamilityRoleEnum - // - raw_user_meta_data?: Record + // - raw_user_meta_data?: Record // Campos opcionales adicionales para actualización: // (actualmente solo role y raw_user_meta_data son editables) diff --git a/projects/gamilit/apps/backend/src/modules/auth/dto/user-preferences-response.dto.ts b/projects/gamilit/apps/backend/src/modules/auth/dto/user-preferences-response.dto.ts index 51a8661..3a9d0a1 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/dto/user-preferences-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/dto/user-preferences-response.dto.ts @@ -99,7 +99,7 @@ export class UserPreferencesResponseDto { dashboard_layout: 'grid', }, }) - preferences!: Record; + preferences!: Record; /** * Fecha de creación diff --git a/projects/gamilit/apps/backend/src/modules/auth/dto/user-response.dto.ts b/projects/gamilit/apps/backend/src/modules/auth/dto/user-response.dto.ts index e032efa..acbd225 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/dto/user-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/dto/user-response.dto.ts @@ -99,7 +99,7 @@ export class UserResponseDto { * NOTA: Filtrar campos sensibles si existen */ @Expose() - raw_user_meta_data!: Record; + raw_user_meta_data!: Record; /** * Fecha y hora de creación del registro diff --git a/projects/gamilit/apps/backend/src/modules/auth/dto/user-role-response.dto.ts b/projects/gamilit/apps/backend/src/modules/auth/dto/user-role-response.dto.ts index cf1b78f..95f66b0 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/dto/user-role-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/dto/user-role-response.dto.ts @@ -38,7 +38,7 @@ export class UserRoleResponseDto { * Permisos específicos asociados a este rol */ @Expose() - permissions!: Record; + permissions!: Record; /** * ID del usuario (Profile) que asignó este rol (nullable) @@ -80,7 +80,7 @@ export class UserRoleResponseDto { * Metadata adicional del user_role */ @Expose() - metadata!: Record; + metadata!: Record; /** * Fecha de creación del registro diff --git a/projects/gamilit/apps/backend/src/modules/auth/entities/auth-attempt.entity.ts b/projects/gamilit/apps/backend/src/modules/auth/entities/auth-attempt.entity.ts index e2f12de..a4e4927 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/entities/auth-attempt.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/entities/auth-attempt.entity.ts @@ -43,7 +43,7 @@ export class AuthAttempt { attempted_at!: Date; @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; // NOTA: La tabla auth_attempts NO tiene user_id // Es una tabla de auditoría independiente que solo registra el email diff --git a/projects/gamilit/apps/backend/src/modules/auth/entities/profile.entity.ts b/projects/gamilit/apps/backend/src/modules/auth/entities/profile.entity.ts index 9d15317..857a35a 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/entities/profile.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/entities/profile.entity.ts @@ -125,7 +125,7 @@ export class Profile { last_activity_at!: Date | null; @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; @CreateDateColumn({ type: 'timestamp with time zone' }) created_at!: Date; diff --git a/projects/gamilit/apps/backend/src/modules/auth/entities/security-event.entity.ts b/projects/gamilit/apps/backend/src/modules/auth/entities/security-event.entity.ts index 0526f64..12ccc8b 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/entities/security-event.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/entities/security-event.entity.ts @@ -84,7 +84,7 @@ export class SecurityEvent { * @example { "failed_attempts": 3, "reason": "invalid_password" } */ @Column({ type: 'jsonb', nullable: true }) - metadata?: Record; + metadata?: Record; /** * Fecha y hora de creación del evento diff --git a/projects/gamilit/apps/backend/src/modules/auth/entities/tenant.entity.ts b/projects/gamilit/apps/backend/src/modules/auth/entities/tenant.entity.ts index f795088..8e33c51 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/entities/tenant.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/entities/tenant.entity.ts @@ -113,14 +113,14 @@ export class Tenant { timezone: 'America/Mexico_City', }, }) - settings!: Record; + settings!: Record; /** * Metadata adicional del tenant (JSONB) * @example { billing_contact: "admin@example.com", notes: "..." } */ @Column({ type: 'jsonb', nullable: false, default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha de creación del tenant diff --git a/projects/gamilit/apps/backend/src/modules/auth/entities/user-preferences.entity.ts b/projects/gamilit/apps/backend/src/modules/auth/entities/user-preferences.entity.ts index 8ec537d..fec1841 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/entities/user-preferences.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/entities/user-preferences.entity.ts @@ -117,7 +117,7 @@ export class UserPreferences { */ @Column({ type: 'jsonb', default: {} }) @Index('idx_user_preferences_preferences', { synchronize: false }) // GIN index creado en DDL - preferences!: Record; + preferences!: Record; /** * Fecha de creación diff --git a/projects/gamilit/apps/backend/src/modules/auth/entities/user-role.entity.ts b/projects/gamilit/apps/backend/src/modules/auth/entities/user-role.entity.ts index 0a3c432..5b7a705 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/entities/user-role.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/entities/user-role.entity.ts @@ -92,7 +92,7 @@ export class UserRole { nullable: false, default: { read: true, write: false, admin: false, analytics: false }, }) - permissions!: Record; + permissions!: Record; /** * ID del usuario (Profile) que asignó este rol (nullable) @@ -143,7 +143,7 @@ export class UserRole { * @example { notes: "Rol temporal para proyecto X", reason: "..." } */ @Column({ type: 'jsonb', nullable: false, default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha de creación del registro diff --git a/projects/gamilit/apps/backend/src/modules/auth/entities/user-session.entity.ts b/projects/gamilit/apps/backend/src/modules/auth/entities/user-session.entity.ts index 20bdd36..10076d9 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/entities/user-session.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/entities/user-session.entity.ts @@ -77,7 +77,7 @@ export class UserSession { revoked_at!: Date | null; @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; // Relaciones @ManyToOne(() => User, { onDelete: 'CASCADE' }) diff --git a/projects/gamilit/apps/backend/src/modules/auth/entities/user.entity.ts b/projects/gamilit/apps/backend/src/modules/auth/entities/user.entity.ts index 5f8c113..39ee54c 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/entities/user.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/entities/user.entity.ts @@ -137,7 +137,7 @@ export class User { * Metadatos adicionales del usuario en formato JSON */ @Column({ type: 'jsonb', default: {} }) - raw_user_meta_data!: Record; + raw_user_meta_data!: Record; /** * Fecha y hora de eliminación lógica (soft delete) diff --git a/projects/gamilit/apps/backend/src/modules/auth/services/auth.service.ts b/projects/gamilit/apps/backend/src/modules/auth/services/auth.service.ts index 64e9990..57d5b06 100644 --- a/projects/gamilit/apps/backend/src/modules/auth/services/auth.service.ts +++ b/projects/gamilit/apps/backend/src/modules/auth/services/auth.service.ts @@ -658,7 +658,7 @@ export class AuthService { * @returns UserResponseDto con campos derivados calculados */ public toUserResponse(user: User): UserResponseDto { - const { _encrypted_password, ...userWithoutPassword } = user; + const { encrypted_password: _encrypted_password, ...userWithoutPassword } = user; // Calcular campos derivados para coherencia Frontend-Backend const emailVerified = !!user.email_confirmed_at; diff --git a/projects/gamilit/apps/backend/src/modules/content/controllers/content-templates.controller.ts b/projects/gamilit/apps/backend/src/modules/content/controllers/content-templates.controller.ts index d6e8127..0b237b6 100644 --- a/projects/gamilit/apps/backend/src/modules/content/controllers/content-templates.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/content/controllers/content-templates.controller.ts @@ -42,9 +42,9 @@ export class ContentTemplatesController { @ApiResponse({ status: 200, description: 'Lista de plantillas obtenida exitosamente', type: [ContentTemplateResponseDto] }) async findAll( @Query('type') type?: string, - @Query('category') category?: string, + @Query('category') _category?: string, ) { - return this.templatesService.findAll(type, category); + return this.templatesService.findAll(type); } /** diff --git a/projects/gamilit/apps/backend/src/modules/content/dto/content-template-response.dto.ts b/projects/gamilit/apps/backend/src/modules/content/dto/content-template-response.dto.ts index b944f9e..e6d2e86 100644 --- a/projects/gamilit/apps/backend/src/modules/content/dto/content-template-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/content/dto/content-template-response.dto.ts @@ -38,11 +38,11 @@ export class ContentTemplateResponseDto { @ApiProperty({ description: 'Estructura JSON de la plantilla' }) @Expose() - template_structure!: Record; + template_structure!: Record; @ApiPropertyOptional({ description: 'Valores predeterminados' }) @Expose() - default_values?: Record; + default_values?: Record; @ApiPropertyOptional({ description: 'Campos requeridos' }) @Expose() @@ -82,7 +82,7 @@ export class ContentTemplateResponseDto { @ApiProperty({ description: 'Metadatos adicionales' }) @Expose() - metadata!: Record; + metadata!: Record; @ApiPropertyOptional({ description: 'ID del usuario creador' }) @Expose() diff --git a/projects/gamilit/apps/backend/src/modules/content/dto/create-content-template.dto.ts b/projects/gamilit/apps/backend/src/modules/content/dto/create-content-template.dto.ts index 36d1f82..a5eaba5 100644 --- a/projects/gamilit/apps/backend/src/modules/content/dto/create-content-template.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/content/dto/create-content-template.dto.ts @@ -62,7 +62,7 @@ export class CreateContentTemplateDto { */ @ApiProperty({ description: 'Estructura JSON de la plantilla', example: { sections: [], fields: [] } }) @IsObject() - template_structure!: Record; + template_structure!: Record; /** * Valores predeterminados JSON @@ -70,7 +70,7 @@ export class CreateContentTemplateDto { @ApiPropertyOptional({ description: 'Valores predeterminados', example: { difficulty: 'medium', duration: 30 } }) @IsOptional() @IsObject() - default_values?: Record; + default_values?: Record; /** * Campos requeridos @@ -141,7 +141,7 @@ export class CreateContentTemplateDto { @ApiPropertyOptional({ description: 'Metadatos adicionales', example: {} }) @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; /** * ID del creador diff --git a/projects/gamilit/apps/backend/src/modules/content/dto/create-marie-curie-content.dto.ts b/projects/gamilit/apps/backend/src/modules/content/dto/create-marie-curie-content.dto.ts index 2d8d80f..44a06af 100644 --- a/projects/gamilit/apps/backend/src/modules/content/dto/create-marie-curie-content.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/content/dto/create-marie-curie-content.dto.ts @@ -72,7 +72,7 @@ export class CreateMarieCurieContentDto { */ @ApiProperty({ description: 'Contenido estructurado JSON', example: { introduction: 'Texto introductorio...', main_content: 'Contenido principal...', key_points: [], timeline: [], quotes: [] } }) @IsObject() - content!: Record; + content!: Record; // ===================================================== // EDUCATIONAL METADATA @@ -196,7 +196,7 @@ export class CreateMarieCurieContentDto { @ApiPropertyOptional({ description: 'Contexto cultural JSON', example: {} }) @IsOptional() @IsObject() - cultural_context?: Record; + cultural_context?: Record; // ===================================================== // PUBLICATION STATUS @@ -286,5 +286,5 @@ export class CreateMarieCurieContentDto { @ApiPropertyOptional({ description: 'Metadatos adicionales', example: {} }) @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/content/dto/create-media-file.dto.ts b/projects/gamilit/apps/backend/src/modules/content/dto/create-media-file.dto.ts index 6ec0c35..ecc94a0 100644 --- a/projects/gamilit/apps/backend/src/modules/content/dto/create-media-file.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/content/dto/create-media-file.dto.ts @@ -260,7 +260,7 @@ export class CreateMediaFileDto { @ApiPropertyOptional({ description: 'Información de procesamiento JSON', example: {} }) @IsOptional() @IsObject() - processing_info?: Record; + processing_info?: Record; // ===================================================== // SEARCH & ORGANIZATION @@ -381,7 +381,7 @@ export class CreateMediaFileDto { @ApiPropertyOptional({ description: 'Datos EXIF JSON', example: {} }) @IsOptional() @IsObject() - exif_data?: Record; + exif_data?: Record; /** * Metadatos adicionales @@ -389,5 +389,5 @@ export class CreateMediaFileDto { @ApiPropertyOptional({ description: 'Metadatos adicionales', example: {} }) @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/content/dto/marie-curie-content-response.dto.ts b/projects/gamilit/apps/backend/src/modules/content/dto/marie-curie-content-response.dto.ts index d8abfe7..fdcca50 100644 --- a/projects/gamilit/apps/backend/src/modules/content/dto/marie-curie-content-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/content/dto/marie-curie-content-response.dto.ts @@ -45,7 +45,7 @@ export class MarieCurieContentResponseDto { @ApiProperty({ description: 'Contenido estructurado JSON' }) @Expose() - content!: Record; + content!: Record; // ===================================================== // EDUCATIONAL METADATA @@ -109,7 +109,7 @@ export class MarieCurieContentResponseDto { @ApiProperty({ description: 'Contexto cultural JSON' }) @Expose() - cultural_context!: Record; + cultural_context!: Record; // ===================================================== // PUBLICATION STATUS @@ -161,7 +161,7 @@ export class MarieCurieContentResponseDto { @ApiProperty({ description: 'Metadatos adicionales' }) @Expose() - metadata!: Record; + metadata!: Record; @ApiProperty({ description: 'Fecha de creación' }) @Expose() diff --git a/projects/gamilit/apps/backend/src/modules/content/dto/media-file-response.dto.ts b/projects/gamilit/apps/backend/src/modules/content/dto/media-file-response.dto.ts index 83bc32b..6792b9c 100644 --- a/projects/gamilit/apps/backend/src/modules/content/dto/media-file-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/content/dto/media-file-response.dto.ts @@ -145,7 +145,7 @@ export class MediaFileResponseDto { @ApiProperty({ description: 'Información de procesamiento' }) @Expose() - processing_info!: Record; + processing_info!: Record; // ===================================================== // SEARCH & ORGANIZATION @@ -213,11 +213,11 @@ export class MediaFileResponseDto { @ApiProperty({ description: 'Datos EXIF' }) @Expose() - exif_data!: Record; + exif_data!: Record; @ApiProperty({ description: 'Metadatos adicionales' }) @Expose() - metadata!: Record; + metadata!: Record; // ===================================================== // AUDIT TIMESTAMPS diff --git a/projects/gamilit/apps/backend/src/modules/content/entities/content-template.entity.ts b/projects/gamilit/apps/backend/src/modules/content/entities/content-template.entity.ts index 3cbf561..e37ceda 100644 --- a/projects/gamilit/apps/backend/src/modules/content/entities/content-template.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/content/entities/content-template.entity.ts @@ -75,14 +75,14 @@ export class ContentTemplate { * Define cómo se estructura el contenido */ @Column({ type: 'jsonb', default: {} }) - template_structure!: Record; + template_structure!: Record; /** * Valores predeterminados JSON * Valores iniciales al crear contenido desde esta plantilla */ @Column({ type: 'jsonb', nullable: true }) - default_values?: Record; + default_values?: Record; /** * Campos requeridos en el contenido @@ -146,7 +146,7 @@ export class ContentTemplate { * Metadatos adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha y hora de creación del registro diff --git a/projects/gamilit/apps/backend/src/modules/content/entities/marie-curie-content.entity.ts b/projects/gamilit/apps/backend/src/modules/content/entities/marie-curie-content.entity.ts index e322d8c..c3f1bf5 100644 --- a/projects/gamilit/apps/backend/src/modules/content/entities/marie-curie-content.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/content/entities/marie-curie-content.entity.ts @@ -96,7 +96,7 @@ export class MarieCurieContent { main_content: '', }, }) - content!: Record; + content!: Record; // ===================================================== // EDUCATIONAL METADATA @@ -190,7 +190,7 @@ export class MarieCurieContent { * Contexto cultural en formato JSON */ @Column({ type: 'jsonb', default: {} }) - cultural_context!: Record; + cultural_context!: Record; // ===================================================== // PUBLICATION STATUS @@ -265,7 +265,7 @@ export class MarieCurieContent { * Metadatos adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha y hora de creación del registro diff --git a/projects/gamilit/apps/backend/src/modules/content/entities/media-file.entity.ts b/projects/gamilit/apps/backend/src/modules/content/entities/media-file.entity.ts index f58ec11..2640428 100644 --- a/projects/gamilit/apps/backend/src/modules/content/entities/media-file.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/content/entities/media-file.entity.ts @@ -234,7 +234,7 @@ export class MediaFile { * Información de procesamiento en formato JSON */ @Column({ type: 'jsonb', default: {} }) - processing_info!: Record; + processing_info!: Record; // ===================================================== // SEARCH & ORGANIZATION @@ -326,13 +326,13 @@ export class MediaFile { * Datos EXIF del archivo (imágenes) */ @Column({ type: 'jsonb', default: {} }) - exif_data!: Record; + exif_data!: Record; /** * Metadatos adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; // ===================================================== // AUDIT TIMESTAMPS diff --git a/projects/gamilit/apps/backend/src/modules/content/services/content-templates.service.ts b/projects/gamilit/apps/backend/src/modules/content/services/content-templates.service.ts index 088b704..7062f11 100644 --- a/projects/gamilit/apps/backend/src/modules/content/services/content-templates.service.ts +++ b/projects/gamilit/apps/backend/src/modules/content/services/content-templates.service.ts @@ -38,7 +38,7 @@ export class ContentTemplatesService { * @param category - Categoría (opcional, no usado en DDL pero útil para filtros futuros) * @returns Lista de plantillas */ - async findAll(type?: string?: string): Promise { + async findAll(type?: string): Promise { const query = this.templateRepo.createQueryBuilder('t'); if (type) { @@ -140,7 +140,7 @@ export class ContentTemplatesService { * @param category - Categoría de plantilla * @returns Lista de plantillas de la categoría */ - async findByCategory(category: string): Promise { + async findByCategory(_category: string): Promise { // Actualmente retorna todas ya que no existe el campo category en DDL // Se puede extender con metadata o agregando el campo en una migración futura return this.templateRepo.find({ diff --git a/projects/gamilit/apps/backend/src/modules/educational/controllers/exercises.controller.ts b/projects/gamilit/apps/backend/src/modules/educational/controllers/exercises.controller.ts index d8253cf..1d3ff2a 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/controllers/exercises.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/controllers/exercises.controller.ts @@ -90,7 +90,7 @@ export class ExercisesController { */ private normalizeSubmitData(dto: SubmitExerciseDto, req: any): { userId: string; - answers: Record; + answers: Record; timeSpentSeconds?: number; hintsUsed: number; powerupsUsed: string[]; @@ -105,7 +105,7 @@ export class ExercisesController { } // 2. Extraer respuestas (nuevo formato tiene prioridad) - let answers: Record; + let answers: Record; if (dto.answers) { // Formato nuevo (estándar) @@ -220,7 +220,7 @@ export class ExercisesController { status: 500, description: 'Error interno del servidor', }) - async findAll(@Request() req: any) { + async findAll(@Request() req: AuthRequest) { const userId = req.user.id; const userRole = req.user.role; @@ -372,7 +372,7 @@ export class ExercisesController { }, }, }) - async findOne(@Param('id') id: string, @Request() req: any) { + async findOne(@Param('id') id: string, @Request() req: AuthRequest) { const userId = req.user.id; // Obtener ejercicio @@ -671,7 +671,7 @@ export class ExercisesController { status: 404, description: 'Módulo no encontrado', }) - async findByModule(@Param('moduleId') moduleId: string, @Request() req: any) { + async findByModule(@Param('moduleId') moduleId: string, @Request() req: AuthRequest) { // Obtener ejercicios del módulo const exercises = await this.exercisesService.findByModuleId(moduleId); @@ -818,7 +818,7 @@ export class ExercisesController { }, }) async validateContentByExerciseType( - @Body() body: { exercise_type: ExerciseTypeEnum; content: Record }, + @Body() body: { exercise_type: ExerciseTypeEnum; content: Record }, ) { this.exercisesService.validateContentByExerciseType(body.exercise_type, body.content); return { @@ -943,7 +943,7 @@ export class ExercisesController { async submitExercise( @Param('id') exerciseId: string, @Body() dto: SubmitExerciseDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { // ======================================== // 1. NORMALIZACIÓN diff --git a/projects/gamilit/apps/backend/src/modules/educational/controllers/media-upload.controller.ts b/projects/gamilit/apps/backend/src/modules/educational/controllers/media-upload.controller.ts index 414d4d6..720e274 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/controllers/media-upload.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/controllers/media-upload.controller.ts @@ -80,7 +80,7 @@ export class MediaUploadController { }) @ApiResponse({ status: 400, description: 'Archivo inválido o excede límite de tamaño' }) async uploadFile( - @Request() req: any, + @Request() req: AuthRequest, @UploadedFile() file: any, @Body() dto: UploadMediaDto, ): Promise { diff --git a/projects/gamilit/apps/backend/src/modules/educational/controllers/media.controller.ts b/projects/gamilit/apps/backend/src/modules/educational/controllers/media.controller.ts index 823b896..6ff897f 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/controllers/media.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/controllers/media.controller.ts @@ -349,7 +349,7 @@ export class MediaController { }) async updateProcessingStatus( @Param('id') id: string, - @Body() body: { status: ProcessingStatusEnum; metadata?: Record }, + @Body() body: { status: ProcessingStatusEnum; metadata?: Record }, ) { return this.mediaService.updateProcessingStatus(id, body.status, body.metadata); } diff --git a/projects/gamilit/apps/backend/src/modules/educational/controllers/modules.controller.ts b/projects/gamilit/apps/backend/src/modules/educational/controllers/modules.controller.ts index 1fac320..3e13fae 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/controllers/modules.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/controllers/modules.controller.ts @@ -110,7 +110,7 @@ export class ModulesController { status: 500, description: 'Error interno del servidor', }) - async findAll(@Request() req: any, @Query() query: GetModulesQueryDto) { + async findAll(@Request() req: AuthRequest, @Query() query: GetModulesQueryDto) { const userId = req.user.id; // Reutilizar getUserModules que ya tiene la lógica correcta para ambas tablas // Ahora acepta classroomId opcional para filtrar diff --git a/projects/gamilit/apps/backend/src/modules/educational/dto/exercises/create-exercise.dto.ts b/projects/gamilit/apps/backend/src/modules/educational/dto/exercises/create-exercise.dto.ts index 012191d..f542380 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/dto/exercises/create-exercise.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/dto/exercises/create-exercise.dto.ts @@ -84,7 +84,7 @@ export class CreateExerciseDto { */ @IsOptional() @IsObject() - config?: Record; + config?: Record; /** * Contenido del ejercicio (JSONB) (REQUERIDO) @@ -92,21 +92,21 @@ export class CreateExerciseDto { */ @IsOptional() @IsObject() - content?: Record; + content?: Record; /** * Solución del ejercicio (JSONB) */ @IsOptional() @IsObject() - solution?: Record; + solution?: Record; /** * Rúbrica de evaluación (JSONB) */ @IsOptional() @IsObject() - rubric?: Record; + rubric?: Record; // ===================================================== // GRADING & SCORING @@ -233,7 +233,7 @@ export class CreateExerciseDto { */ @IsOptional() @IsObject() - comodines_config?: Record; + comodines_config?: Record; // ===================================================== // GAMIFICATION & REWARDS @@ -345,5 +345,5 @@ export class CreateExerciseDto { */ @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/educational/dto/exercises/exercise-response.dto.ts b/projects/gamilit/apps/backend/src/modules/educational/dto/exercises/exercise-response.dto.ts index 44c1c7d..e04e8cf 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/dto/exercises/exercise-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/dto/exercises/exercise-response.dto.ts @@ -61,16 +61,16 @@ export class ExerciseResponseDto { exercise_type!: ExerciseTypeEnum; @Expose() - config!: Record; + config!: Record; @Expose() - content!: Record; + content!: Record; @Expose() - solution?: Record; + solution?: Record; @Expose() - rubric?: Record; + rubric?: Record; // ===================================================== // GRADING & SCORING @@ -132,7 +132,7 @@ export class ExerciseResponseDto { comodines_allowed!: ComodinTypeEnum[]; @Expose() - comodines_config!: Record; + comodines_config!: Record; // ===================================================== // GAMIFICATION & REWARDS @@ -187,7 +187,7 @@ export class ExerciseResponseDto { prerequisites?: string[]; @Expose() - metadata!: Record; + metadata!: Record; // ===================================================== // AUDIT FIELDS diff --git a/projects/gamilit/apps/backend/src/modules/educational/dto/exercises/submit-exercise.dto.ts b/projects/gamilit/apps/backend/src/modules/educational/dto/exercises/submit-exercise.dto.ts index 31f411e..9956455 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/dto/exercises/submit-exercise.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/dto/exercises/submit-exercise.dto.ts @@ -60,7 +60,7 @@ export class SubmitExerciseDto { @IsOptional() @IsObject({ message: 'answers must be an object' }) @IsNotEmpty({ message: 'answers cannot be empty' }) - answers?: Record; + answers?: Record; /** * Timestamp de inicio del ejercicio (milisegundos desde epoch) @@ -133,7 +133,7 @@ export class SubmitExerciseDto { }) @IsOptional() @IsObject() - submitted_answers?: Record; + submitted_answers?: Record; /** * @deprecated Usar 'startedAt' para calcular tiempo diff --git a/projects/gamilit/apps/backend/src/modules/educational/dto/media/media-response.dto.ts b/projects/gamilit/apps/backend/src/modules/educational/dto/media/media-response.dto.ts index 521edcb..340bce4 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/dto/media/media-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/dto/media/media-response.dto.ts @@ -211,7 +211,7 @@ export class MediaResponseDto { * Metadatos adicionales */ @Expose() - metadata!: Record; + metadata!: Record; /** * Fecha de creación diff --git a/projects/gamilit/apps/backend/src/modules/educational/dto/media/upload-media.dto.ts b/projects/gamilit/apps/backend/src/modules/educational/dto/media/upload-media.dto.ts index 60cef3f..5af0ffb 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/dto/media/upload-media.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/dto/media/upload-media.dto.ts @@ -246,5 +246,5 @@ export class UploadMediaDto { */ @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/educational/dto/module4/infografia-interactiva-answer.dto.ts b/projects/gamilit/apps/backend/src/modules/educational/dto/module4/infografia-interactiva-answer.dto.ts index d68263f..b2cb203 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/dto/module4/infografia-interactiva-answer.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/dto/module4/infografia-interactiva-answer.dto.ts @@ -46,7 +46,7 @@ export class InfografiaInteractivaAnswerDto { }, }) @IsObject({ message: 'answers must be an object' }) - answers: Record; + answers: Record; @ApiProperty({ description: diff --git a/projects/gamilit/apps/backend/src/modules/educational/dto/module4/navegacion-hipertextual-answer.dto.ts b/projects/gamilit/apps/backend/src/modules/educational/dto/module4/navegacion-hipertextual-answer.dto.ts index 339ae14..d897310 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/dto/module4/navegacion-hipertextual-answer.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/dto/module4/navegacion-hipertextual-answer.dto.ts @@ -59,5 +59,5 @@ export class NavegacionHipertextualAnswerDto { }, }) @IsObject({ message: 'information_found must be an object' }) - information_found: Record; + information_found: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/educational/dto/modules/create-module.dto.ts b/projects/gamilit/apps/backend/src/modules/educational/dto/modules/create-module.dto.ts index 9f04419..7bb5285 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/dto/modules/create-module.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/dto/modules/create-module.dto.ts @@ -66,7 +66,7 @@ export class CreateModuleDto { */ @IsOptional() @IsObject() - content?: Record; + content?: Record; /** * Índice de orden para la secuencia de módulos (REQUERIDO) @@ -345,14 +345,14 @@ export class CreateModuleDto { */ @IsOptional() @IsObject() - settings?: Record; + settings?: Record; /** * Metadatos adicionales (JSONB) */ @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; /** * Total de ejercicios en el módulo diff --git a/projects/gamilit/apps/backend/src/modules/educational/dto/modules/module-response.dto.ts b/projects/gamilit/apps/backend/src/modules/educational/dto/modules/module-response.dto.ts index 23f8435..477295f 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/dto/modules/module-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/dto/modules/module-response.dto.ts @@ -34,7 +34,7 @@ export class ModuleResponseDto { summary?: string; @Expose() - content!: Record; + content!: Record; @Expose() order_index!: number; @@ -165,10 +165,10 @@ export class ModuleResponseDto { cover_image_url?: string; @Expose() - settings!: Record; + settings!: Record; @Expose() - metadata!: Record; + metadata!: Record; // ===================================================== // AUDIT FIELDS diff --git a/projects/gamilit/apps/backend/src/modules/educational/dto/rubrics/create-rubric.dto.ts b/projects/gamilit/apps/backend/src/modules/educational/dto/rubrics/create-rubric.dto.ts index 44d096b..e8cf010 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/dto/rubrics/create-rubric.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/dto/rubrics/create-rubric.dto.ts @@ -65,7 +65,7 @@ export class CreateRubricDto { * Estructura: {"criteria_1": {"name": string, "levels": {}, "weight": number}} */ @IsObject() - criteria!: Record; + criteria!: Record; /** * Escala de puntuación en formato JSONB @@ -73,7 +73,7 @@ export class CreateRubricDto { */ @IsOptional() @IsObject() - scoring_scale?: Record; + scoring_scale?: Record; /** * Peso porcentual de esta rúbrica (1-100%) @@ -125,7 +125,7 @@ export class CreateRubricDto { */ @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; /** * ID del usuario que crea la rúbrica diff --git a/projects/gamilit/apps/backend/src/modules/educational/dto/rubrics/rubric-response.dto.ts b/projects/gamilit/apps/backend/src/modules/educational/dto/rubrics/rubric-response.dto.ts index c2816fa..4ca6fb5 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/dto/rubrics/rubric-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/dto/rubrics/rubric-response.dto.ts @@ -55,13 +55,13 @@ export class RubricResponseDto { * Criterios de evaluación en formato JSONB */ @Expose() - criteria!: Record; + criteria!: Record; /** * Escala de puntuación */ @Expose() - scoring_scale!: Record; + scoring_scale!: Record; /** * Peso porcentual de la rúbrica @@ -105,7 +105,7 @@ export class RubricResponseDto { * Metadatos adicionales */ @Expose() - metadata!: Record; + metadata!: Record; /** * ID del usuario que creó la rúbrica diff --git a/projects/gamilit/apps/backend/src/modules/educational/entities/assessment-rubric.entity.ts b/projects/gamilit/apps/backend/src/modules/educational/entities/assessment-rubric.entity.ts index 0ff71f2..9203c28 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/entities/assessment-rubric.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/entities/assessment-rubric.entity.ts @@ -76,14 +76,14 @@ export class AssessmentRubric { * Incluye niveles de logro con puntos y descripciones */ @Column({ type: 'jsonb', default: {} }) - criteria: Record = {}; + criteria: Record = {}; /** * Escala de puntuación en formato JSONB * Estructura: {"min": number, "max": number, "passing": number} */ @Column({ type: 'jsonb', default: { min: 0, max: 100, passing: 70 } }) - scoring_scale!: Record; + scoring_scale!: Record; /** * Peso porcentual de esta rúbrica en la evaluación total (1-100%) @@ -120,7 +120,7 @@ export class AssessmentRubric { * Puede incluir configuraciones específicas de evaluación */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * ID del usuario que creó la rúbrica diff --git a/projects/gamilit/apps/backend/src/modules/educational/entities/exercise.entity.ts b/projects/gamilit/apps/backend/src/modules/educational/entities/exercise.entity.ts index 8fda38d..9aac9b4 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/entities/exercise.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/entities/exercise.entity.ts @@ -150,7 +150,7 @@ export class Exercise { * - etc. */ @Column({ type: 'jsonb', default: {} }) - config!: Record; + config!: Record; /** * Contenido del ejercicio (JSONB) @@ -165,20 +165,20 @@ export class Exercise { correct_answers: [], }, }) - content!: Record; + content!: Record; /** * Solución del ejercicio (JSONB) * Información privada no visible para estudiantes durante la resolución */ @Column({ type: 'jsonb', nullable: true }) - solution?: Record; + solution?: Record; /** * Rúbrica de evaluación (JSONB) */ @Column({ type: 'jsonb', nullable: true }) - rubric?: Record; + rubric?: Record; // ===================================================== // GRADING & SCORING @@ -328,7 +328,7 @@ export class Exercise { segunda_oportunidad: { cost: 40, enabled: true }, }, }) - comodines_config!: Record; + comodines_config!: Record; // ===================================================== // GAMIFICATION & REWARDS @@ -423,7 +423,7 @@ export class Exercise { * Metadatos adicionales (JSONB) */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; // ===================================================== // AUDIT FIELDS diff --git a/projects/gamilit/apps/backend/src/modules/educational/entities/media-resource.entity.ts b/projects/gamilit/apps/backend/src/modules/educational/entities/media-resource.entity.ts index 7cf3434..3bde789 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/entities/media-resource.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/entities/media-resource.entity.ts @@ -241,7 +241,7 @@ export class MediaResource { * Puede incluir información técnica, codec, bitrate, etc. */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha y hora de creación del registro diff --git a/projects/gamilit/apps/backend/src/modules/educational/entities/module.entity.ts b/projects/gamilit/apps/backend/src/modules/educational/entities/module.entity.ts index 8a52576..e16c5b1 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/entities/module.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/entities/module.entity.ts @@ -94,7 +94,7 @@ export class Module { multimedia_resources: [], }, }) - content!: Record; + content!: Record; /** * Índice de orden para la secuencia de módulos @@ -350,13 +350,13 @@ export class Module { * Configuraciones del módulo (JSONB) */ @Column({ type: 'jsonb', default: {} }) - settings!: Record; + settings!: Record; /** * Metadatos adicionales (JSONB) */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; // ===================================================== // AUDIT FIELDS diff --git a/projects/gamilit/apps/backend/src/modules/educational/services/exercises.service.ts b/projects/gamilit/apps/backend/src/modules/educational/services/exercises.service.ts index 0c6de5c..2178a6d 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/services/exercises.service.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/services/exercises.service.ts @@ -195,8 +195,8 @@ export class ExercisesService { */ validateContentByExerciseType( exerciseType: ExerciseTypeEnum, - content: Record, - config?: Record, + content: Record, + config?: Record, ): void { if (!content) { throw new BadRequestException('Content is required'); @@ -474,10 +474,10 @@ export class ExercisesService { * @returns Sanitized content without correct answers */ private sanitizeContent( - content: Record, - config: Record, + content: Record, + config: Record, exerciseType: ExerciseTypeEnum, - ): Record { + ): Record { if (!content) { return content; } diff --git a/projects/gamilit/apps/backend/src/modules/educational/services/media.service.ts b/projects/gamilit/apps/backend/src/modules/educational/services/media.service.ts index 03f91a5..1967ec5 100644 --- a/projects/gamilit/apps/backend/src/modules/educational/services/media.service.ts +++ b/projects/gamilit/apps/backend/src/modules/educational/services/media.service.ts @@ -85,7 +85,7 @@ export class MediaService { async updateProcessingStatus( id: string, status: ProcessingStatusEnum, - metadata?: Record, + metadata?: Record, ): Promise { const media = await this.findById(id); if (!media) { diff --git a/projects/gamilit/apps/backend/src/modules/gamification/controllers/classroom-missions.controller.ts b/projects/gamilit/apps/backend/src/modules/gamification/controllers/classroom-missions.controller.ts index 4fdd464..d2461d5 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/controllers/classroom-missions.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/controllers/classroom-missions.controller.ts @@ -141,7 +141,7 @@ export class ClassroomMissionsController { async assignMissionToClassroom( @Param('classroomId') classroomId: string, @Body() dto: AssignClassroomMissionDto, - @Request() req: any, + @Request() req: AuthRequest, ) { const teacherId = req.user.id; return this.classroomMissionsService.assignMissionToClassroom(classroomId, teacherId, dto); diff --git a/projects/gamilit/apps/backend/src/modules/gamification/controllers/mission-templates.controller.ts b/projects/gamilit/apps/backend/src/modules/gamification/controllers/mission-templates.controller.ts index 8bfa60d..4481e79 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/controllers/mission-templates.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/controllers/mission-templates.controller.ts @@ -204,7 +204,7 @@ export class MissionTemplatesController { status: 400, description: 'Datos inválidos', }) - async create(@Body() dto: CreateMissionTemplateDto, @Request() req: any) { + async create(@Body() dto: CreateMissionTemplateDto, @Request() req: AuthRequest) { const createdBy = req.user.id; return this.templatesService.create(dto, createdBy); } diff --git a/projects/gamilit/apps/backend/src/modules/gamification/controllers/missions.controller.ts b/projects/gamilit/apps/backend/src/modules/gamification/controllers/missions.controller.ts index 26198bb..5a64cc4 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/controllers/missions.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/controllers/missions.controller.ts @@ -110,7 +110,7 @@ export class MissionsController { status: 401, description: 'No autenticado - Token JWT inválido o ausente', }) - async getDailyMissions(@Request() req: any) { + async getDailyMissions(@Request() req: AuthRequest) { const userId = req.user.id; return this.missionsService.findByTypeAndUser(userId, MissionTypeEnum.DAILY); } @@ -179,7 +179,7 @@ export class MissionsController { status: 401, description: 'No autenticado - Token JWT inválido o ausente', }) - async getWeeklyMissions(@Request() req: any) { + async getWeeklyMissions(@Request() req: AuthRequest) { const userId = req.user.id; return this.missionsService.findByTypeAndUser(userId, MissionTypeEnum.WEEKLY); } @@ -234,7 +234,7 @@ export class MissionsController { status: 401, description: 'No autenticado - Token JWT inválido o ausente', }) - async getSpecialMissions(@Request() req: any) { + async getSpecialMissions(@Request() req: AuthRequest) { const userId = req.user.id; return this.missionsService.findByTypeAndUser(userId, MissionTypeEnum.SPECIAL); } @@ -297,7 +297,7 @@ export class MissionsController { status: 403, description: 'Acceso denegado - El userId no coincide con el usuario autenticado', }) - async getStats(@Param('userId') userId: string, @Request() req: any) { + async getStats(@Param('userId') userId: string, @Request() req: AuthRequest) { // Validar que el userId coincide con el usuario autenticado if (userId !== req.user.id) { throw new HttpException('Forbidden: Cannot access stats of another user', HttpStatus.FORBIDDEN); @@ -360,7 +360,7 @@ export class MissionsController { status: 404, description: 'Misión no encontrada', }) - async startMission(@Param('id') missionId: string, @Request() req: any) { + async startMission(@Param('id') missionId: string, @Request() req: AuthRequest) { const userId = req.user.id; return this.missionsService.startMission(missionId, userId); } @@ -447,7 +447,7 @@ export class MissionsController { async updateProgress( @Param('id') missionId: string, @Body() dto: UpdateMissionProgressDto, - @Request() req: any, + @Request() req: AuthRequest, ) { const userId = req.user.id; return this.missionsService.updateProgress( @@ -566,7 +566,7 @@ export class MissionsController { status: 404, description: 'Misión no encontrada', }) - async claimRewards(@Param('id') missionId: string, @Request() req: any) { + async claimRewards(@Param('id') missionId: string, @Request() req: AuthRequest) { const userId = req.user.id; const result = await this.missionsService.claimRewards(missionId, userId); return { success: true, data: result }; diff --git a/projects/gamilit/apps/backend/src/modules/gamification/controllers/ranks.controller.ts b/projects/gamilit/apps/backend/src/modules/gamification/controllers/ranks.controller.ts index 3ead4da..6a38236 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/controllers/ranks.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/controllers/ranks.controller.ts @@ -110,7 +110,7 @@ export class RanksController { }) @ApiResponse({ status: 401, description: 'No autenticado' }) @ApiResponse({ status: 404, description: 'Usuario sin rango inicializado' }) - async getCurrentRank(@Request() req: any): Promise { + async getCurrentRank(@Request() req: AuthRequest): Promise { const userId = req.user.sub; return this.ranksService.getCurrentRank(userId); } diff --git a/projects/gamilit/apps/backend/src/modules/gamification/controllers/user-stats.controller.ts b/projects/gamilit/apps/backend/src/modules/gamification/controllers/user-stats.controller.ts index 4811b69..161172c 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/controllers/user-stats.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/controllers/user-stats.controller.ts @@ -281,7 +281,7 @@ export class UserStatsController { }) async updateUserStats( @Param('userId') userId: string, - @Body() updateData: Record, + @Body() updateData: Record, ) { // Support increment operations for convenience const stats = await this.userStatsService.findByUserId(userId); diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/achievements/achievement-response.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/achievements/achievement-response.dto.ts index bc014c9..c764ccd 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/achievements/achievement-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/achievements/achievement-response.dto.ts @@ -47,10 +47,10 @@ export class AchievementResponseDto { // ===================================================== @Expose() - conditions!: Record; + conditions!: Record; @Expose() - rewards!: Record; + rewards!: Record; @Expose() ml_coins_reward!: number; @@ -96,7 +96,7 @@ export class AchievementResponseDto { // ===================================================== @Expose() - metadata!: Record; + metadata!: Record; @Expose() created_by?: string; diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/achievements/create-achievement.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/achievements/create-achievement.dto.ts index 0a92222..44844b3 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/achievements/create-achievement.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/achievements/create-achievement.dto.ts @@ -83,14 +83,14 @@ export class CreateAchievementDto { * Condiciones JSON para desbloquear (REQUERIDO) */ @IsObject() - conditions!: Record; + conditions!: Record; /** * Recompensas JSON otorgadas */ @IsOptional() @IsObject() - rewards?: Record; + rewards?: Record; /** * Recompensa de ML Coins @@ -153,7 +153,7 @@ export class CreateAchievementDto { @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; @IsOptional() @IsUUID() diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/achievements/update-achievement.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/achievements/update-achievement.dto.ts index 8d12a29..d3d64e1 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/achievements/update-achievement.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/achievements/update-achievement.dto.ts @@ -58,11 +58,11 @@ export class UpdateAchievementDto { @IsOptional() @IsObject() - conditions?: Record; + conditions?: Record; @IsOptional() @IsObject() - rewards?: Record; + rewards?: Record; @IsOptional() @IsInt() @@ -122,5 +122,5 @@ export class UpdateAchievementDto { @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/comodines/inventory-response.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/comodines/inventory-response.dto.ts index 30438bf..a11c091 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/comodines/inventory-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/comodines/inventory-response.dto.ts @@ -78,7 +78,7 @@ export class InventoryResponseDto { description: 'Metadatos adicionales', example: { last_purchase_date: '2025-11-01T10:00:00Z' }, }) - metadata!: Record; + metadata!: Record; @ApiProperty({ description: 'Fecha de creación', diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/leaderboard/leaderboard-entry.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/leaderboard/leaderboard-entry.dto.ts index de0801c..0b623a2 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/leaderboard/leaderboard-entry.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/leaderboard/leaderboard-entry.dto.ts @@ -73,5 +73,5 @@ export class LeaderboardEntryDto { * Metadata adicional (escuela, aula, etc.) */ @Expose() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/mission-templates/create-mission-template.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/mission-templates/create-mission-template.dto.ts index 38d7306..80a4fba 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/mission-templates/create-mission-template.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/mission-templates/create-mission-template.dto.ts @@ -197,5 +197,5 @@ export class CreateMissionTemplateDto { }) @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/mission-templates/mission-template.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/mission-templates/mission-template.dto.ts index 8f2f6cf..bf26961 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/mission-templates/mission-template.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/mission-templates/mission-template.dto.ts @@ -125,7 +125,7 @@ export class MissionTemplateDto { description: 'Additional metadata', example: { tags: ['beginner', 'daily'] }, }) - metadata!: Record; + metadata!: Record; @ApiProperty({ description: 'Creation timestamp', diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/missions/assign-classroom-mission.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/missions/assign-classroom-mission.dto.ts index ef4b402..8e7d414 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/missions/assign-classroom-mission.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/missions/assign-classroom-mission.dto.ts @@ -177,5 +177,5 @@ export class AssignClassroomMissionDto { }) @IsObject() @IsOptional() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/missions/classroom-mission-response.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/missions/classroom-mission-response.dto.ts index 0a41d67..cbedbd0 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/missions/classroom-mission-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/missions/classroom-mission-response.dto.ts @@ -144,7 +144,7 @@ export class ClassroomMissionResponseDto { custom_instructions: 'Complete before Friday', }, }) - metadata!: Record; + metadata!: Record; @ApiProperty({ description: 'Creation timestamp', diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/ml-coins/create-transaction.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/ml-coins/create-transaction.dto.ts index 780d80c..21841d1 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/ml-coins/create-transaction.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/ml-coins/create-transaction.dto.ts @@ -113,5 +113,5 @@ export class CreateTransactionDto { }) @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/ml-coins/transaction-response.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/ml-coins/transaction-response.dto.ts index 207b1e7..1d7e086 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/ml-coins/transaction-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/ml-coins/transaction-response.dto.ts @@ -85,7 +85,7 @@ export class TransactionResponseDto { description: 'Metadatos adicionales', example: { exercise_difficulty: 'hard', perfect_score: true }, }) - metadata!: Record; + metadata!: Record; @ApiProperty({ description: 'Fecha de creación', diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-achievements/grant-achievement.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-achievements/grant-achievement.dto.ts index 0dc6d22..6a8c262 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-achievements/grant-achievement.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-achievements/grant-achievement.dto.ts @@ -70,7 +70,7 @@ export class GrantAchievementDto { */ @IsObject({ message: 'progress_data debe ser un objeto JSON válido' }) @IsOptional() - progress_data?: Record; + progress_data?: Record; /** * Metadata adicional @@ -79,5 +79,5 @@ export class GrantAchievementDto { */ @IsObject({ message: 'metadata debe ser un objeto JSON válido' }) @IsOptional() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-achievements/user-achievement-response.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-achievements/user-achievement-response.dto.ts index 7cc9376..e4c060a 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-achievements/user-achievement-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-achievements/user-achievement-response.dto.ts @@ -44,16 +44,16 @@ export class UserAchievementResponseDto { rewards_claimed!: boolean; @Expose() - rewards_received!: Record; + rewards_received!: Record; @Expose() - progress_data!: Record; + progress_data!: Record; @Expose() milestones_reached!: string[] | null; @Expose() - metadata!: Record; + metadata!: Record; @Expose() @Type(() => Date) diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-ranks/create-user-rank.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-ranks/create-user-rank.dto.ts index 93ba9af..4efba3e 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-ranks/create-user-rank.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-ranks/create-user-rank.dto.ts @@ -116,5 +116,5 @@ export class CreateUserRankDto { @IsOptional() @IsObject() - rank_metadata?: Record; + rank_metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-ranks/update-user-rank.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-ranks/update-user-rank.dto.ts index 49465d4..acda81a 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-ranks/update-user-rank.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-ranks/update-user-rank.dto.ts @@ -121,5 +121,5 @@ export class UpdateUserRankDto { */ @IsOptional() @IsObject() - rank_metadata?: Record; + rank_metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-ranks/user-rank-response.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-ranks/user-rank-response.dto.ts index 43583d3..7f87af7 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-ranks/user-rank-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-ranks/user-rank-response.dto.ts @@ -75,7 +75,7 @@ export class UserRankResponseDto { is_current!: boolean; @Expose() - rank_metadata!: Record; + rank_metadata!: Record; // ===================================================== // AUDIT diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-stats/update-user-stats.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-stats/update-user-stats.dto.ts index f58a373..433c93b 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-stats/update-user-stats.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-stats/update-user-stats.dto.ts @@ -217,5 +217,5 @@ export class UpdateUserStatsDto { @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-stats/user-stats-response.dto.ts b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-stats/user-stats-response.dto.ts index 97a232f..61c599e 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/dto/user-stats/user-stats-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/dto/user-stats/user-stats-response.dto.ts @@ -157,7 +157,7 @@ export class UserStatsResponseDto { // ===================================================== @Expose() - metadata!: Record; + metadata!: Record; @Expose() created_at!: Date; diff --git a/projects/gamilit/apps/backend/src/modules/gamification/entities/achievement.entity.ts b/projects/gamilit/apps/backend/src/modules/gamification/entities/achievement.entity.ts index 08f662a..02ebd04 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/entities/achievement.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/entities/achievement.entity.ts @@ -104,14 +104,14 @@ export class Achievement { * Ejemplo: {"type": "progress", "requirements": {"exercises_completed": 10}} */ @Column({ type: 'jsonb' }) - conditions!: Record; + conditions!: Record; /** * Recompensas JSON otorgadas al desbloquear * Ejemplo: {"xp": 100, "badge": null, "ml_coins": 50} */ @Column({ type: 'jsonb', default: { xp: 100, badge: null, ml_coins: 50 } }) - rewards!: Record; + rewards!: Record; /** * Recompensa de ML Coins (campo adicional para queries rápidas) @@ -187,7 +187,7 @@ export class Achievement { * Metadatos adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * ID del usuario que creó el achievement diff --git a/projects/gamilit/apps/backend/src/modules/gamification/entities/comodin-usage-log.entity.ts b/projects/gamilit/apps/backend/src/modules/gamification/entities/comodin-usage-log.entity.ts index 3a0f042..9f90f86 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/entities/comodin-usage-log.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/entities/comodin-usage-log.entity.ts @@ -92,14 +92,14 @@ export class ComodinUsageLog { * Ejemplo: hint text, highlighted text */ @Column({ type: 'jsonb', nullable: true }) - value_provided?: Record; + value_provided?: Record; /** * Contexto adicional del uso (JSONB) * Ejemplo: tiempo restante, intentos previos */ @Column({ type: 'jsonb', default: {} }) - usage_context!: Record; + usage_context!: Record; // ===================================================== // TIMESTAMP diff --git a/projects/gamilit/apps/backend/src/modules/gamification/entities/comodines-inventory.entity.ts b/projects/gamilit/apps/backend/src/modules/gamification/entities/comodines-inventory.entity.ts index 1f9f27c..d8b9fb3 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/entities/comodines-inventory.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/entities/comodines-inventory.entity.ts @@ -93,7 +93,7 @@ export class ComodinesInventory { segunda_oportunidad_cost!: number; @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; @CreateDateColumn({ type: 'timestamp with time zone' }) created_at!: Date; diff --git a/projects/gamilit/apps/backend/src/modules/gamification/entities/inventory-transaction.entity.ts b/projects/gamilit/apps/backend/src/modules/gamification/entities/inventory-transaction.entity.ts index 8394b4b..cae4f08 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/entities/inventory-transaction.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/entities/inventory-transaction.entity.ts @@ -74,7 +74,7 @@ export class InventoryTransaction { * - { "exercise_id": "uuid-...", "success": true } para USE */ @Column({ type: 'jsonb', nullable: true }) - metadata!: Record | null; + metadata!: Record | null; @Column({ type: 'timestamptz', default: () => 'NOW()' }) created_at!: Date; diff --git a/projects/gamilit/apps/backend/src/modules/gamification/entities/mission-template.entity.ts b/projects/gamilit/apps/backend/src/modules/gamification/entities/mission-template.entity.ts index 7e9c046..8159815 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/entities/mission-template.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/entities/mission-template.entity.ts @@ -133,7 +133,7 @@ export class MissionTemplate { color!: string | null; @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; // Audit @CreateDateColumn({ type: 'timestamp with time zone' }) diff --git a/projects/gamilit/apps/backend/src/modules/gamification/entities/ml-coins-transaction.entity.ts b/projects/gamilit/apps/backend/src/modules/gamification/entities/ml-coins-transaction.entity.ts index 5910466..ceb7727 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/entities/ml-coins-transaction.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/entities/ml-coins-transaction.entity.ts @@ -81,7 +81,7 @@ export class MLCoinsTransaction { bonus_applied!: boolean; @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; @CreateDateColumn({ type: 'timestamp with time zone' }) created_at!: Date; diff --git a/projects/gamilit/apps/backend/src/modules/gamification/entities/shop-category.entity.ts b/projects/gamilit/apps/backend/src/modules/gamification/entities/shop-category.entity.ts index 6cf8e84..acf5848 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/entities/shop-category.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/entities/shop-category.entity.ts @@ -79,7 +79,7 @@ export class ShopCategory { * Metadatos adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha y hora de creación del registro diff --git a/projects/gamilit/apps/backend/src/modules/gamification/entities/shop-item.entity.ts b/projects/gamilit/apps/backend/src/modules/gamification/entities/shop-item.entity.ts index f599e5b..ab85061 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/entities/shop-item.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/entities/shop-item.entity.ts @@ -192,7 +192,7 @@ export class ShopItem { * Ejemplo: {"type": "xp_boost", "multiplier": 2.0, "duration_minutes": 60} */ @Column({ type: 'jsonb', nullable: true }) - effect_data?: Record; + effect_data?: Record; // ===================================================== // METADATA & AUDIT @@ -202,7 +202,7 @@ export class ShopItem { * Metadatos adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * ID del usuario que creó el item diff --git a/projects/gamilit/apps/backend/src/modules/gamification/entities/user-achievement.entity.ts b/projects/gamilit/apps/backend/src/modules/gamification/entities/user-achievement.entity.ts index 5659073..98aa1a6 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/entities/user-achievement.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/entities/user-achievement.entity.ts @@ -92,14 +92,14 @@ export class UserAchievement { * Ejemplo: { "ml_coins": 50, "items": [{"type": "boost_xp", "quantity": 1}] } */ @Column({ type: 'jsonb', default: {} }) - rewards_received!: Record; + rewards_received!: Record; /** * Datos de progreso específicos por achievement (JSONB) * Ejemplo: { "levels_completed": [1, 2, 5], "current_streak": 3 } */ @Column({ type: 'jsonb', default: {} }) - progress_data!: Record; + progress_data!: Record; /** * Milestones alcanzados (array de strings) @@ -112,7 +112,7 @@ export class UserAchievement { * Metadata adicional en JSONB */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha en que el usuario comenzó a trabajar en el achievement diff --git a/projects/gamilit/apps/backend/src/modules/gamification/entities/user-purchase.entity.ts b/projects/gamilit/apps/backend/src/modules/gamification/entities/user-purchase.entity.ts index 30f9db3..111c1e0 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/entities/user-purchase.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/entities/user-purchase.entity.ts @@ -120,7 +120,7 @@ export class UserPurchase { * Ejemplo: {"applied_at": "...", "effect": {...}} */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha y hora de la compra diff --git a/projects/gamilit/apps/backend/src/modules/gamification/entities/user-rank.entity.ts b/projects/gamilit/apps/backend/src/modules/gamification/entities/user-rank.entity.ts index 8da799d..6fa4f2f 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/entities/user-rank.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/entities/user-rank.entity.ts @@ -162,7 +162,7 @@ export class UserRank { * Metadatos adicionales del rango en formato JSON */ @Column({ type: 'jsonb', default: {} }) - rank_metadata!: Record; + rank_metadata!: Record; // ===================================================== // AUDIT diff --git a/projects/gamilit/apps/backend/src/modules/gamification/entities/user-stats.entity.ts b/projects/gamilit/apps/backend/src/modules/gamification/entities/user-stats.entity.ts index 72c5c78..86fe6ce 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/entities/user-stats.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/entities/user-stats.entity.ts @@ -292,7 +292,7 @@ export class UserStats { * Metadatos adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha y hora de creación del registro diff --git a/projects/gamilit/apps/backend/src/modules/gamification/services/achievements.service.ts b/projects/gamilit/apps/backend/src/modules/gamification/services/achievements.service.ts index 3e56377..72944c6 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/services/achievements.service.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/services/achievements.service.ts @@ -244,7 +244,7 @@ export class AchievementsService { /** * Evalúa si las estadísticas del usuario cumplen con las condiciones del logro */ - private meetsConditions(userStats: UserStats, conditions: Record): boolean { + private meetsConditions(userStats: UserStats, conditions: Record): boolean { const type = conditions.type || 'generic'; switch (type) { diff --git a/projects/gamilit/apps/backend/src/modules/gamification/services/missions.service.ts b/projects/gamilit/apps/backend/src/modules/gamification/services/missions.service.ts index f89fe69..dea1916 100644 --- a/projects/gamilit/apps/backend/src/modules/gamification/services/missions.service.ts +++ b/projects/gamilit/apps/backend/src/modules/gamification/services/missions.service.ts @@ -83,7 +83,8 @@ export class MissionsService { try { const stats = await this.userStatsService.findByUserId(userId); return stats.level || 1; - } catch () { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (_error) { this.logger.warn(`Could not fetch user level for ${userId}, defaulting to 1`); return 1; } diff --git a/projects/gamilit/apps/backend/src/modules/health/__tests__/health.e2e-spec.ts b/projects/gamilit/apps/backend/src/modules/health/__tests__/health.e2e-spec.ts index f816537..6c599db 100644 --- a/projects/gamilit/apps/backend/src/modules/health/__tests__/health.e2e-spec.ts +++ b/projects/gamilit/apps/backend/src/modules/health/__tests__/health.e2e-spec.ts @@ -199,7 +199,7 @@ describe('HealthController (e2e)', () => { const startTime = Date.now(); return request(app.getHttpServer()) .get('/health') - .expect((res: any) => { + .expect((_res: any) => { const duration = Date.now() - startTime; expect(duration).toBeLessThan(5000); // 5 seconds max }); diff --git a/projects/gamilit/apps/backend/src/modules/health/__tests__/health.service.spec.ts b/projects/gamilit/apps/backend/src/modules/health/__tests__/health.service.spec.ts index 0930c30..b7a8dc4 100644 --- a/projects/gamilit/apps/backend/src/modules/health/__tests__/health.service.spec.ts +++ b/projects/gamilit/apps/backend/src/modules/health/__tests__/health.service.spec.ts @@ -17,7 +17,7 @@ describe('HealthService', () => { let configService: jest.Mocked; const createMockDataSource = (isHealthy = true): jest.Mocked => ({ - query: jest.fn().mockImplementation((sql: string?: any[]) => { + query: jest.fn().mockImplementation((sql: string, _params?: any[]) => { if (isHealthy) { if (sql.includes('SELECT 1')) { return Promise.resolve([{ '?column?': 1 }]); @@ -45,7 +45,7 @@ describe('HealthService', () => { configService = { get: jest.fn().mockImplementation((key: string, defaultValue?: any) => { - const config: Record = { + const config: Record = { NODE_ENV: 'test', npm_package_version: '1.0.0', }; diff --git a/projects/gamilit/apps/backend/src/modules/health/dto/health-check.dto.ts b/projects/gamilit/apps/backend/src/modules/health/dto/health-check.dto.ts index 9af2b44..a32efd3 100644 --- a/projects/gamilit/apps/backend/src/modules/health/dto/health-check.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/health/dto/health-check.dto.ts @@ -10,7 +10,7 @@ export interface HealthCheckDetailDto { status: HealthStatus; responseTime: number; message: string; - details?: Record; + details?: Record; } export interface HealthCheckDto { @@ -52,7 +52,7 @@ export class HealthCheckDetailSchema { required: false, example: { tables: 122 }, }) - details?: Record; + details?: Record; } export class HealthCheckSchema { @@ -96,7 +96,7 @@ export class HealthCheckSchema { }, }, }) - checks!: Record; + checks!: Record; @ApiProperty({ description: 'Application version', diff --git a/projects/gamilit/apps/backend/src/modules/notifications/controllers/notification-devices.controller.ts b/projects/gamilit/apps/backend/src/modules/notifications/controllers/notification-devices.controller.ts index baf4790..0402704 100644 --- a/projects/gamilit/apps/backend/src/modules/notifications/controllers/notification-devices.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/notifications/controllers/notification-devices.controller.ts @@ -144,7 +144,7 @@ export class NotificationDevicesController { }) async registerDevice( @Body() registerDto: RegisterDeviceDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user.sub; @@ -185,7 +185,7 @@ export class NotificationDevicesController { status: 401, description: 'No autenticado', }) - async getUserDevices(@Request() req: any): Promise { + async getUserDevices(@Request() req: AuthRequest): Promise { const userId = req.user.sub; const devices = await this.deviceService.getUserDevices(userId, false); @@ -234,7 +234,7 @@ export class NotificationDevicesController { }) async getDeviceById( @Param('id') deviceId: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user.sub; const device = await this.deviceService.getDeviceById(deviceId, userId); @@ -286,7 +286,7 @@ export class NotificationDevicesController { async updateDeviceName( @Param('id') deviceId: string, @Body() updateDto: UpdateDeviceNameDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user.sub; @@ -345,7 +345,7 @@ export class NotificationDevicesController { }) async deleteDevice( @Param('id') deviceId: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user.sub; await this.deviceService.deleteDevice(deviceId, userId); diff --git a/projects/gamilit/apps/backend/src/modules/notifications/controllers/notification-multichannel.controller.ts b/projects/gamilit/apps/backend/src/modules/notifications/controllers/notification-multichannel.controller.ts index eaf3ef2..7a2c50a 100644 --- a/projects/gamilit/apps/backend/src/modules/notifications/controllers/notification-multichannel.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/notifications/controllers/notification-multichannel.controller.ts @@ -107,7 +107,7 @@ export class NotificationMultiChannelController { }) async createMultiChannel( @Body() createDto: CreateNotificationDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { // Validar que el usuario solo crea notificaciones para sí mismo // (a menos que sea admin - validación futura) @@ -192,7 +192,7 @@ export class NotificationMultiChannelController { }) async sendFromTemplate( @Body() sendDto: SendFromTemplateDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { // Validar ownership if (sendDto.userId !== req.user.sub) { diff --git a/projects/gamilit/apps/backend/src/modules/notifications/controllers/notification-preferences.controller.ts b/projects/gamilit/apps/backend/src/modules/notifications/controllers/notification-preferences.controller.ts index 2879c53..a62ffd6 100644 --- a/projects/gamilit/apps/backend/src/modules/notifications/controllers/notification-preferences.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/notifications/controllers/notification-preferences.controller.ts @@ -82,7 +82,7 @@ export class NotificationPreferencesController { description: 'No autenticado', }) async getUserPreferences( - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user.sub; const preferences = await this.preferenceService.getUserPreferences(userId); @@ -128,7 +128,7 @@ export class NotificationPreferencesController { async updatePreference( @Param('notificationType') notificationType: string, @Body() updateDto: UpdatePreferenceDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user.sub; @@ -175,7 +175,7 @@ export class NotificationPreferencesController { }) async updateMultiple( @Body() updateDto: UpdateMultiplePreferencesDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user.sub; diff --git a/projects/gamilit/apps/backend/src/modules/notifications/dto/notifications/send-from-template.dto.ts b/projects/gamilit/apps/backend/src/modules/notifications/dto/notifications/send-from-template.dto.ts index d524a02..2469359 100644 --- a/projects/gamilit/apps/backend/src/modules/notifications/dto/notifications/send-from-template.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/notifications/dto/notifications/send-from-template.dto.ts @@ -202,5 +202,5 @@ export class SendFromTemplateDto { }) @IsObject() @IsOptional() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/notifications/entities/multichannel/notification-log.entity.ts b/projects/gamilit/apps/backend/src/modules/notifications/entities/multichannel/notification-log.entity.ts index f08e14e..48eb1ee 100644 --- a/projects/gamilit/apps/backend/src/modules/notifications/entities/multichannel/notification-log.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/notifications/entities/multichannel/notification-log.entity.ts @@ -169,7 +169,7 @@ export class NotificationLog { * @optional */ @Column({ type: 'jsonb', nullable: true }) - metadata?: Record; + metadata?: Record; @CreateDateColumn({ name: 'created_at', type: 'timestamp with time zone' }) createdAt!: Date; diff --git a/projects/gamilit/apps/backend/src/modules/notifications/entities/multichannel/notification.entity.ts b/projects/gamilit/apps/backend/src/modules/notifications/entities/multichannel/notification.entity.ts index bb3036c..98324ae 100644 --- a/projects/gamilit/apps/backend/src/modules/notifications/entities/multichannel/notification.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/notifications/entities/multichannel/notification.entity.ts @@ -80,7 +80,7 @@ export class Notification { * - assignment: { assignment_id, due_date } */ @Column({ type: 'jsonb', nullable: true, default: {} }) - data?: Record; + data?: Record; /** * Prioridad de la notificación @@ -129,5 +129,5 @@ export class Notification { * Para datos que no encajan en 'data': icon, action_url, related_entity_type/id */ @Column({ type: 'jsonb', nullable: true, default: {} }) - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/notifications/services/notification-queue.service.ts b/projects/gamilit/apps/backend/src/modules/notifications/services/notification-queue.service.ts index 7d12117..d61a647 100644 --- a/projects/gamilit/apps/backend/src/modules/notifications/services/notification-queue.service.ts +++ b/projects/gamilit/apps/backend/src/modules/notifications/services/notification-queue.service.ts @@ -347,7 +347,7 @@ export class NotificationQueueService { title: notification.title, body: notification.message, icon: notification.data?.icon as string | undefined, - data: notification.data as Record | undefined, + data: notification.data as Record | undefined, }, ); diff --git a/projects/gamilit/apps/backend/src/modules/notifications/services/notification.service.ts b/projects/gamilit/apps/backend/src/modules/notifications/services/notification.service.ts index c47df7f..9602b35 100644 --- a/projects/gamilit/apps/backend/src/modules/notifications/services/notification.service.ts +++ b/projects/gamilit/apps/backend/src/modules/notifications/services/notification.service.ts @@ -50,8 +50,8 @@ export class NotificationService { title: string; message: string; type: string; - data?: Record; - metadata?: Record; + data?: Record; + metadata?: Record; priority?: string; channels?: string[]; expiresAt?: Date; @@ -97,7 +97,7 @@ export class NotificationService { variables: Record; type?: string; channels?: string[]; - metadata?: Record; + metadata?: Record; }): Promise { // 1. Renderizar template const rendered = await this.templateService.renderTemplate( diff --git a/projects/gamilit/apps/backend/src/modules/notifications/services/push-notification.service.ts b/projects/gamilit/apps/backend/src/modules/notifications/services/push-notification.service.ts index 7159680..8e9bbd6 100644 --- a/projects/gamilit/apps/backend/src/modules/notifications/services/push-notification.service.ts +++ b/projects/gamilit/apps/backend/src/modules/notifications/services/push-notification.service.ts @@ -163,7 +163,7 @@ export class PushNotificationService implements OnModuleInit { icon?: string; badge?: string; tag?: string; - data?: Record; + data?: Record; }, ): Promise { if (!this.isInitialized) { @@ -226,7 +226,7 @@ export class PushNotificationService implements OnModuleInit { title: string; body: string; icon?: string; - data?: Record; + data?: Record; }, ): Promise { try { @@ -268,7 +268,7 @@ export class PushNotificationService implements OnModuleInit { title: string; body: string; icon?: string; - data?: Record; + data?: Record; }, ): Promise<{ successCount: number; diff --git a/projects/gamilit/apps/backend/src/modules/progress/controllers/exercise-submission.controller.ts b/projects/gamilit/apps/backend/src/modules/progress/controllers/exercise-submission.controller.ts index c1baa1b..90560ae 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/controllers/exercise-submission.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/controllers/exercise-submission.controller.ts @@ -394,7 +394,7 @@ export class ExerciseSubmissionController { async gradeSubmission( @Param('id') id: string, @Body() gradeDto: GradeSubmissionDto, - @Request() req: any, + @Request() req: AuthRequest, ) { // P1-003 FIX: Pass manual grading data to service // If final_score is provided, use manual grading. Otherwise, use auto-grading. @@ -479,7 +479,7 @@ export class ExerciseSubmissionController { async provideFeedback( @Param('id') id: string, @Body() body: { feedback: object }, - @Request() req: any, + @Request() _req: any, ) { // req.user contains the authenticated teacher's data from JWT return this.submissionService.provideFeedback(id, body.feedback); @@ -625,7 +625,7 @@ export class ExerciseSubmissionController { status: 403, description: 'Acceso denegado - Se requieren permisos de profesor', }) - async findPendingReview(@Request() req: any) { + async findPendingReview(@Request() _req: any) { // req.user contains the authenticated teacher's data from JWT return this.submissionService.findPendingReview(); } @@ -749,7 +749,7 @@ export class ExerciseSubmissionController { description: 'Usuario o ejercicio no encontrado', }) async autoSaveProgress( - @Request() req: any, + @Request() req: AuthRequest, @Param('exerciseId') exerciseId: string, @Body() dto: AutoSaveProgressDto, ) { @@ -841,7 +841,7 @@ export class ExerciseSubmissionController { description: 'Usuario o ejercicio no existe en el sistema', }) async getAutoSavedProgress( - @Request() req: any, + @Request() req: AuthRequest, @Param('exerciseId') exerciseId: string, ) { // Extraer userId del JWT diff --git a/projects/gamilit/apps/backend/src/modules/progress/dto/autosave-progress.dto.ts b/projects/gamilit/apps/backend/src/modules/progress/dto/autosave-progress.dto.ts index 74f155d..5841925 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/dto/autosave-progress.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/dto/autosave-progress.dto.ts @@ -64,7 +64,7 @@ export class AutoSaveProgressDto { @IsObject() @Expose({ name: 'partialAnswers' }) @Transform(({ obj }) => obj.partial_answers || obj.partialAnswers) - partial_answers?: Record; + partial_answers?: Record; /** * Tiempo transcurrido en el ejercicio (segundos) @@ -115,5 +115,5 @@ export class AutoSaveProgressDto { }) @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/progress/dto/autosave-response.dto.ts b/projects/gamilit/apps/backend/src/modules/progress/dto/autosave-response.dto.ts index 5ecbf77..23a384e 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/dto/autosave-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/dto/autosave-response.dto.ts @@ -47,7 +47,7 @@ export class AutoSaveResponseDto { question_2: { option: 'A' }, }, }) - partial_answers!: Record; + partial_answers!: Record; /** * Tiempo transcurrido guardado @@ -69,7 +69,7 @@ export class AutoSaveResponseDto { }, required: false, }) - metadata?: Record; + metadata?: Record; /** * Fecha de inicio del ejercicio diff --git a/projects/gamilit/apps/backend/src/modules/progress/dto/create-exercise-attempt.dto.ts b/projects/gamilit/apps/backend/src/modules/progress/dto/create-exercise-attempt.dto.ts index 02311be..dfe5513 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/dto/create-exercise-attempt.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/dto/create-exercise-attempt.dto.ts @@ -42,7 +42,7 @@ export class CreateExerciseAttemptDto { * Respuestas enviadas (estructura JSONB) */ @IsObject() - submitted_answers!: Record; + submitted_answers!: Record; /** * Indica si la respuesta fue correcta @@ -110,5 +110,5 @@ export class CreateExerciseAttemptDto { */ @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/progress/dto/create-exercise-submission.dto.ts b/projects/gamilit/apps/backend/src/modules/progress/dto/create-exercise-submission.dto.ts index d9850c1..99edd31 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/dto/create-exercise-submission.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/dto/create-exercise-submission.dto.ts @@ -36,7 +36,7 @@ export class CreateExerciseSubmissionDto { * Respuesta del estudiante (JSONB) */ @IsObject() - answer_data!: Record; + answer_data!: Record; /** * Indica si la respuesta fue correcta diff --git a/projects/gamilit/apps/backend/src/modules/progress/dto/create-learning-session.dto.ts b/projects/gamilit/apps/backend/src/modules/progress/dto/create-learning-session.dto.ts index 3480e90..8d93255 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/dto/create-learning-session.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/dto/create-learning-session.dto.ts @@ -77,14 +77,14 @@ export class CreateLearningSessionDto { */ @IsOptional() @IsObject() - device_info?: Record; + device_info?: Record; /** * Información del navegador */ @IsOptional() @IsObject() - browser_info?: Record; + browser_info?: Record; /** * Calidad de conexión @@ -99,5 +99,5 @@ export class CreateLearningSessionDto { */ @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/progress/dto/create-module-progress.dto.ts b/projects/gamilit/apps/backend/src/modules/progress/dto/create-module-progress.dto.ts index 00947f8..6ab4f7f 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/dto/create-module-progress.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/dto/create-module-progress.dto.ts @@ -134,5 +134,5 @@ export class CreateModuleProgressDto { */ @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/progress/dto/exercise-attempt-response.dto.ts b/projects/gamilit/apps/backend/src/modules/progress/dto/exercise-attempt-response.dto.ts index 52fa4fa..c604085 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/dto/exercise-attempt-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/dto/exercise-attempt-response.dto.ts @@ -37,7 +37,7 @@ export class ExerciseAttemptResponseDto { * Respuestas enviadas */ @Expose() - submitted_answers!: Record; + submitted_answers!: Record; /** * Indica si fue correcta @@ -92,5 +92,5 @@ export class ExerciseAttemptResponseDto { * Metadatos */ @Expose() - metadata!: Record; + metadata!: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/progress/dto/exercise-submission-response.dto.ts b/projects/gamilit/apps/backend/src/modules/progress/dto/exercise-submission-response.dto.ts index 8c4d494..bd817fe 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/dto/exercise-submission-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/dto/exercise-submission-response.dto.ts @@ -31,7 +31,7 @@ export class ExerciseSubmissionResponseDto { * Respuesta del estudiante */ @Expose() - answer_data!: Record; + answer_data!: Record; /** * Indica si fue correcta diff --git a/projects/gamilit/apps/backend/src/modules/progress/dto/learning-session-response.dto.ts b/projects/gamilit/apps/backend/src/modules/progress/dto/learning-session-response.dto.ts index 036b1a8..312d4db 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/dto/learning-session-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/dto/learning-session-response.dto.ts @@ -147,13 +147,13 @@ export class LearningSessionResponseDto { * Información del dispositivo */ @Expose() - device_info!: Record; + device_info!: Record; /** * Información del navegador */ @Expose() - browser_info!: Record; + browser_info!: Record; /** * Calidad de conexión @@ -183,7 +183,7 @@ export class LearningSessionResponseDto { * Metadatos */ @Expose() - metadata!: Record; + metadata!: Record; /** * Fecha de creación diff --git a/projects/gamilit/apps/backend/src/modules/progress/dto/module-progress-response.dto.ts b/projects/gamilit/apps/backend/src/modules/progress/dto/module-progress-response.dto.ts index c8e9f6b..525f280 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/dto/module-progress-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/dto/module-progress-response.dto.ts @@ -198,13 +198,13 @@ export class ModuleProgressResponseDto { * Analíticas de rendimiento */ @Expose() - performance_analytics!: Record; + performance_analytics!: Record; /** * Observaciones del sistema */ @Expose() - system_observations!: Record; + system_observations!: Record; /** * Notas del estudiante @@ -222,7 +222,7 @@ export class ModuleProgressResponseDto { * Metadatos */ @Expose() - metadata!: Record; + metadata!: Record; /** * Fecha de creación diff --git a/projects/gamilit/apps/backend/src/modules/progress/dto/recent-activity.dto.ts b/projects/gamilit/apps/backend/src/modules/progress/dto/recent-activity.dto.ts index f500ffe..29249b6 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/dto/recent-activity.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/dto/recent-activity.dto.ts @@ -55,6 +55,6 @@ export interface RecentActivityDto { entity_type: 'module' | 'exercise' | 'achievement' | 'level' | 'session'; entity_id: string; entity_name: string; - metadata?: Record; + metadata?: Record; created_at: Date; } diff --git a/projects/gamilit/apps/backend/src/modules/progress/entities/exercise-attempt.entity.ts b/projects/gamilit/apps/backend/src/modules/progress/entities/exercise-attempt.entity.ts index 4f6a9a3..1752ab2 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/entities/exercise-attempt.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/entities/exercise-attempt.entity.ts @@ -65,7 +65,7 @@ export class ExerciseAttempt { * Estructura varía según tipo de ejercicio */ @Column({ type: 'jsonb' }) - submitted_answers!: Record; + submitted_answers!: Record; // ===================================================== // RESULTS & SCORING @@ -144,5 +144,5 @@ export class ExerciseAttempt { type: 'jsonb', default: { browser: null, device_type: null, response_pattern: [] }, }) - metadata!: Record; + metadata!: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/progress/entities/exercise-submission.entity.ts b/projects/gamilit/apps/backend/src/modules/progress/entities/exercise-submission.entity.ts index 562bb99..1e4abee 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/entities/exercise-submission.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/entities/exercise-submission.entity.ts @@ -61,7 +61,7 @@ export class ExerciseSubmission { * Estructura varía según tipo de ejercicio */ @Column({ type: 'jsonb' }) - answer_data!: Record; + answer_data!: Record; // ===================================================== // RESULTS & SCORING diff --git a/projects/gamilit/apps/backend/src/modules/progress/entities/learning-session.entity.ts b/projects/gamilit/apps/backend/src/modules/progress/entities/learning-session.entity.ts index 47e6061..fea9419 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/entities/learning-session.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/entities/learning-session.entity.ts @@ -194,14 +194,14 @@ export class LearningSession { * Ejemplo: { type: 'mobile', os: 'iOS', model: 'iPhone 12' } */ @Column({ type: 'jsonb', default: {} }) - device_info: Record = {}; + device_info: Record = {}; /** * Información del navegador (JSONB) * Ejemplo: { name: 'Chrome', version: '96.0.4664.110' } */ @Column({ type: 'jsonb', default: {} }) - browser_info!: Record; + browser_info!: Record; /** * Calidad de conexión @@ -245,7 +245,7 @@ export class LearningSession { * Metadatos adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha y hora de creación del registro diff --git a/projects/gamilit/apps/backend/src/modules/progress/entities/manual-review.entity.ts b/projects/gamilit/apps/backend/src/modules/progress/entities/manual-review.entity.ts index be0183a..5c2f691 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/entities/manual-review.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/entities/manual-review.entity.ts @@ -82,7 +82,7 @@ export class ManualReview { * Estructura flexible según necesidades del ejercicio */ @Column({ name: 'detailed_feedback', type: 'jsonb', nullable: true }) - detailedFeedback?: Record | null; + detailedFeedback?: Record | null; // ===================================================== // STATUS & WORKFLOW diff --git a/projects/gamilit/apps/backend/src/modules/progress/entities/module-progress.entity.ts b/projects/gamilit/apps/backend/src/modules/progress/entities/module-progress.entity.ts index c6eebd5..725c5d5 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/entities/module-progress.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/entities/module-progress.entity.ts @@ -272,13 +272,13 @@ export class ModuleProgress { * Analíticas de rendimiento (JSONB) */ @Column({ type: 'jsonb', default: {} }) - performance_analytics!: Record; + performance_analytics!: Record; /** * Observaciones del sistema (JSONB) */ @Column({ type: 'jsonb', default: {} }) - system_observations: Record = {}; + system_observations: Record = {}; // ===================================================== // NOTES & FEEDBACK @@ -304,7 +304,7 @@ export class ModuleProgress { * Metadatos adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha y hora de creación del registro diff --git a/projects/gamilit/apps/backend/src/modules/progress/entities/progress-snapshot.entity.ts b/projects/gamilit/apps/backend/src/modules/progress/entities/progress-snapshot.entity.ts index b4778c3..f60c35b 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/entities/progress-snapshot.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/entities/progress-snapshot.entity.ts @@ -62,7 +62,7 @@ export class ProgressSnapshot { * } */ @Column({ type: 'jsonb' }) - snapshot_data!: Record; + snapshot_data!: Record; /** * Total de módulos completados hasta esta fecha diff --git a/projects/gamilit/apps/backend/src/modules/progress/entities/skill-assessment.entity.ts b/projects/gamilit/apps/backend/src/modules/progress/entities/skill-assessment.entity.ts index 4019f3c..b6baaeb 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/entities/skill-assessment.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/entities/skill-assessment.entity.ts @@ -97,7 +97,7 @@ export class SkillAssessment { * } */ @Column({ type: 'jsonb', nullable: true }) - evidence?: Record; + evidence?: Record; /** * Fecha y hora de creación diff --git a/projects/gamilit/apps/backend/src/modules/progress/services/exercise-attempt.service.ts b/projects/gamilit/apps/backend/src/modules/progress/services/exercise-attempt.service.ts index 521e668..1c3293f 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/services/exercise-attempt.service.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/services/exercise-attempt.service.ts @@ -144,7 +144,7 @@ export class ExerciseAttemptService { */ async submitAttempt( id: string, - answers: Record, + answers: Record, ): Promise { const attempt = await this.attemptRepo.findOne({ where: { id } }); @@ -156,7 +156,7 @@ export class ExerciseAttemptService { attempt.submitted_at = new Date(); // FE-059: Use SQL validate_and_audit() for scoring (replaces placeholder) - const { score, isCorrect, _feedback, _details, auditId } = await this.calculateScore( + const { score, isCorrect, feedback: _feedback, details: _details, auditId } = await this.calculateScore( attempt.user_id, attempt.exercise_id, answers, @@ -222,7 +222,7 @@ export class ExerciseAttemptService { private async calculateScore( userId: string, exerciseId: string, - answers: Record, + answers: Record, attemptNumber: number, ): Promise<{ score: number; diff --git a/projects/gamilit/apps/backend/src/modules/progress/services/exercise-submission.service.ts b/projects/gamilit/apps/backend/src/modules/progress/services/exercise-submission.service.ts index 6bc3bac..0816b0d 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/services/exercise-submission.service.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/services/exercise-submission.service.ts @@ -205,7 +205,7 @@ export class ExerciseSubmissionService { async submitExercise( userId: string, exerciseId: string, - answers: Record, + answers: Record, ): Promise { // CRITICAL FIX: Convert auth.users.id → profiles.id // exercise_submissions.user_id FK references profiles.id (NOT auth.users.id) @@ -466,9 +466,9 @@ export class ExerciseSubmissionService { private async autoGrade( userId: string, exerciseId: string, - answerData: Record, + answerData: Record, attemptNumber: number = 1, - clientMetadata: Record = {}, + clientMetadata: Record = {}, ): Promise<{ score: number; isCorrect: boolean; @@ -611,7 +611,7 @@ export class ExerciseSubmissionService { */ async provideFeedback( id: string, - feedback: Record, + feedback: Record, ): Promise { const submission = await this.submissionRepo.findOne({ where: { id } }); @@ -1080,7 +1080,7 @@ export class ExerciseSubmissionService { } return 1.00; // Default si no encuentra - } catch (_error) { + } catch { console.warn(`[getRankXpMultiplier] Error getting multiplier for user ${userId}, using 1.00`); return 1.00; } @@ -1318,9 +1318,9 @@ export class ExerciseSubmissionService { async autoSaveProgress( userId: string, exerciseId: string, - partialAnswers?: Record, + partialAnswers?: Record, timeSpentSeconds?: number, - metadata?: Record, + metadata?: Record, ): Promise { // Convert auth.users.id → profiles.id const profileId = await this.getProfileId(userId); @@ -1416,7 +1416,7 @@ export class ExerciseSubmissionService { async convertDraftToFinalSubmission( userId: string, exerciseId: string, - finalAnswers: Record, + finalAnswers: Record, ): Promise { // Buscar draft existente const draft = await this.getAutoSavedProgress(userId, exerciseId); diff --git a/projects/gamilit/apps/backend/src/modules/progress/services/scheduled-mission.service.ts b/projects/gamilit/apps/backend/src/modules/progress/services/scheduled-mission.service.ts index 6fcddeb..363c3ec 100644 --- a/projects/gamilit/apps/backend/src/modules/progress/services/scheduled-mission.service.ts +++ b/projects/gamilit/apps/backend/src/modules/progress/services/scheduled-mission.service.ts @@ -61,7 +61,7 @@ export class ScheduledMissionService { * @returns Lista de misiones del estudiante * @note Este método requiere conocer las aulas del usuario, se debe integrar con ClassroomService */ - async findByUserId(userId: string): Promise { + async findByUserId(_userId: string): Promise { // TODO: Integrar con ClassroomService para obtener classrooms del usuario // Por ahora, retornar todas las misiones activas como placeholder return this.scheduledMissionRepo.find({ @@ -92,7 +92,7 @@ export class ScheduledMissionService { * @param userId - ID del usuario * @returns Lista de misiones próximas */ - async findUpcoming(userId: string): Promise { + async findUpcoming(_userId: string): Promise { const now = new Date(); // TODO: Filtrar por classrooms del usuario diff --git a/projects/gamilit/apps/backend/src/modules/social/controllers/schools.controller.ts b/projects/gamilit/apps/backend/src/modules/social/controllers/schools.controller.ts index 2abeb41..08af4ba 100644 --- a/projects/gamilit/apps/backend/src/modules/social/controllers/schools.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/social/controllers/schools.controller.ts @@ -469,7 +469,7 @@ export class SchoolsController { }) async updateSettings( @Param('id') id: string, - @Body() settings: Record, + @Body() settings: Record, ) { return this.schoolsService.updateSettings(id, settings); } diff --git a/projects/gamilit/apps/backend/src/modules/social/dto/activity-response.dto.ts b/projects/gamilit/apps/backend/src/modules/social/dto/activity-response.dto.ts index 2ea59bb..3f0bfc9 100644 --- a/projects/gamilit/apps/backend/src/modules/social/dto/activity-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/social/dto/activity-response.dto.ts @@ -43,7 +43,7 @@ export class ActivityResponseDto { * Metadatos adicionales */ @Expose() - metadata!: Record; + metadata!: Record; /** * Visibilidad de la actividad diff --git a/projects/gamilit/apps/backend/src/modules/social/dto/classroom-member-response.dto.ts b/projects/gamilit/apps/backend/src/modules/social/dto/classroom-member-response.dto.ts index cf4e786..30d0da9 100644 --- a/projects/gamilit/apps/backend/src/modules/social/dto/classroom-member-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/social/dto/classroom-member-response.dto.ts @@ -87,7 +87,7 @@ export class ClassroomMemberResponseDto { * Permisos especiales del estudiante */ @Expose() - permissions!: Record; + permissions!: Record; /** * Notas del profesor @@ -99,13 +99,13 @@ export class ClassroomMemberResponseDto { * Información de contacto de padres */ @Expose() - parent_contact_info!: Record; + parent_contact_info!: Record; /** * Metadatos adicionales */ @Expose() - metadata!: Record; + metadata!: Record; /** * Membresía activa diff --git a/projects/gamilit/apps/backend/src/modules/social/dto/classroom-response.dto.ts b/projects/gamilit/apps/backend/src/modules/social/dto/classroom-response.dto.ts index 4e68a39..65f8101 100644 --- a/projects/gamilit/apps/backend/src/modules/social/dto/classroom-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/social/dto/classroom-response.dto.ts @@ -103,7 +103,7 @@ export class ClassroomResponseDto { * Configuraciones del aula */ @Expose() - settings!: Record; + settings!: Record; /** * Horario de clases @@ -147,7 +147,7 @@ export class ClassroomResponseDto { * Metadatos adicionales */ @Expose() - metadata!: Record; + metadata!: Record; /** * Fecha de creación diff --git a/projects/gamilit/apps/backend/src/modules/social/dto/create-activity.dto.ts b/projects/gamilit/apps/backend/src/modules/social/dto/create-activity.dto.ts index 5b296b6..62ffc43 100644 --- a/projects/gamilit/apps/backend/src/modules/social/dto/create-activity.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/social/dto/create-activity.dto.ts @@ -60,7 +60,7 @@ export class CreateActivityDto { */ @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; /** * Visibilidad de la actividad (opcional, por defecto true) diff --git a/projects/gamilit/apps/backend/src/modules/social/dto/create-classroom-member.dto.ts b/projects/gamilit/apps/backend/src/modules/social/dto/create-classroom-member.dto.ts index f2fb9eb..aff479e 100644 --- a/projects/gamilit/apps/backend/src/modules/social/dto/create-classroom-member.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/social/dto/create-classroom-member.dto.ts @@ -94,7 +94,7 @@ export class CreateClassroomMemberDto { */ @IsOptional() @IsObject() - permissions?: Record; + permissions?: Record; /** * Notas del profesor @@ -108,14 +108,14 @@ export class CreateClassroomMemberDto { */ @IsOptional() @IsObject() - parent_contact_info?: Record; + parent_contact_info?: Record; /** * Metadatos adicionales */ @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; /** * Membresía activa diff --git a/projects/gamilit/apps/backend/src/modules/social/dto/create-classroom.dto.ts b/projects/gamilit/apps/backend/src/modules/social/dto/create-classroom.dto.ts index f65bf28..bfa8768 100644 --- a/projects/gamilit/apps/backend/src/modules/social/dto/create-classroom.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/social/dto/create-classroom.dto.ts @@ -114,7 +114,7 @@ export class CreateClassroomDto { */ @IsOptional() @IsObject() - settings?: Record; + settings?: Record; /** * Horario de clases @@ -163,5 +163,5 @@ export class CreateClassroomDto { */ @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/social/dto/create-peer-challenge.dto.ts b/projects/gamilit/apps/backend/src/modules/social/dto/create-peer-challenge.dto.ts index 333bf5b..0b3b30c 100644 --- a/projects/gamilit/apps/backend/src/modules/social/dto/create-peer-challenge.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/social/dto/create-peer-challenge.dto.ts @@ -174,7 +174,7 @@ export class CreatePeerChallengeDto { }) @IsOptional() @IsObject() - rewards?: Record; + rewards?: Record; /** * Multiplicador de bonus para el ganador @@ -236,7 +236,7 @@ export class CreatePeerChallengeDto { }) @IsOptional() @IsObject() - custom_rules?: Record; + custom_rules?: Record; /** * Metadatos adicionales (JSONB) @@ -246,5 +246,5 @@ export class CreatePeerChallengeDto { }) @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/social/dto/create-school.dto.ts b/projects/gamilit/apps/backend/src/modules/social/dto/create-school.dto.ts index 848154a..9fc843c 100644 --- a/projects/gamilit/apps/backend/src/modules/social/dto/create-school.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/social/dto/create-school.dto.ts @@ -148,7 +148,7 @@ export class CreateSchoolDto { */ @IsOptional() @IsObject() - settings?: Record; + settings?: Record; /** * Capacidad máxima de estudiantes @@ -185,5 +185,5 @@ export class CreateSchoolDto { */ @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/social/dto/create-team.dto.ts b/projects/gamilit/apps/backend/src/modules/social/dto/create-team.dto.ts index c218aeb..23afb4e 100644 --- a/projects/gamilit/apps/backend/src/modules/social/dto/create-team.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/social/dto/create-team.dto.ts @@ -162,5 +162,5 @@ export class CreateTeamDto { */ @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/social/dto/school-response.dto.ts b/projects/gamilit/apps/backend/src/modules/social/dto/school-response.dto.ts index 9986fd4..12bbaff 100644 --- a/projects/gamilit/apps/backend/src/modules/social/dto/school-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/social/dto/school-response.dto.ts @@ -127,7 +127,7 @@ export class SchoolResponseDto { * Configuraciones adicionales */ @Expose() - settings!: Record; + settings!: Record; /** * Capacidad máxima de estudiantes @@ -169,7 +169,7 @@ export class SchoolResponseDto { * Metadatos adicionales */ @Expose() - metadata!: Record; + metadata!: Record; /** * Fecha de creación diff --git a/projects/gamilit/apps/backend/src/modules/social/dto/team-response.dto.ts b/projects/gamilit/apps/backend/src/modules/social/dto/team-response.dto.ts index d15f0ef..d2f4e7d 100644 --- a/projects/gamilit/apps/backend/src/modules/social/dto/team-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/social/dto/team-response.dto.ts @@ -177,7 +177,7 @@ export class TeamResponseDto { * Metadatos adicionales */ @Expose() - metadata!: Record; + metadata!: Record; /** * Fecha de creación diff --git a/projects/gamilit/apps/backend/src/modules/social/dto/update-peer-challenge.dto.ts b/projects/gamilit/apps/backend/src/modules/social/dto/update-peer-challenge.dto.ts index 01870c6..aca7fb0 100644 --- a/projects/gamilit/apps/backend/src/modules/social/dto/update-peer-challenge.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/social/dto/update-peer-challenge.dto.ts @@ -98,7 +98,7 @@ export class UpdatePeerChallengeDto { }) @IsOptional() @IsObject() - rewards?: Record; + rewards?: Record; /** * Multiplicador de bonus para el ganador @@ -122,7 +122,7 @@ export class UpdatePeerChallengeDto { }) @IsOptional() @IsObject() - custom_rules?: Record; + custom_rules?: Record; /** * Metadatos adicionales @@ -132,5 +132,5 @@ export class UpdatePeerChallengeDto { }) @IsOptional() @IsObject() - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/social/entities/challenge-participant.entity.ts b/projects/gamilit/apps/backend/src/modules/social/entities/challenge-participant.entity.ts index e07232f..265d177 100644 --- a/projects/gamilit/apps/backend/src/modules/social/entities/challenge-participant.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/social/entities/challenge-participant.entity.ts @@ -181,7 +181,7 @@ export class ChallengeParticipant { * Metadatos adicionales en formato JSONB */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; // ===================================================== // Relaciones diff --git a/projects/gamilit/apps/backend/src/modules/social/entities/classroom-member.entity.ts b/projects/gamilit/apps/backend/src/modules/social/entities/classroom-member.entity.ts index 8165b85..4cba7d8 100644 --- a/projects/gamilit/apps/backend/src/modules/social/entities/classroom-member.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/social/entities/classroom-member.entity.ts @@ -153,7 +153,7 @@ export class ClassroomMember { * Ejemplo: { can_post: true, can_comment: true, can_view_others: true } */ @Column({ type: 'jsonb', default: {} }) - permissions: Record = {}; + permissions: Record = {}; // ===================================================== // NOTES & COMMENTS @@ -170,7 +170,7 @@ export class ClassroomMember { * Ejemplo: { parent_name: "...", phone: "...", email: "..." } */ @Column({ type: 'jsonb', default: {} }) - parent_contact_info!: Record; + parent_contact_info!: Record; // ===================================================== // METADATA & FLAGS @@ -180,7 +180,7 @@ export class ClassroomMember { * Metadatos adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Flag de membresía activa diff --git a/projects/gamilit/apps/backend/src/modules/social/entities/classroom.entity.ts b/projects/gamilit/apps/backend/src/modules/social/entities/classroom.entity.ts index 0847ae9..0d9f071 100644 --- a/projects/gamilit/apps/backend/src/modules/social/entities/classroom.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/social/entities/classroom.entity.ts @@ -159,7 +159,7 @@ export class Classroom { allow_self_enrollment: false, }, }) - settings!: Record; + settings!: Record; /** * Horario de clases en formato JSON (array de objetos) @@ -214,7 +214,7 @@ export class Classroom { * Metadatos adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha y hora de creación del registro diff --git a/projects/gamilit/apps/backend/src/modules/social/entities/peer-challenge.entity.ts b/projects/gamilit/apps/backend/src/modules/social/entities/peer-challenge.entity.ts index ca0952f..479e84c 100644 --- a/projects/gamilit/apps/backend/src/modules/social/entities/peer-challenge.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/social/entities/peer-challenge.entity.ts @@ -149,7 +149,7 @@ export class PeerChallenge { * @example { "xp": 100, "ml_coins": 50, "achievement_id": "uuid" } */ @Column({ type: 'jsonb', default: {} }) - rewards!: Record; + rewards!: Record; /** * Multiplicador de bonus para el ganador @@ -180,7 +180,7 @@ export class PeerChallenge { * Reglas personalizadas en formato JSONB */ @Column({ type: 'jsonb', default: {} }) - custom_rules!: Record; + custom_rules!: Record; /** * Fecha y hora de creación @@ -210,7 +210,7 @@ export class PeerChallenge { * Metadatos adicionales en formato JSONB */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; // ===================================================== // Relaciones diff --git a/projects/gamilit/apps/backend/src/modules/social/entities/school.entity.ts b/projects/gamilit/apps/backend/src/modules/social/entities/school.entity.ts index 8d249fb..4b4bca9 100644 --- a/projects/gamilit/apps/backend/src/modules/social/entities/school.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/social/entities/school.entity.ts @@ -169,7 +169,7 @@ export class School { * Configuraciones adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - settings!: Record; + settings!: Record; // ===================================================== // CAPACITY & STATS @@ -223,7 +223,7 @@ export class School { * Metadatos adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha y hora de creación del registro diff --git a/projects/gamilit/apps/backend/src/modules/social/entities/team.entity.ts b/projects/gamilit/apps/backend/src/modules/social/entities/team.entity.ts index 8dd2fab..a0009fb 100644 --- a/projects/gamilit/apps/backend/src/modules/social/entities/team.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/social/entities/team.entity.ts @@ -245,7 +245,7 @@ export class Team { * Metadatos adicionales en formato JSON */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Fecha y hora de creación del registro diff --git a/projects/gamilit/apps/backend/src/modules/social/entities/user-activity.entity.ts b/projects/gamilit/apps/backend/src/modules/social/entities/user-activity.entity.ts index 79e26e9..a35802a 100644 --- a/projects/gamilit/apps/backend/src/modules/social/entities/user-activity.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/social/entities/user-activity.entity.ts @@ -76,7 +76,7 @@ export class UserActivity { * - { challengeId: 'uuid' } */ @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; /** * Indica si la actividad es visible para amigos diff --git a/projects/gamilit/apps/backend/src/modules/social/services/classrooms.service.ts b/projects/gamilit/apps/backend/src/modules/social/services/classrooms.service.ts index eb3a263..27a470a 100644 --- a/projects/gamilit/apps/backend/src/modules/social/services/classrooms.service.ts +++ b/projects/gamilit/apps/backend/src/modules/social/services/classrooms.service.ts @@ -237,7 +237,7 @@ export class ClassroomsService { * @throws NotFoundException si el aula no existe * @throws BadRequestException si el aula está llena */ - async enrollStudent(classroomId: string: string): Promise { + async enrollStudent(classroomId: string, _studentId: string): Promise { const classroom = await this.classroomRepo.findOne({ where: { id: classroomId } }); if (!classroom) { @@ -261,7 +261,7 @@ export class ClassroomsService { * @returns Aula actualizada * @throws NotFoundException si el aula no existe */ - async removeStudent(classroomId: string: string): Promise { + async removeStudent(classroomId: string, _studentId: string): Promise { const classroom = await this.classroomRepo.findOne({ where: { id: classroomId } }); if (!classroom) { diff --git a/projects/gamilit/apps/backend/src/modules/social/services/schools.service.ts b/projects/gamilit/apps/backend/src/modules/social/services/schools.service.ts index 9d1f9f5..4b9e79d 100644 --- a/projects/gamilit/apps/backend/src/modules/social/services/schools.service.ts +++ b/projects/gamilit/apps/backend/src/modules/social/services/schools.service.ts @@ -191,7 +191,7 @@ export class SchoolsService { */ async updateSettings( id: string, - settings: Record, + settings: Record, ): Promise { const school = await this.schoolRepo.findOne({ where: { id } }); diff --git a/projects/gamilit/apps/backend/src/modules/social/services/teams.service.ts b/projects/gamilit/apps/backend/src/modules/social/services/teams.service.ts index 98c1d7b..c8d5fb3 100644 --- a/projects/gamilit/apps/backend/src/modules/social/services/teams.service.ts +++ b/projects/gamilit/apps/backend/src/modules/social/services/teams.service.ts @@ -164,7 +164,7 @@ export class TeamsService { * @throws NotFoundException si el equipo no existe * @throws BadRequestException si el equipo está lleno */ - async addMember(teamId: string: string): Promise { + async addMember(teamId: string, _userId: string): Promise { const team = await this.teamRepo.findOne({ where: { id: teamId } }); if (!team) { @@ -189,7 +189,7 @@ export class TeamsService { * @returns Equipo actualizado * @throws NotFoundException si el equipo no existe */ - async removeMember(teamId: string: string): Promise { + async removeMember(teamId: string, _userId: string): Promise { const team = await this.teamRepo.findOne({ where: { id: teamId } }); if (!team) { diff --git a/projects/gamilit/apps/backend/src/modules/tasks/services/missions-cron.service.ts b/projects/gamilit/apps/backend/src/modules/tasks/services/missions-cron.service.ts index 3fb5601..7111d84 100644 --- a/projects/gamilit/apps/backend/src/modules/tasks/services/missions-cron.service.ts +++ b/projects/gamilit/apps/backend/src/modules/tasks/services/missions-cron.service.ts @@ -222,7 +222,8 @@ export class MissionsCronService { try { const job = this.schedulerRegistry.getCronJob(jobName); return (job as any).running ?? false; - } catch () { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (_error) { this.logger.warn(`Could not find job ${jobName} in registry`); return false; } diff --git a/projects/gamilit/apps/backend/src/modules/teacher/controllers/exercise-responses.controller.ts b/projects/gamilit/apps/backend/src/modules/teacher/controllers/exercise-responses.controller.ts index 1d4d64c..2d4507e 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/controllers/exercise-responses.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/controllers/exercise-responses.controller.ts @@ -90,7 +90,7 @@ export class ExerciseResponsesController { }) async getAttempts( @Query() query: GetAttemptsQueryDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user.id; @@ -133,7 +133,7 @@ export class ExerciseResponsesController { }) async getAttemptDetail( @Param('id') id: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user.id; @@ -175,7 +175,7 @@ export class ExerciseResponsesController { }) async getAttemptsByStudent( @Param('studentId') studentId: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user.id; @@ -213,7 +213,7 @@ export class ExerciseResponsesController { }) async getExerciseResponses( @Param('exerciseId') exerciseId: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const userId = req.user.id; diff --git a/projects/gamilit/apps/backend/src/modules/teacher/controllers/manual-review.controller.ts b/projects/gamilit/apps/backend/src/modules/teacher/controllers/manual-review.controller.ts index b8076fd..96110e6 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/controllers/manual-review.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/controllers/manual-review.controller.ts @@ -51,7 +51,7 @@ export class ManualReviewController { description: 'Lista de reviews pendientes con submissions', type: [ManualReview], }) - async getPendingReviews(@Request() req: any): Promise { + async getPendingReviews(@Request() req: AuthRequest): Promise { const teacherId = req.user.profileId; return this.reviewService.findPendingReviews(teacherId); } @@ -74,7 +74,7 @@ export class ManualReviewController { type: [ManualReview], }) async getMyReviews( - @Request() req: any, + @Request() req: AuthRequest, @Query('status') status?: 'pending' | 'in_progress' | 'completed' | 'returned', ): Promise { const teacherId = req.user.profileId; @@ -111,7 +111,7 @@ export class ManualReviewController { @ApiResponse({ status: 400, description: 'Datos inválidos o review duplicado' }) @ApiResponse({ status: 404, description: 'Submission no encontrado' }) async createReview( - @Request() req: any, + @Request() req: AuthRequest, @Body() dto: CreateReviewDto, ): Promise { const teacherId = req.user.profileId; diff --git a/projects/gamilit/apps/backend/src/modules/teacher/controllers/teacher-classrooms.controller.ts b/projects/gamilit/apps/backend/src/modules/teacher/controllers/teacher-classrooms.controller.ts index 84a469a..c300039 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/controllers/teacher-classrooms.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/controllers/teacher-classrooms.controller.ts @@ -117,7 +117,7 @@ export class TeacherClassroomsController { }) async getClassrooms( @Query() query: GetClassroomsQueryDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.classroomsCrudService.getClassrooms(teacherId, query); @@ -152,7 +152,7 @@ export class TeacherClassroomsController { }) async createClassroom( @Body() dto: CreateTeacherClassroomDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.classroomsCrudService.createClassroom(teacherId, dto); @@ -192,7 +192,7 @@ export class TeacherClassroomsController { }) async getClassroomById( @Param('id') id: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.classroomsCrudService.getClassroomById(id, teacherId); @@ -238,7 +238,7 @@ export class TeacherClassroomsController { async updateClassroom( @Param('id') id: string, @Body() dto: UpdateTeacherClassroomDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.classroomsCrudService.updateClassroom(id, teacherId, dto); @@ -287,7 +287,7 @@ export class TeacherClassroomsController { }) async deleteClassroom( @Param('id') id: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise<{ success: boolean; message: string }> { const teacherId = req.user.sub; return this.classroomsCrudService.deleteClassroom(id, teacherId); @@ -343,7 +343,7 @@ export class TeacherClassroomsController { async getClassroomStudents( @Param('id') id: string, @Query() query: GetClassroomStudentsQueryDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.classroomsCrudService.getClassroomStudents(id, teacherId, query); @@ -383,7 +383,7 @@ export class TeacherClassroomsController { }) async getClassroomStats( @Param('id') id: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.classroomsCrudService.getClassroomStats(id, teacherId); @@ -423,7 +423,7 @@ export class TeacherClassroomsController { }) async getClassroomTeachers( @Param('classroomId') classroomId: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.classroomsCrudService.getClassroomTeachers(classroomId, teacherId); @@ -488,7 +488,7 @@ export class TeacherClassroomsController { }) async getClassroomProgress( @Param('id') id: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.classroomsCrudService.getClassroomProgress(id, teacherId); @@ -544,7 +544,7 @@ export class TeacherClassroomsController { @Param('classroomId') classroomId: string, @Param('studentId') studentId: string, @Body() dto: BlockStudentDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.studentBlockingService.blockStudent( @@ -599,7 +599,7 @@ export class TeacherClassroomsController { async unblockStudent( @Param('classroomId') classroomId: string, @Param('studentId') studentId: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.studentBlockingService.unblockStudent( @@ -649,7 +649,7 @@ export class TeacherClassroomsController { async getStudentPermissions( @Param('classroomId') classroomId: string, @Param('studentId') studentId: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.studentBlockingService.getStudentPermissions( @@ -705,7 +705,7 @@ export class TeacherClassroomsController { @Param('classroomId') classroomId: string, @Param('studentId') studentId: string, @Body() dto: UpdatePermissionsDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.studentBlockingService.updateStudentPermissions( diff --git a/projects/gamilit/apps/backend/src/modules/teacher/controllers/teacher-content.controller.ts b/projects/gamilit/apps/backend/src/modules/teacher/controllers/teacher-content.controller.ts index 757f344..1180546 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/controllers/teacher-content.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/controllers/teacher-content.controller.ts @@ -113,7 +113,7 @@ export class TeacherContentController { }) async findAll( @Query() query: GetTeacherContentQueryDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.contentService.findAll(teacherId, query); @@ -151,7 +151,7 @@ export class TeacherContentController { status: 403, description: 'Forbidden - Teacher is not the owner of this content', }) - async findOne(@Param('id') id: string, @Request() req: any): Promise { + async findOne(@Param('id') id: string, @Request() req: AuthRequest): Promise { const teacherId = req.user.sub; return this.contentService.findOne(id, teacherId); } @@ -193,7 +193,7 @@ export class TeacherContentController { }) async create( @Body() dto: CreateTeacherContentDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.contentService.create(teacherId, dto); @@ -243,7 +243,7 @@ export class TeacherContentController { async update( @Param('id') id: string, @Body() dto: UpdateTeacherContentDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.contentService.update(id, teacherId, dto); @@ -292,7 +292,7 @@ export class TeacherContentController { }) async delete( @Param('id') id: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise<{ success: boolean; message: string }> { const teacherId = req.user.sub; return this.contentService.delete(id, teacherId); @@ -338,7 +338,7 @@ export class TeacherContentController { async clone( @Param('id') id: string, @Body() dto: CloneTeacherContentDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.contentService.clone(id, teacherId, dto); @@ -386,7 +386,7 @@ export class TeacherContentController { }) async publish( @Param('id') id: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.sub; return this.contentService.publish(id, teacherId); diff --git a/projects/gamilit/apps/backend/src/modules/teacher/controllers/teacher.controller.ts b/projects/gamilit/apps/backend/src/modules/teacher/controllers/teacher.controller.ts index d9405bc..8ec2239 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/controllers/teacher.controller.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/controllers/teacher.controller.ts @@ -79,14 +79,14 @@ export class TeacherController { @Get('dashboard/stats') @ApiOperation({ summary: 'Get classroom statistics' }) - async getClassroomStats(@Request() req: any) { + async getClassroomStats(@Request() req: AuthRequest) { const teacherId = req.user.id; return this.dashboardService.getClassroomStats(teacherId); } @Get('dashboard/activities') @ApiOperation({ summary: 'Get recent activities' }) - async getRecentActivities(@Request() req: any, @Query('limit') limit?: number) { + async getRecentActivities(@Request() req: AuthRequest, @Query('limit') limit?: number) { const teacherId = req.user.id; return this.dashboardService.getRecentActivities( teacherId, @@ -96,14 +96,14 @@ export class TeacherController { @Get('dashboard/alerts') @ApiOperation({ summary: 'Get student alerts' }) - async getStudentAlerts(@Request() req: any) { + async getStudentAlerts(@Request() req: AuthRequest) { const teacherId = req.user.id; return this.dashboardService.getStudentAlerts(teacherId); } @Get('dashboard/top-performers') @ApiOperation({ summary: 'Get top performing students' }) - async getTopPerformers(@Request() req: any, @Query('limit') limit?: number) { + async getTopPerformers(@Request() req: AuthRequest, @Query('limit') limit?: number) { const teacherId = req.user.id; return this.dashboardService.getTopPerformers( teacherId, @@ -113,7 +113,7 @@ export class TeacherController { @Get('dashboard/module-progress') @ApiOperation({ summary: 'Get module progress summary' }) - async getModuleProgressSummary(@Request() req: any) { + async getModuleProgressSummary(@Request() req: AuthRequest) { const teacherId = req.user.id; return this.dashboardService.getModuleProgressSummary(teacherId); } @@ -150,7 +150,7 @@ export class TeacherController { }) async getStudentNotes( @Param('studentId') studentId: string, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.profile.id; return this.studentProgressService.getStudentNotes(studentId, teacherId); @@ -164,7 +164,7 @@ export class TeacherController { async addStudentNote( @Param('studentId') studentId: string, @Body() noteDto: AddTeacherNoteDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.profile.id; return this.studentProgressService.addStudentNote( @@ -263,7 +263,7 @@ export class TeacherController { 'Retrieve engagement metrics including active students, submission rates, and classroom activity', }) async getEngagementMetrics( - @Request() req: any, + @Request() req: AuthRequest, @Query() query: GetEngagementMetricsDto, ) { const teacherId = req.user.profile.id; @@ -277,7 +277,7 @@ export class TeacherController { 'Generate comprehensive reports with analytics across classrooms, assignments, and student performance', }) async generateReports( - @Request() req: any, + @Request() req: AuthRequest, @Query() query: GenerateReportsDto, ) { const teacherId = req.user.profile.id; @@ -298,7 +298,7 @@ export class TeacherController { type: EconomyAnalyticsDto, }) async getEconomyAnalytics( - @Request() req: any, + @Request() req: AuthRequest, @Query('classroom_id') classroomId?: string, ): Promise { const teacherId = req.user.profile.id; @@ -319,7 +319,7 @@ export class TeacherController { type: StudentsEconomyResponseDto, }) async getStudentsEconomy( - @Request() req: any, + @Request() req: AuthRequest, @Query('classroom_id') classroomId?: string, ): Promise { const teacherId = req.user.profile.id; @@ -340,7 +340,7 @@ export class TeacherController { type: AchievementsStatsResponseDto, }) async getAchievementsStats( - @Request() req: any, + @Request() req: AuthRequest, @Query('classroom_id') classroomId?: string, ): Promise { const teacherId = req.user.profile.id; @@ -361,7 +361,7 @@ export class TeacherController { }) @ApiProduces('application/pdf', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') async generateInsightsReport( - @Request() req: any, + @Request() req: AuthRequest, @Body() dto: GenerateReportDto, @Res() res: Response, ) { @@ -422,7 +422,7 @@ export class TeacherController { async grantBonus( @Param('studentId') studentId: string, @Body() dto: GrantBonusDto, - @Request() req: any, + @Request() req: AuthRequest, ): Promise { const teacherId = req.user.profile.id; return this.bonusCoinsService.grantBonus(teacherId, studentId, dto); @@ -443,7 +443,7 @@ export class TeacherController { type: [ReportMetadataDto], }) async getRecentReports( - @Request() req: any, + @Request() req: AuthRequest, @Query() query: GetRecentReportsQueryDto, ): Promise { const teacherId = req.user.profile.id; @@ -461,7 +461,7 @@ export class TeacherController { description: 'Report stats retrieved successfully', type: ReportStatsDto, }) - async getReportStats(@Request() req: any): Promise { + async getReportStats(@Request() req: AuthRequest): Promise { const teacherId = req.user.profile.id; return this.teacherReportsService.getReportStats(teacherId); } @@ -486,7 +486,7 @@ export class TeacherController { }) async downloadReport( @Param('id') reportId: string, - @Request() req: any, + @Request() req: AuthRequest, @Res() res: Response, ) { const teacherId = req.user.profile.id; diff --git a/projects/gamilit/apps/backend/src/modules/teacher/dto/classroom-response.dto.ts b/projects/gamilit/apps/backend/src/modules/teacher/dto/classroom-response.dto.ts index 396b776..b6f14ad 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/dto/classroom-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/dto/classroom-response.dto.ts @@ -176,13 +176,13 @@ export class TeacherClassroomDetailResponseDto extends TeacherClassroomResponseD allow_self_enrollment: false, }, }) - settings!: Record; + settings!: Record; @ApiProperty({ description: 'Metadatos adicionales', example: {}, }) - metadata!: Record; + metadata!: Record; } // ============================================================================ diff --git a/projects/gamilit/apps/backend/src/modules/teacher/dto/create-review.dto.ts b/projects/gamilit/apps/backend/src/modules/teacher/dto/create-review.dto.ts index 68e3997..a27ff35 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/dto/create-review.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/dto/create-review.dto.ts @@ -60,7 +60,7 @@ export class CreateReviewDto { }) @IsObject() @IsOptional() - detailedFeedback?: Record; + detailedFeedback?: Record; } /** diff --git a/projects/gamilit/apps/backend/src/modules/teacher/dto/exercise-responses.dto.ts b/projects/gamilit/apps/backend/src/modules/teacher/dto/exercise-responses.dto.ts index 7b2da8f..3ac7725 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/dto/exercise-responses.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/dto/exercise-responses.dto.ts @@ -197,7 +197,7 @@ export class AttemptResponseDto { description: 'Submitted answers (JSONB)', example: { answers: ['A', 'B', 'C'] }, }) - submitted_answers!: Record; + submitted_answers!: Record; @ApiProperty({ description: 'Is the answer correct?', @@ -257,7 +257,7 @@ export class AttemptDetailDto extends AttemptResponseDto { description: 'Correct answer (from exercise)', example: { correct_answers: ['A', 'C', 'D'] }, }) - correct_answer!: Record; + correct_answer!: Record; @ApiProperty({ description: 'Exercise type', diff --git a/projects/gamilit/apps/backend/src/modules/teacher/dto/grades.dto.ts b/projects/gamilit/apps/backend/src/modules/teacher/dto/grades.dto.ts index 6109907..3fd41cb 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/dto/grades.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/dto/grades.dto.ts @@ -73,7 +73,7 @@ export class GradeDetailResponseDto extends GradeResponseDto { exercise_type!: string; @ApiProperty({ description: 'Answer data (JSON)' }) - answer_data!: Record; + answer_data!: Record; @ApiProperty({ description: 'Indicates if answer is correct' }) is_correct!: boolean; diff --git a/projects/gamilit/apps/backend/src/modules/teacher/dto/intervention-alerts.dto.ts b/projects/gamilit/apps/backend/src/modules/teacher/dto/intervention-alerts.dto.ts index 5590364..a9eeb34 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/dto/intervention-alerts.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/dto/intervention-alerts.dto.ts @@ -188,7 +188,7 @@ export class InterventionAlertResponseDto { required: false, example: { days_inactive: 7, last_activity: '2025-11-17' }, }) - metrics?: Record | null; + metrics?: Record | null; @ApiProperty({ enum: AlertStatus, description: 'Estado actual de la alerta' }) status!: AlertStatus; diff --git a/projects/gamilit/apps/backend/src/modules/teacher/dto/student-blocking/student-permissions-response.dto.ts b/projects/gamilit/apps/backend/src/modules/teacher/dto/student-blocking/student-permissions-response.dto.ts index eedad19..e934efa 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/dto/student-blocking/student-permissions-response.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/dto/student-blocking/student-permissions-response.dto.ts @@ -47,7 +47,7 @@ export class StudentPermissionsResponseDto { can_view_leaderboard: false, }, }) - permissions!: Record; + permissions!: Record; @ApiPropertyOptional({ description: 'Fecha y hora del bloqueo (si aplica)', diff --git a/projects/gamilit/apps/backend/src/modules/teacher/dto/teacher-content.dto.ts b/projects/gamilit/apps/backend/src/modules/teacher/dto/teacher-content.dto.ts index 976de15..103caec 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/dto/teacher-content.dto.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/dto/teacher-content.dto.ts @@ -118,7 +118,7 @@ export class CreateTeacherContentDto { }) @IsObject() @IsNotEmpty() - content_data!: Record; + content_data!: Record; @ApiPropertyOptional({ description: 'Instrucciones para el estudiante', @@ -304,7 +304,7 @@ export class CreateTeacherContentDto { }) @IsObject() @IsOptional() - metadata?: Record; + metadata?: Record; } // ============================================================================ @@ -494,7 +494,7 @@ export class TeacherContentResponseDto { @ApiProperty({ description: 'Datos del contenido', }) - content_data!: Record; + content_data!: Record; @ApiPropertyOptional({ description: 'Instrucciones', diff --git a/projects/gamilit/apps/backend/src/modules/teacher/entities/student-intervention-alert.entity.ts b/projects/gamilit/apps/backend/src/modules/teacher/entities/student-intervention-alert.entity.ts index 7917fe4..b7be2ce 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/entities/student-intervention-alert.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/entities/student-intervention-alert.entity.ts @@ -158,7 +158,7 @@ export class StudentInterventionAlert { * - declining_trend: { score_drop: 30, period: '7 days' } */ @Column({ type: 'jsonb', nullable: true }) - metrics?: Record | null; + metrics?: Record | null; // ===================================================== // STATUS & WORKFLOW diff --git a/projects/gamilit/apps/backend/src/modules/teacher/entities/teacher-content.entity.ts b/projects/gamilit/apps/backend/src/modules/teacher/entities/teacher-content.entity.ts index 78d6c2d..b5fdc55 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/entities/teacher-content.entity.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/entities/teacher-content.entity.ts @@ -46,7 +46,7 @@ export class TeacherContent { // Content body @Column({ type: 'jsonb', name: 'content_data', default: {} }) - content_data!: Record; + content_data!: Record; @Column({ type: 'text', nullable: true }) instructions?: string | null; @@ -179,7 +179,7 @@ export class TeacherContent { // Metadata @Column({ type: 'jsonb', default: {} }) - metadata!: Record; + metadata!: Record; // Flags @Column({ type: 'boolean', name: 'is_active', default: true }) diff --git a/projects/gamilit/apps/backend/src/modules/teacher/interfaces/ml-predictor.interface.ts b/projects/gamilit/apps/backend/src/modules/teacher/interfaces/ml-predictor.interface.ts index 068b0da..62b2914 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/interfaces/ml-predictor.interface.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/interfaces/ml-predictor.interface.ts @@ -251,5 +251,5 @@ export interface MLPredictionResponse { /** * Metadata adicional */ - metadata?: Record; + metadata?: Record; } diff --git a/projects/gamilit/apps/backend/src/modules/teacher/services/analytics.service.ts b/projects/gamilit/apps/backend/src/modules/teacher/services/analytics.service.ts index ef43239..9bcd1f8 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/services/analytics.service.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/services/analytics.service.ts @@ -71,7 +71,7 @@ export class AnalyticsService { /** * Get comprehensive classroom analytics */ - async getClassroomAnalytics(query: GetAnalyticsQueryDto) { + async getClassroomAnalytics(_query: GetAnalyticsQueryDto) { const students = await this.profileRepository.find({ where: { role: GamilityRoleEnum.STUDENT }, }); @@ -1189,7 +1189,7 @@ export class AnalyticsService { private calculatePredictions( stats: any, overall_score: number, - risk_level: 'low' | 'medium' | 'high', + _risk_level: 'low' | 'medium' | 'high', ): { completion_probability: number; dropout_risk: number } { // Simple heuristic-based predictions let completion_probability = 0.5; // Default 50% diff --git a/projects/gamilit/apps/backend/src/modules/teacher/services/ml-predictor.service.ts b/projects/gamilit/apps/backend/src/modules/teacher/services/ml-predictor.service.ts index 3c0be2f..e41d428 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/services/ml-predictor.service.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/services/ml-predictor.service.ts @@ -138,7 +138,7 @@ export class MLPredictorService implements IMLPredictor { * * TODO: Get from trained model's feature importance */ - async getFeatureImportance(input: StudentMLInput): Promise { + async getFeatureImportance(_input: StudentMLInput): Promise { // Heurística de importancia (pesos usados en predicción) const features: FeatureImportance[] = [ { diff --git a/projects/gamilit/apps/backend/src/modules/teacher/services/reports.service.ts b/projects/gamilit/apps/backend/src/modules/teacher/services/reports.service.ts index 107ff67..5450aa7 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/services/reports.service.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/services/reports.service.ts @@ -129,7 +129,7 @@ export class ReportsService { /** * Generate a descriptive report name */ - private generateReportName(type: ReportType: ReportFormat): string { + private generateReportName(type: ReportType, _format: ReportFormat): string { const typeLabels: Record = { [ReportType.USERS]: 'Reporte-Usuarios', [ReportType.PROGRESS]: 'Reporte-Progreso', diff --git a/projects/gamilit/apps/backend/src/modules/teacher/services/teacher-dashboard.service.ts b/projects/gamilit/apps/backend/src/modules/teacher/services/teacher-dashboard.service.ts index 98b5366..aaeea8e 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/services/teacher-dashboard.service.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/services/teacher-dashboard.service.ts @@ -72,7 +72,7 @@ export class TeacherDashboardService { * * Fixed: Removed 'as any' casts, now uses In() operator properly */ - async getClassroomStats(teacherId: string): Promise { + async getClassroomStats(_teacherId: string): Promise { // Get all students from teacher's classrooms // TODO: Implement classroom-teacher relationship // For now, we'll get all students @@ -216,7 +216,7 @@ export class TeacherDashboardService { * * Fixed: Eliminated N+1 query problem, now uses bulk query + grouping in code */ - async getStudentAlerts(teacherId: string): Promise { + async getStudentAlerts(_teacherId: string): Promise { // 1. Get all students const students = await this.profileRepository.find({ where: { role: GamilityRoleEnum.STUDENT }, @@ -372,7 +372,7 @@ export class TeacherDashboardService { * Note: Module name will be fetched separately or shown as ID */ async getModuleProgressSummary( - teacherId: string, + _teacherId: string, ): Promise { // 1. Get all module progress records const moduleProgresses = await this.moduleProgressRepository.find(); diff --git a/projects/gamilit/apps/backend/src/modules/teacher/services/teacher-messages.service.ts b/projects/gamilit/apps/backend/src/modules/teacher/services/teacher-messages.service.ts index d8348f3..56a17e0 100644 --- a/projects/gamilit/apps/backend/src/modules/teacher/services/teacher-messages.service.ts +++ b/projects/gamilit/apps/backend/src/modules/teacher/services/teacher-messages.service.ts @@ -324,7 +324,7 @@ export class TeacherMessagesService { * @param tenantId - ID del tenant * @throws ForbiddenException si no tiene acceso */ - async markAsRead(messageId: string, teacherId: string: string): Promise { + async markAsRead(messageId: string, teacherId: string, _recipientId: string): Promise { // Verificar acceso const hasAccess = await this.verifyMessageAccess(messageId, teacherId); if (!hasAccess) { diff --git a/projects/gamilit/apps/backend/src/modules/websocket/notifications.gateway.ts b/projects/gamilit/apps/backend/src/modules/websocket/notifications.gateway.ts index 895b850..5d6a318 100644 --- a/projects/gamilit/apps/backend/src/modules/websocket/notifications.gateway.ts +++ b/projects/gamilit/apps/backend/src/modules/websocket/notifications.gateway.ts @@ -37,7 +37,7 @@ implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect { private userSockets = new Map>(); // userId -> Set of socketIds - afterInit(server: Server) { + afterInit(_server: Server) { this.logger.log('WebSocket Gateway initialized'); } diff --git a/projects/gamilit/apps/backend/src/shared/dto/notifications/create-notification.dto.ts b/projects/gamilit/apps/backend/src/shared/dto/notifications/create-notification.dto.ts index ae25d6b..43f7b5a 100644 --- a/projects/gamilit/apps/backend/src/shared/dto/notifications/create-notification.dto.ts +++ b/projects/gamilit/apps/backend/src/shared/dto/notifications/create-notification.dto.ts @@ -165,7 +165,7 @@ export class CreateNotificationDto { }) @IsObject() @IsOptional() - data?: Record; + data?: Record; /** * Metadata adicional (opcional) - alias para data @@ -180,7 +180,7 @@ export class CreateNotificationDto { }) @IsObject() @IsOptional() - metadata?: Record; + metadata?: Record; /** * Prioridad de la notificación (opcional) diff --git a/projects/gamilit/apps/backend/src/shared/dto/notifications/notification-response.dto.ts b/projects/gamilit/apps/backend/src/shared/dto/notifications/notification-response.dto.ts index 48bfc67..34af64b 100644 --- a/projects/gamilit/apps/backend/src/shared/dto/notifications/notification-response.dto.ts +++ b/projects/gamilit/apps/backend/src/shared/dto/notifications/notification-response.dto.ts @@ -84,7 +84,7 @@ export class NotificationResponseDto { example: { achievementIcon: '🏆', points: 100 }, nullable: true, }) - data?: Record | null; + data?: Record | null; /** * Indica si la notificación fue leída diff --git a/projects/gamilit/apps/backend/src/shared/dto/reports/generate-report.dto.ts b/projects/gamilit/apps/backend/src/shared/dto/reports/generate-report.dto.ts index ba3df4b..a90d3a2 100644 --- a/projects/gamilit/apps/backend/src/shared/dto/reports/generate-report.dto.ts +++ b/projects/gamilit/apps/backend/src/shared/dto/reports/generate-report.dto.ts @@ -84,5 +84,5 @@ export class GenerateReportDto { example: { start_date: '2025-01-01', end_date: '2025-12-31' }, }) @IsOptional() - filters?: Record; + filters?: Record; } diff --git a/projects/gamilit/apps/backend/src/shared/interceptors/rls.interceptor.ts b/projects/gamilit/apps/backend/src/shared/interceptors/rls.interceptor.ts index 1a8cf1c..a79fad5 100644 --- a/projects/gamilit/apps/backend/src/shared/interceptors/rls.interceptor.ts +++ b/projects/gamilit/apps/backend/src/shared/interceptors/rls.interceptor.ts @@ -53,7 +53,8 @@ export class RlsInterceptor implements NestInterceptor { // Por ahora, simplemente retornamos null y logueamos this.logger.debug(`Attempting to get DataSource for connection: ${connectionName}`); return null; - } catch () { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (_error) { this.logger.warn(`DataSource '${connectionName}' not found, skipping RLS setup`); return null; } diff --git a/projects/gamilit/apps/backend/src/shared/interceptors/transform-response.interceptor.ts b/projects/gamilit/apps/backend/src/shared/interceptors/transform-response.interceptor.ts index 0cb7192..7558ea7 100644 --- a/projects/gamilit/apps/backend/src/shared/interceptors/transform-response.interceptor.ts +++ b/projects/gamilit/apps/backend/src/shared/interceptors/transform-response.interceptor.ts @@ -67,7 +67,7 @@ export class TransformResponseInterceptor implements NestInterceptor { // Si es un objeto, transformar cada propiedad if (typeof obj === 'object') { - const transformed: Record = {}; + const transformed: Record = {}; for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { transformed[key] = this.transformDates(obj[key]); diff --git a/projects/gamilit/apps/backend/src/shared/types/index.ts b/projects/gamilit/apps/backend/src/shared/types/index.ts index fbecf0f..a394a78 100644 --- a/projects/gamilit/apps/backend/src/shared/types/index.ts +++ b/projects/gamilit/apps/backend/src/shared/types/index.ts @@ -18,7 +18,7 @@ export interface User { email: string; encrypted_password: string; role: 'student' | 'admin_teacher' | 'super_admin'; - raw_user_meta_data?: any; + raw_user_meta_data?: Record; created_at: Date; updated_at: Date; last_sign_in_at?: Date; @@ -59,8 +59,8 @@ export interface UserProfile { grade_level?: string; school_id?: string; is_active: boolean; - preferences?: any; - metadata?: any; + preferences?: Record; + metadata?: Record; created_at: Date; updated_at: Date; } @@ -70,10 +70,16 @@ export interface UserProfile { */ export interface AuthUser { id: string; + sub?: string; // JWT subject (user ID) email: string; role: string; rank?: string; tenant_id?: string; + tenantId?: string; // Alternative naming + profile?: { + id: string; + tenant_id?: string; + }; } /** @@ -88,13 +94,13 @@ export interface AuthRequest extends Request { /** * API Response Interface */ -export interface APIResponse { +export interface APIResponse { success: boolean; data?: T; error?: { code: string; message: string; - details?: any; + details?: unknown; }; meta?: { timestamp: string; @@ -160,7 +166,7 @@ export interface Achievement { rarity: 'common' | 'rare' | 'epic' | 'legendary'; ml_coins_reward: number; xp_reward: number; - conditions?: any; + conditions?: Record; is_secret: boolean; created_at: Date; }