Proeycto de images-worker creado

This commit is contained in:
unknown
2026-06-07 18:11:44 -04:00
parent fec365bb57
commit cb44779349
45 changed files with 6410 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
import { Controller, Post, Body, Logger } from '@nestjs/common';
import { PerfilCompletoDto } from './webhook.dto';
import { PipelineService } from '../pipeline/pipeline.service';
@Controller()
export class WebhookController {
private readonly logger = new Logger(WebhookController.name);
constructor(private readonly pipelineService: PipelineService) {}
@Post('perfil-completo')
recibirPerfil(@Body() dto: PerfilCompletoDto) {
this.logger.log(`[${dto.leadId}] Webhook recibido: ${dto.zonas.length} zonas`);
setImmediate(() => {
this.pipelineService.procesarLead(dto).catch((err) => {
this.logger.error(`[${dto.leadId}] Pipeline fallo: ${err.message}`, err.stack);
});
});
return { ok: true, message: 'Procesando renders en background...' };
}
}

View File

@@ -0,0 +1,97 @@
import { IsString, IsOptional, IsNumber, IsBoolean, IsArray, ValidateNested, IsIn, IsUUID } from 'class-validator';
import { Type } from 'class-transformer';
class ClienteDto {
@IsString()
nombre: string;
@IsString()
telefono: string;
@IsString()
email: string;
@IsOptional()
@IsString()
provincia?: string;
}
class ReformaDto {
@IsString()
@IsIn(['cocina', 'bano', 'salon', 'comedor', 'integral', 'otro'])
tipo: string;
@IsOptional()
@IsNumber()
m2Suelo?: number;
@IsString()
@IsIn(['basica', 'media', 'premium'])
calidad: string;
@IsOptional()
@IsBoolean()
estructural?: boolean;
@IsOptional()
@IsString()
@IsIn(['alta', 'media', 'baja'])
urgencia?: string;
@IsOptional()
@IsNumber()
presupuestoTarget?: number;
}
class EmpresaDto {
@IsUUID()
tenantId: string;
@IsString()
nombre: string;
}
class FotosDto {
@IsArray()
@IsString({ each: true })
antes: string[];
@IsArray()
@IsString({ each: true })
despues: string[];
}
class ZonaDto {
@IsString()
zona: string;
@IsArray()
@IsString({ each: true })
notas: string[];
@ValidateNested()
@Type(() => FotosDto)
fotos: FotosDto;
}
export class PerfilCompletoDto {
@IsUUID()
leadId: string;
@ValidateNested()
@Type(() => ClienteDto)
cliente: ClienteDto;
@ValidateNested()
@Type(() => ReformaDto)
reforma: ReformaDto;
@ValidateNested()
@Type(() => EmpresaDto)
empresa: EmpresaDto;
@IsArray()
@ValidateNested({ each: true })
@Type(() => ZonaDto)
zonas: ZonaDto[];
}

View File

@@ -0,0 +1,9 @@
import { Module } from '@nestjs/common';
import { WebhookController } from './webhook.controller';
import { PipelineModule } from '../pipeline/pipeline.module';
@Module({
imports: [PipelineModule],
controllers: [WebhookController],
})
export class WebhookModule {}