nordabiz/docs/architecture/diagrams/a7-module-structure.drawio

166 lines
15 KiB
Plaintext

<mxfile host="draw.io" modified="2026-02-12" agent="Claude Code" type="device">
<diagram id="a7-modules" name="Struktura Modulow">
<mxGraphModel dx="1400" dy="900" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1000" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="title" value="NordaBiz — Struktura Modułów (Blueprinty)" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=22;fontStyle=1;fontColor=#1a1a2e;" vertex="1" parent="1">
<mxGeometry x="400" y="15" width="530" height="36" as="geometry"/>
</mxCell>
<mxCell id="subtitle" value="17 blueprintów Flask — modularny monolit po refaktoringu app.py (15,570 → 1,557 linii)" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=11;fontColor=#888;" vertex="1" parent="1">
<mxGeometry x="380" y="48" width="560" height="20" as="geometry"/>
</mxCell>
<!-- CENTRUM: APP.PY -->
<mxCell id="center" value="&lt;b style=&quot;font-size:16px;color:#fff&quot;&gt;app.py&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:10px;color:#ccc&quot;&gt;1,557 linii&lt;br&gt;Flask factory&lt;br&gt;Blueprint registry&lt;/font&gt;" style="ellipse;whiteSpace=wrap;html=1;fillColor=#1a1a2e;strokeColor=#1a1a2e;shadow=1;" vertex="1" parent="1">
<mxGeometry x="660" y="400" width="140" height="120" as="geometry"/>
</mxCell>
<!-- SERWISY (po lewej) -->
<mxCell id="svc_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F3E5F5;strokeColor=#7B1FA2;shadow=1;" vertex="1" parent="1">
<mxGeometry x="40" y="350" width="280" height="230" as="geometry"/>
</mxCell>
<mxCell id="svc_title" value="&lt;b style=&quot;font-size:14px;color:#7B1FA2&quot;&gt;Serwisy (27)&lt;/b&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="50" y="356" width="130" height="24" as="geometry"/>
</mxCell>
<mxCell id="s1" value="gemini_service.py — AI Gemini" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#7B1FA2;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="50" y="384" width="260" height="22" as="geometry"/>
</mxCell>
<mxCell id="s2" value="search_service.py — Unified Search" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#7B1FA2;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="50" y="410" width="260" height="22" as="geometry"/>
</mxCell>
<mxCell id="s3" value="oauth_service.py — Google/Meta OAuth" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#7B1FA2;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="50" y="436" width="260" height="22" as="geometry"/>
</mxCell>
<mxCell id="s4" value="benchmark_service.py — Benchmarks" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#7B1FA2;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="50" y="462" width="260" height="22" as="geometry"/>
</mxCell>
<mxCell id="s5" value="crux_service.py — Chrome UX Report" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#7B1FA2;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="50" y="488" width="260" height="22" as="geometry"/>
</mxCell>
<mxCell id="s6" value="youtube_service.py — YouTube API" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#7B1FA2;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="50" y="514" width="260" height="22" as="geometry"/>
</mxCell>
<mxCell id="s7" value="+ 21 więcej (database.py, nordabiz_chat.py...)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E1BEE7;strokeColor=#7B1FA2;fontSize=10;align=left;spacingLeft=6;fontStyle=2;" vertex="1" parent="1">
<mxGeometry x="50" y="544" width="260" height="22" as="geometry"/>
</mxCell>
<!-- STRZAŁKA serwisy → center -->
<mxCell id="arr_svc" value="import" style="strokeColor=#7B1FA2;strokeWidth=2;fontSize=10;fontColor=#7B1FA2;fontStyle=1;" edge="1" source="svc_bg" target="center" parent="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<!-- BLUEPRINTY GŁÓWNE (góra) -->
<mxCell id="bp_core_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1565C0;shadow=1;" vertex="1" parent="1">
<mxGeometry x="440" y="80" width="560" height="140" as="geometry"/>
</mxCell>
<mxCell id="bp_core_title" value="&lt;b style=&quot;font-size:14px;color:#1565C0&quot;&gt;Blueprinty Podstawowe (użytkownicy)&lt;/b&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="450" y="86" width="330" height="24" as="geometry"/>
</mxCell>
<mxCell id="bp1" value="&lt;b&gt;main&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:9px&quot;&gt;Katalog, strona&lt;br&gt;główna, search&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#1565C0;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="455" y="114" width="100" height="46" as="geometry"/>
</mxCell>
<mxCell id="bp2" value="&lt;b&gt;auth&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:9px&quot;&gt;Login, rejestracja&lt;br&gt;2FA, reset hasła&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#1565C0;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="565" y="114" width="100" height="46" as="geometry"/>
</mxCell>
<mxCell id="bp3" value="&lt;b&gt;company&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:9px&quot;&gt;Profile firm&lt;br&gt;edycja danych&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#1565C0;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="675" y="114" width="100" height="46" as="geometry"/>
</mxCell>
<mxCell id="bp4" value="&lt;b&gt;chat&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:9px&quot;&gt;NordaGPT&lt;br&gt;Gemini AI&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#1565C0;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="785" y="114" width="100" height="46" as="geometry"/>
</mxCell>
<mxCell id="bp5" value="&lt;b&gt;account&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:9px&quot;&gt;Panel konta&lt;br&gt;ustawienia&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#1565C0;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="895" y="114" width="90" height="46" as="geometry"/>
</mxCell>
<mxCell id="bp6" value="&lt;b&gt;forum&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:9px&quot;&gt;Dyskusje&lt;br&gt;społeczność&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#1565C0;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="455" y="166" width="100" height="44" as="geometry"/>
</mxCell>
<mxCell id="bp7" value="&lt;b&gt;classifieds&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:9px&quot;&gt;Ogłoszenia&lt;br&gt;B2B&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#1565C0;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="565" y="166" width="100" height="44" as="geometry"/>
</mxCell>
<mxCell id="bp8" value="&lt;b&gt;messages&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:9px&quot;&gt;Prywatne&lt;br&gt;wiadomości&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#1565C0;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="675" y="166" width="100" height="44" as="geometry"/>
</mxCell>
<mxCell id="bp9" value="&lt;b&gt;events&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:9px&quot;&gt;Kalendarz&lt;br&gt;wydarzenia&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#1565C0;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="785" y="166" width="100" height="44" as="geometry"/>
</mxCell>
<mxCell id="bp10" value="&lt;b&gt;zopk&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:9px&quot;&gt;Baza wiedzy&lt;br&gt;ZOPK&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#1565C0;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="895" y="166" width="90" height="44" as="geometry"/>
</mxCell>
<!-- STRZAŁKA core → center -->
<mxCell id="arr_core" value="register_blueprint" style="strokeColor=#1565C0;strokeWidth=2;fontSize=10;fontColor=#1565C0;fontStyle=1;" edge="1" source="bp_core_bg" target="center" parent="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<!-- BLUEPRINTY ADMIN (prawo) -->
<mxCell id="bp_admin_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFEBEE;strokeColor=#C62828;shadow=1;" vertex="1" parent="1">
<mxGeometry x="1080" y="260" width="240" height="310" as="geometry"/>
</mxCell>
<mxCell id="bp_admin_title" value="&lt;b style=&quot;font-size:14px;color:#C62828&quot;&gt;Blueprinty Admin&lt;/b&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="1090" y="266" width="170" height="24" as="geometry"/>
</mxCell>
<mxCell id="adm1" value="&lt;b&gt;admin&lt;/b&gt; — Panel główny, firmy, użytkownicy" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#C62828;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="1090" y="296" width="220" height="28" as="geometry"/>
</mxCell>
<mxCell id="adm2" value="&lt;b&gt;admin_seo&lt;/b&gt; — Audyty SEO, PageSpeed" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#C62828;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="1090" y="330" width="220" height="28" as="geometry"/>
</mxCell>
<mxCell id="adm3" value="&lt;b&gt;admin_social&lt;/b&gt; — Social media audit" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#C62828;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="1090" y="364" width="220" height="28" as="geometry"/>
</mxCell>
<mxCell id="adm4" value="&lt;b&gt;admin_news&lt;/b&gt; — Monitoring wiadomości" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#C62828;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="1090" y="398" width="220" height="28" as="geometry"/>
</mxCell>
<mxCell id="adm5" value="&lt;b&gt;board&lt;/b&gt; — Rada Izby, protokoły" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#C62828;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="1090" y="432" width="220" height="28" as="geometry"/>
</mxCell>
<mxCell id="adm6" value="&lt;b&gt;membership&lt;/b&gt; — Składki, taryfy" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#C62828;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="1090" y="466" width="220" height="28" as="geometry"/>
</mxCell>
<mxCell id="adm7" value="&lt;b&gt;reports&lt;/b&gt; — Raporty zbiorcze" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#C62828;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="1090" y="500" width="220" height="28" as="geometry"/>
</mxCell>
<mxCell id="adm8" value="&lt;b&gt;api&lt;/b&gt; — REST API, OAuth, webhooks" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff;strokeColor=#C62828;fontSize=10;align=left;spacingLeft=6;" vertex="1" parent="1">
<mxGeometry x="1090" y="534" width="220" height="28" as="geometry"/>
</mxCell>
<!-- STRZAŁKA admin → center -->
<mxCell id="arr_admin" value="register_blueprint" style="strokeColor=#C62828;strokeWidth=2;fontSize=10;fontColor=#C62828;fontStyle=1;" edge="1" source="bp_admin_bg" target="center" parent="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<!-- BAZA DANYCH (dół) -->
<mxCell id="db_box" value="&lt;b style=&quot;font-size:14px;color:#1565C0&quot;&gt;PostgreSQL&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:10px&quot;&gt;database.py — 80+ tabel | 19 domen | 3 widoki | 2 funkcje&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E3F2FD;strokeColor=#1565C0;shadow=1;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="510" y="620" width="430" height="50" as="geometry"/>
</mxCell>
<mxCell id="arr_db" value="SQLAlchemy" style="strokeColor=#1565C0;strokeWidth=2;fontSize=10;fontColor=#1565C0;fontStyle=1;" edge="1" source="center" target="db_box" parent="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<!-- UTILS -->
<mxCell id="utils_box" value="&lt;b&gt;utils/&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:9px&quot;&gt;decorators.py, helpers.py&lt;br&gt;validators.py, cache.py&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E9;strokeColor=#2E7D32;shadow=1;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="380" y="380" width="160" height="55" as="geometry"/>
</mxCell>
<!-- TEMPLATES -->
<mxCell id="tpl_box" value="&lt;b&gt;templates/&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:9px&quot;&gt;Jinja2 szablony&lt;br&gt;base.html + podkatalogi per blueprint&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E9;strokeColor=#2E7D32;shadow=1;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="380" y="460" width="160" height="55" as="geometry"/>
</mxCell>
<!-- STATIC -->
<mxCell id="static_box" value="&lt;b&gt;static/&lt;/b&gt;&lt;br&gt;&lt;font style=&quot;font-size:9px&quot;&gt;CSS, JS, obrazy&lt;br&gt;Vanilla JS (bez frameworka)&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E8F5E9;strokeColor=#2E7D32;shadow=1;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="380" y="540" width="160" height="55" as="geometry"/>
</mxCell>
<!-- PODSUMOWANIE -->
<mxCell id="summary" value="&lt;font style=&quot;font-size:11px;color:#888&quot;&gt;&lt;b&gt;17 blueprintów&lt;/b&gt; | &lt;b&gt;49 plików z routami&lt;/b&gt; | &lt;b&gt;375+ tras API&lt;/b&gt; | &lt;b&gt;27 serwisów&lt;/b&gt; | Refaktoring -90% (15,570 → 1,557 linii app.py)&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="330" y="700" width="740" height="24" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>