digraph GoogleVein { rankdir=LR; compound=true; fontname="Helvetica"; node [fontname="Helvetica", fontsize=11, shape=box, style="rounded,filled"]; edge [fontname="Helvetica", fontsize=10]; labelloc="t"; label="Google Vein - OAuth Flow"; fontsize=16; // Client subgraph cluster_client { label="Soleprint"; style=filled; color="#E8F5E9"; fillcolor="#E8F5E9"; app [label="Application", fillcolor="#C8E6C9"]; vein [label="Google Vein\n(artery/veins/google)", fillcolor="#A5D6A7"]; oauth [label="OAuth Handler\n(artery/oauth.py)", fillcolor="#81C784"]; } // OAuth Flow subgraph cluster_oauth { label="OAuth 2.0"; style=filled; color="#FFF8E1"; fillcolor="#FFF8E1"; auth_url [label="1. Authorization URL", fillcolor="#FFECB3"]; consent [label="2. User Consent", fillcolor="#FFE082"]; callback [label="3. Callback + Code", fillcolor="#FFD54F"]; tokens [label="4. Access + Refresh\nTokens", fillcolor="#FFCA28"]; } // Google APIs subgraph cluster_google { label="Google APIs"; style=filled; color="#E3F2FD"; fillcolor="#E3F2FD"; sheets [label="Sheets API", fillcolor="#BBDEFB"]; calendar [label="Calendar API", fillcolor="#BBDEFB"]; drive [label="Drive API", fillcolor="#BBDEFB"]; } // Flow app -> vein [label="get_sheets()"]; vein -> oauth [label="ensure_auth"]; oauth -> auth_url; auth_url -> consent; consent -> callback; callback -> tokens; tokens -> oauth [label="store"]; oauth -> sheets [label="Bearer token"]; oauth -> calendar [label="Bearer token"]; oauth -> drive [label="Bearer token"]; }