CreaRack-SL

Endpoint: POST /api/racks/visio/analyze — análisis y conversión de stencils Visio

Descripción

Ruta: POST /api/racks/visio/analyze

Endpoint que recibe un fichero de stencil (Visio moderno .vsdx/.vsd, clásico .vssx/.vdx/.vss, o SVG directo) y dispara el análisis/conversión. Para formatos Visio modernos, la conversión corre asíncrona en worker Huey; para otros, análisis sincrónico.

Parámetros

Body: multipart/form-data

  • file (required): fichero a analizar, máx 50 MB

Validación:

  • Extensión permitida: .vsdx, .vsd, .vssx, .vdx, .vss, .svg
  • Tamaño: ≤ 50 MB

Respuesta (200)

Para .vsdx/.vsd (asíncrono)

{
  "session_id": "uuid-string",
  "filename": "cisco_racks.vsdx",
  "status": "processing",
  "masters": []
}

Frontend hace polling a GET /api/racks/visio/session/{session_id} para obtener masters.

Para .svg subido directo

{
  "session_id": "uuid-string",
  "filename": "layout.svg",
  "masters": [
    {
      "name": "layout",
      "u_height": 1,
      "image_path": "uploads/temp/uuid.../layout.svg"
    }
  ]
}

Para .vssx/.vdx/.vss (sincrónico, parser VisioParser)

{
  "session_id": "uuid-string",
  "filename": "stencils.vssx",
  "masters": [
    {
      "name": "Rack",
      "u_height": 2.5,
      "image_path": "uploads/temp/uuid.../Rack.svg"
    },
    ...
  ]
}

Flujo interno

  1. Validación: extensión, tamaño
  2. Guardar en disco: temp/{session_id}/{filename}
  3. Ramificación según extensión:
    • .svg: sanitizar, devolver master inmediatamente
    • .vsdx/.vsd: encolar convert_visio_async() en Huey, devolver status=processing
    • .vssx/.vdx/.vss: parsear con VisioParser`, extraer masters sincronicamente
  4. Respuesta: 200 + payload

Permisos

  • Requiere autenticación
  • Requiere require_perm(request, "racks", "admin")

Seguridad

  • SVG directo: sanitización XSS antes de guardar
  • Conversión Visio: sanitización post-conversión en task Huey
  • Path traversal: sesión_id validada (is_valid_session_id)

Códigos de respuesta

CódigoCondición
200Análisis exitoso / conversión encolada
400Sin fichero, extensión inválida, tamaño excedido, SVG inválido
500Error en parsing (VisioParser) o libvisio_ng

Testing

  • Suites tests/api/test_visio_import_v2.py y tests/api/test_racks_visio_confirm.py
    • Upload de .vsdx → processing
    • Upload de .svg malicioso → sanitizado
    • Upload oversized → 400
    • Upload extensión inválida → 400

Véase también

  • [[feature—racks—import-visio-v2]]
  • [[entity—racks—endpoint—visio-session-status]]
  • [[entity—racks—endpoint—visio-confirm]]
  • [[entity—racks—service—convert-visio-async]]
  • [[entity—racks—service—svg-sanitizer]]