Add Auth Service box inside Core (no arrows) with 'Login + SSO support'

This commit is contained in:
TNB
2026-07-07 09:43:11 -04:00
parent bd28d03f77
commit 8cf2c5f195
2 changed files with 67 additions and 61 deletions
+66 -61
View File
@@ -63,7 +63,7 @@
</div> </div>
<div class="diagram-container"> <div class="diagram-container">
<svg viewBox="0 0 1000 620"> <svg viewBox="0 0 1000 640">
<defs> <defs>
<marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto"> <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
<polygon points="0 0, 10 3.5, 0 7" fill="#64748b" /> <polygon points="0 0, 10 3.5, 0 7" fill="#64748b" />
@@ -80,103 +80,108 @@
<rect width="100%" height="100%" fill="url(#grid)" /> <rect width="100%" height="100%" fill="url(#grid)" />
<!-- ========== CORE (Central, owns DB) ========== --> <!-- ========== CORE (Central, owns DB) ========== -->
<rect x="180" y="55" width="640" height="285" rx="14" fill="rgba(6, 78, 59, 0.1)" stroke="#34d399" stroke-width="2.5"/> <rect x="180" y="50" width="640" height="310" rx="14" fill="rgba(6, 78, 59, 0.1)" stroke="#34d399" stroke-width="2.5"/>
<text x="200" y="80" fill="#34d399" font-size="13" font-weight="700">TallyFlow Core (Central Hub)</text> <text x="200" y="75" fill="#34d399" font-size="13" font-weight="700">TallyFlow Core (Central Hub)</text>
<!-- Core Web UI (Vue.js) - LEFT --> <!-- Core Web UI (Vue.js) - LEFT -->
<rect x="210" y="100" width="180" height="70" rx="8" fill="rgba(8, 51, 68, 0.55)" stroke="#22d3ee" stroke-width="2"/> <rect x="200" y="95" width="170" height="65" rx="8" fill="rgba(8, 51, 68, 0.55)" stroke="#22d3ee" stroke-width="2"/>
<text x="300" y="127" fill="white" font-size="13" font-weight="700" text-anchor="middle">Core Web UI</text> <text x="285" y="118" fill="white" font-size="12" font-weight="700" text-anchor="middle">Core Web UI</text>
<text x="300" y="145" fill="#94a3b8" font-size="10" text-anchor="middle">Vue.js 2</text> <text x="285" y="134" fill="#94a3b8" font-size="9" text-anchor="middle">Vue.js 2</text>
<text x="300" y="161" fill="#22d3ee" font-size="9" text-anchor="middle">Uses Core API</text> <text x="285" y="148" fill="#22d3ee" font-size="8" text-anchor="middle">Uses Core API</text>
<!-- Core Backend (Go) - CENTER --> <!-- Core Backend (Go) - CENTER -->
<rect x="410" y="100" width="200" height="70" rx="8" fill="rgba(6, 78, 59, 0.55)" stroke="#34d399" stroke-width="2"/> <rect x="390" y="95" width="190" height="65" rx="8" fill="rgba(6, 78, 59, 0.55)" stroke="#34d399" stroke-width="2"/>
<text x="510" y="127" fill="white" font-size="13" font-weight="700" text-anchor="middle">Core Backend</text> <text x="485" y="118" fill="white" font-size="12" font-weight="700" text-anchor="middle">Core Backend</text>
<text x="510" y="145" fill="#94a3b8" font-size="10" text-anchor="middle">Go (REST API)</text> <text x="485" y="134" fill="#94a3b8" font-size="9" text-anchor="middle">Go (REST API)</text>
<text x="510" y="161" fill="#34d399" font-size="9" text-anchor="middle">REST + WebSocket</text> <text x="485" y="148" fill="#34d399" font-size="8" text-anchor="middle">REST + WebSocket</text>
<!-- MongoDB (nested inside Core) - RIGHT --> <!-- MongoDB (nested inside Core) - RIGHT -->
<rect x="630" y="100" width="170" height="70" rx="6" fill="rgba(76, 29, 149, 0.6)" stroke="#a78bfa" stroke-width="1.5"/> <rect x="600" y="95" width="200" height="65" rx="6" fill="rgba(76, 29, 149, 0.6)" stroke="#a78bfa" stroke-width="1.5"/>
<text x="715" y="127" fill="white" font-size="12" font-weight="700" text-anchor="middle">MongoDB</text> <text x="700" y="118" fill="white" font-size="12" font-weight="700" text-anchor="middle">MongoDB</text>
<text x="715" y="145" fill="#c4b5fd" font-size="9" text-anchor="middle">Assets • Tags • Photos • Zones</text> <text x="700" y="134" fill="#c4b5fd" font-size="9" text-anchor="middle">Assets • Tags • Photos • Zones</text>
<text x="715" y="160" fill="#c4b5fd" font-size="8" text-anchor="middle">(owned by Core Backend)</text> <text x="700" y="148" fill="#c4b5fd" font-size="8" text-anchor="middle">(owned by Core Backend)</text>
<!-- Auth Service (new) - no arrows -->
<rect x="200" y="175" width="200" height="55" rx="6" fill="rgba(136, 19, 55, 0.45)" stroke="#fb7185" stroke-width="1.5"/>
<text x="300" y="198" fill="white" font-size="12" font-weight="700" text-anchor="middle">Auth Service</text>
<text x="300" y="214" fill="#fb7185" font-size="9" text-anchor="middle">Login + SSO support</text>
<!-- Core API label --> <!-- Core API label -->
<text x="500" y="195" fill="#34d399" font-size="9" text-anchor="middle" font-weight="600">Core API Layer — single integration point for all components</text> <text x="500" y="250" fill="#34d399" font-size="9" text-anchor="middle" font-weight="600">Core API Layer — single integration point for all components</text>
<!-- ========== ASSETS (Mobile) - wrapped text ========== --> <!-- ========== ASSETS (Mobile) - wrapped text ========== -->
<rect x="50" y="380" width="170" height="100" rx="10" fill="rgba(8, 51, 68, 0.5)" stroke="#22d3ee" stroke-width="2"/> <rect x="50" y="400" width="170" height="100" rx="10" fill="rgba(8, 51, 68, 0.5)" stroke="#22d3ee" stroke-width="2"/>
<text x="135" y="405" fill="white" font-size="13" font-weight="700" text-anchor="middle">Assets</text> <text x="135" y="425" fill="white" font-size="13" font-weight="700" text-anchor="middle">Assets</text>
<text x="135" y="423" fill="#94a3b8" font-size="10" text-anchor="middle">(Mobile)</text> <text x="135" y="443" fill="#94a3b8" font-size="10" text-anchor="middle">(Mobile)</text>
<text x="135" y="441" fill="#22d3ee" font-size="9" text-anchor="middle">Flutter</text> <text x="135" y="461" fill="#22d3ee" font-size="9" text-anchor="middle">Flutter</text>
<text x="135" y="459" fill="#94a3b8" font-size="8" text-anchor="middle">Seek &amp; Find • Inventory</text> <text x="135" y="479" fill="#94a3b8" font-size="8" text-anchor="middle">Seek &amp; Find • Inventory</text>
<text x="135" y="472" fill="#94a3b8" font-size="8" text-anchor="middle">Enrollment</text> <text x="135" y="492" fill="#94a3b8" font-size="8" text-anchor="middle">Enrollment</text>
<!-- ========== PRINT (fixed wrapping) ========== --> <!-- ========== PRINT (fixed wrapping) ========== -->
<rect x="260" y="380" width="180" height="100" rx="10" fill="rgba(120, 53, 15, 0.45)" stroke="#fbbf24" stroke-width="2"/> <rect x="260" y="400" width="180" height="100" rx="10" fill="rgba(120, 53, 15, 0.45)" stroke="#fbbf24" stroke-width="2"/>
<text x="350" y="405" fill="white" font-size="13" font-weight="700" text-anchor="middle">Print</text> <text x="350" y="425" fill="white" font-size="13" font-weight="700" text-anchor="middle">Print</text>
<text x="350" y="423" fill="#94a3b8" font-size="10" text-anchor="middle">Flutter + Rust</text> <text x="350" y="443" fill="#94a3b8" font-size="10" text-anchor="middle">Flutter + Rust</text>
<text x="350" y="441" fill="#fbbf24" font-size="9" text-anchor="middle">Zebra ZPL • RFID</text> <text x="350" y="461" fill="#fbbf24" font-size="9" text-anchor="middle">Zebra ZPL • RFID</text>
<text x="350" y="459" fill="#94a3b8" font-size="8" text-anchor="middle">Print UI + API • Registers assets</text> <text x="350" y="479" fill="#94a3b8" font-size="8" text-anchor="middle">Print UI + API • Registers assets</text>
<!-- ========== CAPTURE (native) ========== --> <!-- ========== CAPTURE (native) ========== -->
<rect x="490" y="380" width="170" height="100" rx="10" fill="rgba(136, 19, 55, 0.45)" stroke="#fb7185" stroke-width="2"/> <rect x="490" y="400" width="170" height="100" rx="10" fill="rgba(136, 19, 55, 0.45)" stroke="#fb7185" stroke-width="2"/>
<text x="575" y="408" fill="white" font-size="13" font-weight="700" text-anchor="middle">Capture</text> <text x="575" y="428" fill="white" font-size="13" font-weight="700" text-anchor="middle">Capture</text>
<text x="575" y="426" fill="#94a3b8" font-size="10" text-anchor="middle">(PhotoTag)</text> <text x="575" y="446" fill="#94a3b8" font-size="10" text-anchor="middle">(PhotoTag)</text>
<text x="575" y="444" fill="#fb7185" font-size="9" text-anchor="middle">Native App</text> <text x="575" y="464" fill="#fb7185" font-size="9" text-anchor="middle">Native App</text>
<text x="575" y="460" fill="#94a3b8" font-size="8" text-anchor="middle">Photo + Barcode QC</text> <text x="575" y="480" fill="#94a3b8" font-size="8" text-anchor="middle">Photo + Barcode QC</text>
<!-- ========== IoT ========== --> <!-- ========== IoT ========== -->
<rect x="720" y="380" width="180" height="100" rx="10" fill="rgba(251, 146, 60, 0.4)" stroke="#fb923c" stroke-width="2"/> <rect x="720" y="400" width="180" height="100" rx="10" fill="rgba(251, 146, 60, 0.4)" stroke="#fb923c" stroke-width="2"/>
<text x="810" y="408" fill="white" font-size="13" font-weight="700" text-anchor="middle">IoT</text> <text x="810" y="428" fill="white" font-size="13" font-weight="700" text-anchor="middle">IoT</text>
<text x="810" y="426" fill="#94a3b8" font-size="10" text-anchor="middle">Rust</text> <text x="810" y="446" fill="#94a3b8" font-size="10" text-anchor="middle">Rust</text>
<text x="810" y="444" fill="#fb923c" font-size="9" text-anchor="middle">Fixed Readers • Sensors</text> <text x="810" y="464" fill="#fb923c" font-size="9" text-anchor="middle">Fixed Readers • Sensors</text>
<text x="810" y="460" fill="#94a3b8" font-size="8" text-anchor="middle">MQTT / HTTP • ERP integration</text> <text x="810" y="480" fill="#94a3b8" font-size="8" text-anchor="middle">MQTT / HTTP • ERP integration</text>
<!-- ========== CONNECTIONS ========== --> <!-- ========== CONNECTIONS ========== -->
<!-- Assets → Core (solid) --> <!-- Assets → Core (solid) -->
<line x1="222" y1="420" x2="280" y2="340" stroke="#22d3ee" stroke-width="2" marker-end="url(#arrowhead)"/> <line x1="222" y1="440" x2="280" y2="360" stroke="#22d3ee" stroke-width="2" marker-end="url(#arrowhead)"/>
<text x="235" y="375" fill="#22d3ee" font-size="9" font-weight="600">API Sync</text> <text x="235" y="395" fill="#22d3ee" font-size="9" font-weight="600">API Sync</text>
<!-- Print → Core (solid) + asset registration note --> <!-- Print → Core (solid) + asset registration note -->
<line x1="350" y1="378" x2="430" y2="340" stroke="#fbbf24" stroke-width="2" marker-end="url(#arrowhead)"/> <line x1="350" y1="398" x2="430" y2="360" stroke="#fbbf24" stroke-width="2" marker-end="url(#arrowhead)"/>
<text x="365" y="362" fill="#fbbf24" font-size="9">Print Jobs + Asset Reg</text> <text x="365" y="382" fill="#fbbf24" font-size="9">Print Jobs + Asset Reg</text>
<!-- Capture → Core (solid) --> <!-- Capture → Core (solid) -->
<line x1="575" y1="378" x2="575" y2="340" stroke="#fb7185" stroke-width="2" marker-end="url(#arrowhead)"/> <line x1="575" y1="398" x2="575" y2="360" stroke="#fb7185" stroke-width="2" marker-end="url(#arrowhead)"/>
<text x="590" y="362" fill="#fb7185" font-size="9">Photos + Metadata</text> <text x="590" y="382" fill="#fb7185" font-size="9">Photos + Metadata</text>
<!-- IoT → Core (dashed, optional) --> <!-- IoT → Core (dashed, optional) -->
<line x1="810" y1="378" x2="610" y2="340" stroke="#fb923c" stroke-width="2" stroke-dasharray="5,4" marker-end="url(#arrowhead-dashed)"/> <line x1="810" y1="398" x2="610" y2="360" stroke="#fb923c" stroke-width="2" stroke-dasharray="5,4" marker-end="url(#arrowhead-dashed)"/>
<text x="690" y="355" fill="#fb923c" font-size="9">Events (optional)</text> <text x="690" y="375" fill="#fb923c" font-size="9">Events (optional)</text>
<!-- Core Web UI uses Core Backend API (short arrow) --> <!-- Core Web UI uses Core Backend API (short arrow) -->
<line x1="392" y1="135" x2="408" y2="135" stroke="#22d3ee" stroke-width="1.5" marker-end="url(#arrowhead)"/> <line x1="372" y1="127" x2="388" y2="127" stroke="#22d3ee" stroke-width="1.5" marker-end="url(#arrowhead)"/>
<!-- Core Backend owns MongoDB --> <!-- Core Backend owns MongoDB -->
<line x1="612" y1="135" x2="628" y2="135" stroke="#a78bfa" stroke-width="2" marker-end="url(#arrowhead)"/> <line x1="582" y1="127" x2="598" y2="127" stroke="#a78bfa" stroke-width="2" marker-end="url(#arrowhead)"/>
<!-- Legend --> <!-- Legend -->
<text x="50" y="530" fill="white" font-size="10" font-weight="700">Legend</text> <text x="50" y="550" fill="white" font-size="10" font-weight="700">Legend</text>
<rect x="50" y="542" width="18" height="11" rx="2" fill="rgba(6, 78, 59, 0.55)" stroke="#34d399" stroke-width="1"/> <rect x="50" y="562" width="18" height="11" rx="2" fill="rgba(6, 78, 59, 0.55)" stroke="#34d399" stroke-width="1"/>
<text x="75" y="551" fill="#94a3b8" font-size="8">Core (Go + Vue.js + MongoDB)</text> <text x="75" y="571" fill="#94a3b8" font-size="8">Core (Go + Vue.js + MongoDB)</text>
<rect x="250" y="542" width="18" height="11" rx="2" fill="rgba(8, 51, 68, 0.5)" stroke="#22d3ee" stroke-width="1"/> <rect x="250" y="562" width="18" height="11" rx="2" fill="rgba(8, 51, 68, 0.5)" stroke="#22d3ee" stroke-width="1"/>
<text x="275" y="551" fill="#94a3b8" font-size="8">Assets (Flutter)</text> <text x="275" y="571" fill="#94a3b8" font-size="8">Assets (Flutter)</text>
<rect x="375" y="542" width="18" height="11" rx="2" fill="rgba(120, 53, 15, 0.45)" stroke="#fbbf24" stroke-width="1"/> <rect x="375" y="562" width="18" height="11" rx="2" fill="rgba(120, 53, 15, 0.45)" stroke="#fbbf24" stroke-width="1"/>
<text x="400" y="551" fill="#94a3b8" font-size="8">Print (Flutter/Rust + UI)</text> <text x="400" y="571" fill="#94a3b8" font-size="8">Print (Flutter/Rust + UI)</text>
<rect x="520" y="542" width="18" height="11" rx="2" fill="rgba(136, 19, 55, 0.45)" stroke="#fb7185" stroke-width="1"/> <rect x="520" y="562" width="18" height="11" rx="2" fill="rgba(136, 19, 55, 0.45)" stroke="#fb7185" stroke-width="1"/>
<text x="545" y="551" fill="#94a3b8" font-size="8">Capture (Native)</text> <text x="545" y="571" fill="#94a3b8" font-size="8">Capture (Native)</text>
<rect x="650" y="542" width="18" height="11" rx="2" fill="rgba(251, 146, 60, 0.4)" stroke="#fb923c" stroke-width="1"/> <rect x="650" y="562" width="18" height="11" rx="2" fill="rgba(251, 146, 60, 0.4)" stroke="#fb923c" stroke-width="1"/>
<text x="675" y="551" fill="#94a3b8" font-size="8">IoT (Rust)</text> <text x="675" y="571" fill="#94a3b8" font-size="8">IoT (Rust)</text>
<line x1="790" y1="547" x2="808" y2="547" stroke="#fb923c" stroke-width="1.5" stroke-dasharray="4,3" marker-end="url(#arrowhead-dashed)"/> <line x1="790" y1="567" x2="808" y2="567" stroke="#fb923c" stroke-width="1.5" stroke-dasharray="4,3" marker-end="url(#arrowhead-dashed)"/>
<text x="815" y="551" fill="#94a3b8" font-size="8">Optional flow</text> <text x="815" y="571" fill="#94a3b8" font-size="8">Optional flow</text>
</svg> </svg>
</div> </div>
@@ -188,9 +193,9 @@
</div> </div>
<ul> <ul>
<li>• Go backend (center) + Vue.js Web UI (left)</li> <li>• Go backend (center) + Vue.js Web UI (left)</li>
<li>• Auth Service: Login + SSO support</li>
<li>• Owns MongoDB (assets, tags, photos, zones)</li> <li>• Owns MongoDB (assets, tags, photos, zones)</li>
<li>• Single API integration point</li> <li>• Single API integration point</li>
<li>• Web UI also consumes the Core API</li>
</ul> </ul>
</div> </div>
<div class="card"> <div class="card">
+1
View File
@@ -9,6 +9,7 @@ TallyFlow is built around exactly **five primary components**, with **Core** as
### 1. Core (Central) ### 1. Core (Central)
- **Core Backend** (Go) positioned in the center — provides the REST API - **Core Backend** (Go) positioned in the center — provides the REST API
- **Core Web UI** (Vue.js) on the left — consumes the Core API - **Core Web UI** (Vue.js) on the left — consumes the Core API
- **Auth Service** — handles login and SSO support
- Owns MongoDB (assets, tags, photos, zones, events) - Owns MongoDB (assets, tags, photos, zones, events)
- Single API integration point for all other components - Single API integration point for all other components
- Handles configuration, reporting, and orchestration - Handles configuration, reporting, and orchestration