import { createHash } from 'crypto'; import sharp from 'sharp'; export class FileValidator { async validateFile(buffer: Buffer, mimeType: string) { try { // Validação básica if (!buffer || buffer.length === 0) { return { valid: false, error: 'Arquivo vazio' }; } // Verificar tamanho máximo (10MB) const MAX_SIZE = 10 * 1024 * 1024; if (buffer.length > MAX_SIZE) { return { valid: false, error: 'Arquivo muito grande (máximo 10MB)' }; } // Verificar tipos de arquivo permitidos const allowedTypes = [ 'application/pdf', 'image/jpeg', 'image/png', 'image/gif', 'image.webp' ]; if (!allowedTypes.includes(mimeType)) { return { valid: false, error: 'Tipo de arquivo não suportado. Use PDF, JPEG, PNG ou GIF.' }; } // Verificação adicional para JPEG if (mimeType === 'image/jpeg') { try { // Verificar se é um JPEG válido tentando processá-lo await sharp(buffer).metadata(); } catch (jpegError) { console.error('Erro ao validar JPEG:', jpegError); return { valid: false, error: 'O arquivo JPEG parece estar corrompido. Tente salvar a imagem em um formato diferente e enviar novamente.' }; } } return { valid: true }; } catch (error) { console.error('Erro na validação de arquivo:', error); return { valid: false, error: `Erro ao validar arquivo: ${error.message}` }; } } async validateMetadata(metadata: any) { // Campos básicos obrigatórios const requiredFields = ['userAgent', 'timestamp']; const missingFields = requiredFields.filter(field => !metadata[field]); if (missingFields.length > 0) { return { valid: false, error: `Dados necessários ausentes: ${missingFields.join(', ')}` }; } return { valid: true }; } generateHashes(buffer: Buffer) { return { sha256: createHash('sha256').update(buffer).digest('hex'), sha512: createHash('sha512').update(buffer).digest('hex'), md5: createHash('md5').update(buffer).digest('hex') }; } async cleanup() { // Nada a fazer nesta implementação simplificada } }