{
  "schema_version": 1,
  "diagram_type": "sequence",
  "meta": {
    "title": "iSpeed.my — Loyalty & RT Points Flow",
    "subtitle": "RT Points summary and partner redemption",
    "output": "ispeed-loyalty.html",
    "viewBox": [1080, 620],
    "column_fit": "spread",
    "animation": "trace",
    "quality_profile": "showcase",
    "views": [
      { "id": "summary", "label": "Points Summary", "focus": ["user", "app", "mobile-api", "vbroker"], "note": "Balances and memberships" },
      { "id": "redeem", "label": "Redeem", "focus": ["app", "mobile-api", "vbroker", "partner"], "note": "Partner redemption via VBroker" },
      { "id": "full-flow", "label": "Full Flow", "focus": ["user", "app", "mobile-api", "vbroker", "partner"], "note": "Complete loyalty lifecycle" }
    ]
  },
  "participants": [
    { "id": "user", "type": "external", "label": "User", "sublabel": "Member" },
    { "id": "app", "type": "frontend", "label": "React Native App", "sublabel": "Expo SDK 56" },
    { "id": "mobile-api", "type": "backend", "label": "Mobile API", "sublabel": "rt-mx-mobile-api" },
    { "id": "vbroker", "type": "backend", "label": "VBroker API", "sublabel": "/loyaltyPoints" },
    { "id": "partner", "type": "external", "label": "Loyalty Partner", "sublabel": "AirAsia / Boost" }
  ],
  "segments": [
    { "from": 150, "to": 295, "label": "Points Summary" },
    { "from": 305, "to": 565, "label": "Redemption" }
  ],
  "messages": [
    { "id": "l1", "from": "user", "to": "app", "y": 160, "label": "Open RT Points", "variant": "default" },
    { "id": "l2", "from": "app", "to": "mobile-api", "y": 190, "label": "LoyaltySummary (12346)", "variant": "emphasis" },
    { "id": "l3", "from": "mobile-api", "to": "vbroker", "y": 220, "label": "/loyaltyPoints/summary", "variant": "default" },
    { "id": "l4", "from": "vbroker", "to": "mobile-api", "y": 250, "label": "points balance", "variant": "return" },
    { "id": "l5", "from": "mobile-api", "to": "app", "y": 280, "label": "summary", "variant": "return" },
    { "id": "l6", "from": "user", "to": "app", "y": 310, "label": "Redeem points", "variant": "default" },
    { "id": "l7", "from": "app", "to": "mobile-api", "y": 340, "label": "RedeemLoyalty (12347)", "variant": "emphasis" },
    { "id": "l8", "from": "mobile-api", "to": "vbroker", "y": 370, "label": "/loyaltyPoints/redeem", "variant": "default" },
    { "id": "l9", "from": "vbroker", "to": "partner", "y": 400, "label": "partner redeem API", "variant": "dashed" },
    { "id": "l10", "from": "partner", "to": "vbroker", "y": 430, "label": "redemption result", "variant": "return" },
    { "id": "l11", "from": "vbroker", "to": "mobile-api", "y": 460, "label": "redeem result", "variant": "return" },
    { "id": "l12", "from": "mobile-api", "to": "app", "y": 490, "label": "success", "variant": "return" },
    { "id": "l13", "from": "app", "to": "user", "y": 520, "label": "Show success", "variant": "return" }
  ],
  "activations": [
    { "participant": "app", "from": 155, "to": 530, "type": "frontend" },
    { "participant": "mobile-api", "from": 185, "to": 505, "type": "backend" },
    { "participant": "vbroker", "from": 215, "to": 470, "type": "backend" },
    { "participant": "partner", "from": 395, "to": 440, "type": "external" }
  ],
  "cards": [
    {
      "dot": "emerald",
      "title": "Partners",
      "items": [
        "AirAsia, BonusLink, B Infinite, Boost",
        "Partner servers resolved from vb_config",
        "Down-time windows from AA/BL/BI/BOOST_DOWN_TIME"
      ]
    },
    {
      "dot": "violet",
      "title": "Redemption",
      "items": [
        "AirAsia and Boost use AWS API Gateway",
        "Boost OAuth authorize/refresh/validate",
        "Redemptions logged per partner"
      ]
    },
    {
      "dot": "cyan",
      "title": "Offline Batch",
      "items": [
        "vbroker-integration exchanges loyalty files over SFTP",
        "AirAsia BM_RAKUTEN_<date>_0001.csv",
        "BonusLink RTTX<date>.txt"
      ]
    }
  ]
}
