{
  "schema_version": 1,
  "diagram_type": "sequence",
  "meta": {
    "title": "Secuencia de consulta sin caché",
    "output": "examples/sequence-cache-miss-request.html",
    "viewBox": [
      1080,
      560
    ],
    "column_fit": "spread",
    "animation": "trace",
    "quality_profile": "showcase",
    "views": [
      {
        "id": "request-and-auth",
        "label": "Solicitud e identidad",
        "focus": [
          "user",
          "web",
          "api",
          "auth"
        ],
        "note": "Sigue la solicitud del usuario durante la autenticación."
      },
      {
        "id": "cache-fallback",
        "label": "Alternativa a la caché",
        "focus": [
          "api",
          "redis",
          "db"
        ],
        "note": "Observa la falta de datos en caché y la consulta a la fuente de referencia."
      },
      {
        "id": "return-and-trace",
        "label": "Respuesta y trazas",
        "focus": [
          "db",
          "api",
          "redis",
          "trace",
          "web",
          "user"
        ],
        "note": "Separa el tiempo de respuesta del registro asíncrono de observabilidad."
      }
    ],
    "locale": "es"
  },
  "participants": [
    {
      "id": "user",
      "type": "external",
      "label": "Usuario",
      "sublabel": "sesión del navegador"
    },
    {
      "id": "web",
      "type": "frontend",
      "label": "Aplicación web",
      "sublabel": "interfaz React"
    },
    {
      "id": "api",
      "type": "backend",
      "label": "API",
      "sublabel": "gestor de solicitudes"
    },
    {
      "id": "auth",
      "type": "security",
      "label": "Autenticación",
      "sublabel": "validar JWT"
    },
    {
      "id": "redis",
      "type": "database",
      "label": "Redis",
      "sublabel": "caché"
    },
    {
      "id": "db",
      "type": "database",
      "label": "Postgres",
      "sublabel": "fuente de referencia"
    },
    {
      "id": "trace",
      "type": "messagebus",
      "label": "Trazas",
      "sublabel": "evento asíncrono"
    }
  ],
  "segments": [
    {
      "from": 150,
      "to": 250,
      "label": "Solicitud"
    },
    {
      "from": 260,
      "to": 370,
      "label": "Alternativa"
    },
    {
      "from": 380,
      "to": 480,
      "label": "Respuesta y trazas"
    }
  ],
  "messages": [
    {
      "id": "open-page",
      "from": "user",
      "to": "web",
      "y": 160,
      "label": "abrir página",
      "variant": "default"
    },
    {
      "id": "dashboard-request",
      "from": "web",
      "to": "api",
      "y": 185,
      "label": "GET /dashboard",
      "variant": "emphasis"
    },
    {
      "id": "verify-jwt",
      "from": "api",
      "to": "auth",
      "y": 210,
      "label": "validar JWT",
      "variant": "security"
    },
    {
      "id": "auth-claims",
      "from": "auth",
      "to": "api",
      "y": 238,
      "label": "credenciales válidas",
      "variant": "return"
    },
    {
      "id": "cache-read",
      "from": "api",
      "to": "redis",
      "y": 270,
      "label": "leer caché",
      "variant": "default"
    },
    {
      "id": "cache-miss",
      "from": "redis",
      "to": "api",
      "y": 298,
      "label": "sin datos",
      "variant": "return"
    },
    {
      "id": "profile-query",
      "from": "api",
      "to": "db",
      "y": 330,
      "label": "consultar perfil y métricas",
      "variant": "emphasis"
    },
    {
      "id": "profile-rows",
      "from": "db",
      "to": "api",
      "y": 358,
      "label": "filas",
      "variant": "return"
    },
    {
      "id": "cache-write",
      "from": "api",
      "to": "redis",
      "y": 390,
      "label": "guardar caché",
      "variant": "dashed"
    },
    {
      "id": "trace-emit",
      "from": "api",
      "to": "trace",
      "y": 418,
      "label": "emitir traza",
      "variant": "dashed"
    },
    {
      "id": "dashboard-response",
      "from": "api",
      "to": "web",
      "y": 443,
      "label": "200 JSON",
      "variant": "return"
    },
    {
      "id": "page-render",
      "from": "web",
      "to": "user",
      "y": 468,
      "label": "mostrar",
      "variant": "return"
    }
  ],
  "activations": [
    {
      "participant": "web",
      "from": 180,
      "to": 474,
      "type": "frontend"
    },
    {
      "participant": "api",
      "from": 185,
      "to": 450,
      "type": "backend"
    },
    {
      "participant": "auth",
      "from": 205,
      "to": 244,
      "type": "security"
    },
    {
      "participant": "redis",
      "from": 265,
      "to": 304,
      "type": "database"
    },
    {
      "participant": "db",
      "from": 325,
      "to": 364,
      "type": "database"
    },
    {
      "participant": "trace",
      "from": 413,
      "to": 449,
      "type": "messagebus"
    }
  ],
  "cards": [
    {
      "dot": "emerald",
      "title": "Ruta correcta",
      "items": [
        "La solicitud principal sigue Aplicación web -> API -> fuente de datos -> respuesta",
        "Las respuestas tienen menos énfasis visual que las llamadas",
        "Las barras de activación muestran la duración de cada responsabilidad"
      ]
    },
    {
      "dot": "rose",
      "title": "Política y alternativa",
      "items": [
        "La validación JWT usa el color de las interacciones de seguridad",
        "La falta de datos en caché es visible sin dominar la ruta principal",
        "La base de datos se consulta cuando la caché no tiene los datos"
      ]
    },
    {
      "dot": "orange",
      "title": "Traza asíncrona",
      "items": [
        "La emisión de trazas aparece con línea discontinua y menor énfasis",
        "No bloquea la ruta de respuesta",
        "El diagrama separa el tiempo de espera del usuario de la observabilidad"
      ]
    }
  ]
}
