import { DatabaseService } from '../services/database.service'; import { LoggerService } from '../services/logger.service'; export class MaterialsToDeleteDAO { constructor(private dbService: DatabaseService) {} /** * Query materials_to_delete table and return distinct material codes * @param managerNames - Optional array of manager names to filter by. Pass null to get all materials. * @returns Promise - Array of distinct material codes */ async getMaterialsToDeleteByManagers( managerNames: string[] | null ): Promise { try { // Input validation if (managerNames && managerNames.length === 0) { LoggerService.warn('Empty manager names array provided, returning empty result'); return []; } LoggerService.info( `Querying materials_to_delete${managerNames ? ` for ${managerNames.length} managers` : ' (all managers)'}` ); // Build base query let query = ` SELECT DISTINCT material_code FROM materials_to_delete `; let params: string[] | undefined; // Add WHERE clause with parameterized query if manager names provided // SECURITY: Use parameterized queries to prevent SQL injection if (managerNames && managerNames.length > 0) { const placeholders = managerNames.map((_, i) => `@param${i}`).join(','); query += ` WHERE manager_name IN (${placeholders})`; params = managerNames; } // Execute query with parameters (if any) const result = await this.dbService.executeSQLServerQuery(query, params); const materials = result.rows.map((row: any) => row.material_code); LoggerService.info(`Found ${materials.length} materials to delete`); return materials; } catch (error) { LoggerService.error('Failed to query materials_to_delete table', error); throw error; } } /** * Get all materials from materials_to_delete table without filtering * @returns Promise - Array of all distinct material codes */ async getAllMaterialsToDelete(): Promise { return this.getMaterialsToDeleteByManagers(null); } }