Volver a la wiki

Endpoint: POST /api/visio/analyze — Iniciar conversión async de Visio

Descripción

Endpoint que inicia la conversión asíncrona de ficheros Visio modernos (.vsdx, .vsd) a masters SVG, delegando el trabajo pesado a un worker de background. Devuelve inmediatamente una sesión ID y estado processing (para .vsdx/.vsd) o done (para formatos rápidos como .vssx/.vdx).

Ruta: POST /api/visio/analyze
Content-Type: multipart/form-data
Auth: Django user + Organization RLS

Contrato de solicitud

POST /api/visio/analyze
Content-Type: multipart/form-data

file: <file upload>  # .vsdx, .vsd, .vssx, .vdx, .vss, .svg

Contrato de respuesta

Respuesta inmediata (.vsdx/.vsd)

{
  "session_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "processing",
  "masters": [],
  "message": "Conversion started. Poll GET /api/racks/visio/session/{session_id}"
}

Respuesta inmediata (formatos rápidos: .vssx/.vdx/.vss/.svg)

{
  "session_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "done",
  "masters": [
    {
      "name": "Switch",
      "image_path": "path/to/preview.svg",
      "u_height": 1,
      "half_width": false
    },
    {
      "name": "PDU",
      "image_path": "path/to/preview.svg",
      "u_height": 2,
      "half_width": false
    }
  ]
}

Campos:

Lógica de negocio

Flujo por formato

Formatos rápidos (.vssx, .vdx, .vss, .svg):

Formatos modernos (.vsdx, .vsd):

Sanitización

Seguridad

Integración con tasks

Celery Task: convert_visio_async

@db_task
def convert_visio_async(session_id: str, filepath: str):
    """Convierte .vsdx/.vsd a masters SVG. Guarda sesión en cache."""
    try:
        parser = VisioParser(filepath)
        output_dir = f"temp/{session_id}"
        masters = parser.extract_masters(output_dir)
        cache.set(f"visio_session:{session_id}", {
            "status": "done",
            "masters": masters,
        }, timeout=3600)  # 1 hora
    except Exception as e:
        cache.set(f"visio_session:{session_id}", {
            "status": "error",
            "error": str(e),
        }, timeout=3600)

Endpoint de polling

GET /api/racks/visio/session/{session_id} (companion):

{
  "status": "processing|done|error",
  "masters": [...],
  "error": "error message (si status=error)"
}

Implementación en racks/api/library_files.py:visio_session_status().

Manejo de errores

CódigoEscenario
200✅ Análisis iniciado (processing) o completado (done).
400Fichero vacío, formato no soportado, parsing inválido.
401No autenticado.
403Organization RLS violation.
413Fichero demasiado grande.
500Error en conversión (Visio parser, FS, Celery).

Cambios en v1.53.0

Performance

Véase también

Subir