Lienzo Abierto: una galería de imágenes para aprender, adaptar y hacer tuya
Una galería de imágenes con búsqueda, favoritos e importación local. Código abierto, ilustraciones de ejemplo y un recorrido para adaptarla.
Implementa y valida un webhook de Novita AI en ASP.NET Core para procesar resultados asíncronos, actualizar Firestore y guardar archivos.

Actualizado: 20 de febrero de 2026.
Este capítulo resuelve el punto crítico de producción: cómo cerrar tareas asíncronas y persistir el resultado final.
codigo/ de esta serie.Archivo clave:
codigo/backend/InvitaIA.Api/Controllers/NovitaWebhookController.csResponsabilidades:
payload o data.ASYNC_TASK_RESULT.task_id, status y URLs.Archivo clave:
codigo/backend/InvitaIA.Api/Workers/NovitaTaskWorker.csResponsabilidades:
taskId.previewUrl, finalUrl, status en Firestore.sequenceDiagram
participant API as .NET API
participant NOV as Novita AI
participant WH as /api/webhooks/novita
participant WRK as NovitaTaskWorker
participant FS as Firestore/Storage
API->>NOV: Start async generation
NOV-->>API: task_id
NOV->>WH: ASYNC_TASK_RESULT
WH->>WRK: HandleWebhookAsync(taskId, status, urls)
WRK->>FS: upload + save status/finalUrl
Además del webhook, existe PendingInvitationWorker como red de seguridad para tareas en QUEUED o PROCESSING.
cd codigo/backend
rg -n "api/webhooks/novita|HandleWebhookAsync|task-result" InvitaIA.Api -S
taskId no coincide.status en webhook y GetTaskAsync.No. Polling actúa como fallback en fallos de red o retries perdidos.
En Firebase Storage vía IFirebaseService.UploadFileAsync.
TASK_STATUS_SUCCEED y equivalentes normalizados.
codigo/backend/InvitaIA.Api/Controllers/NovitaWebhookController.cscodigo/backend/InvitaIA.Api/Workers/NovitaTaskWorker.cscodigo/backend/InvitaIA.Api/Workers/PendingInvitationWorker.cs