Files
csbot-prototype/documentation/03-architektura-a-mapa-kodu.md
T
JiriUhlirandClaude Opus 5 a771834e57 Realne sluzby, OpenAI, odesilani e-mailu a helpdesk
Katalog srovnany s tim, co opravdu bezi na services.csbot.cz/apps:
trinact sluzeb dostalo pristupove udaje a levne cteci overeni, opravena
appId, ktera nikam nevedla (ppl, microsoft365, transcription), a GA4,
Search Console, Google Ads i Sklik ted stoji na aplikaci analytics,
kazda s vlastnimi udaji. Nove sluzby SAP Business One, Google Workspace
a Meta Ads. K tomu 23 skriptu, ktere s nimi opravdu neco delaji.

OpenAI jako prvni sluzba, ktera nebezi u nas: Service.baseUrl s absolutni
adresou, prepis pres <SLUZBA>_BASE_URL nebo adresu u konektoru, predpona
hlavicky u pole udaju (uzivatel vlepi holy klic, Bearer dopise runtime).
Dotaz na model, nahrani souboru, otazka nad souborem, prepis zvuku.
Skript umi odeslat soubor pres ctx.http.postForm (multipart, obsah Base64).

Sluzba E-mail pres SMTP. Neni to skript, ale vnitrni krok - SMTP neni HTTP.
Konektor nese schranku firmy, krok ma HTML telo, ve kterem se dosazene
hodnoty escapuji (znacky autora sablony jsou zamer, ostre zavorky od
zakaznika ne). Overeni konektoru se prihlasi na server a nic neodesle.

Helpdesk: Ticket.helpdeskSourceId drzi firmu, ktera pozadavek poslala,
vlastnikem zustava ta, ktera ho resi - jinak by ho resitel nemel ve sve
fronte. Komu pozadavek pripadne, urcuje Tenant.helpdeskProviderId.
Zadavatel vidi jen svoje pozadavky a smi k nim pripsat komentar.

Opravy v portalu:
- hlasky o ulozisti a odchozi IP vidi jen spravce platformy
- typ ticketu se v automatizaci vybira ze seznamu firmy, nebo dosadi z dat
- stav ticketu je otevreny naseptavac, ne ciselnik
- ticket jde zalozit rucne, zakaznik u nej neni povinny
- kanal se prejmenoval a parametry u webhooku jsou oznacene jako nepovinne
- srovnane markdown tabulky v cele dokumentaci

Co z teto davky jeste neni: prepinac firmy je porad jen stav uvnitr stranky
Prehled, takze se prepnuti neprojevi v Lidech ani jinde.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-26 07:40:16 +02:00

7.4 KiB

03 - Architektura a mapa kodu

Technologie

Vrstva Technologie
Server Node.js 20, Express 4, TypeScript, ESM
Web React 18, Vite 6, TypeScript, Tailwind 4, React Router 6
Auth JWT (jsonwebtoken), hesla bcrypt
Validace zod
Docs swagger-ui-express nad rucne psanou OpenAPI definici

Jeden package.json. Runtime zavislosti jsou v dependencies, nastroje pro build webu v devDependencies - runtime image je pak instaluje pres --omit=dev.

Build

tsc   src/**.ts   ->  dist/*.js
vite  web/        ->  dist/public/

Server obsluhuje dist/public jako statiku. Dockerfile kopiruje do vysledneho image jen dist, takze staci jedna slozka.

Mapa kodu - server

Cesta K cemu je
src/index.ts vstupni bod: middleware, mount routeru, statika, SPA, Swagger
src/config.ts cteni environment variables, normalizace ROOT_PATH
src/openapi.ts OpenAPI definice vcetne servers s prefixem proxy
src/types.ts typy uzivatele a JWT payloadu
src/middleware/auth.ts requireAuth, requireRole
src/events/bus.ts sbernice udalosti, ze ktere cerpa SSE stream
src/routes/auth.ts prihlaseni, odhlaseni, kdo jsem
src/routes/dashboard.ts data portalu, katalog konektoru, CRUD automatizaci
src/routes/stream.ts SSE stream zmen
src/routes/simulate.ts vyvolani provoznich udalosti
src/routes/webhook.ts verejny prijem dat do automatizace
src/routes/contact.ts poptavkovy formular z webu
src/data/ticketStore.ts tickety, jejich resitele, log prubehu, prehled vytizeni
src/data/people.ts resitele ticketu - oddeleni od uzivatelu portalu
src/data/tenants.ts firmy, ktere portal pouzivaji
src/data/access.ts kdo co vidi - jedno misto pro cely portal
src/data/widgets.ts katalog widgetu prehledu
src/data/dashboardLayouts.ts rozlozeni dashboardu za dvojici uzivatel a firma
src/data/incidentStore.ts incidenty vcetne zmen a udalosti
src/data/automationStore.ts automatizace, strom akci, tokeny webhooku
src/data/connectors.ts katalog konektoru, jejich spousteču a akci
src/data/conditions.ts typy parametru a operatory podminek
src/data/templates.ts sablony {{parametr}} v nastaveni kroku
src/data/flowScope.ts co je videt v kterem miste stromu
src/data/users.ts demo uzivatele
src/data/mock.ts souhrn pro prehled a casova rada grafu

Mapa kodu - web

Cesta K cemu je
web/src/main.tsx vstupni bod, basename routeru podle prefixu proxy
web/src/App.tsx routovani, portal se nacita lazy
web/src/index.css design tokeny a vlastni utility Tailwindu
web/src/config/brand.ts vsechny firemni udaje na jednom miste
web/src/lib/api.ts fetch wrapper, sprava tokenu, skladani adres
web/src/lib/eventStream.ts cteni SSE streamu pres fetch
web/src/lib/useApiQuery.ts nacitani dat vcetne obnoveni pri udalosti
web/src/lib/flow.ts ciste funkce nad stromem automatizace
web/src/components/dashboard/ shell portalu, dlazdice, graf, stream, simulace
web/src/components/dashboard/flow/ strom akci, vyber kroku, nastaveni poli akce
web/src/components/dashboard/TicketTrace.tsx log ticketu jako strom
web/src/components/dashboard/TicketWorkload.tsx prehled, kdo co ma u sebe
web/src/components/home/ sekce homepage
web/src/pages/ jedna stranka je jeden soubor

Klicova rozhodnuti

Jeden container misto dvou. AppFactory nasazuje jednu aplikaci, proto Express obsluhuje i statiku. Odpada CORS i druha deploy jednotka.

SSE misto WebSocketu. Tok dat je jednosmerny, server ke klientovi. Klient posila zmeny beznym REST volanim. SSE prochazi reverse proxy bez zvlastni konfigurace.

Stream pres fetch, ne pres EventSource. EventSource neumi poslat hlavicku Authorization a token by musel byt v adrese, odkud se dostane do access logu. Cenou je rucni parsovani a rucni znovupripojeni v web/src/lib/eventStream.ts.

Ceske cesty v URL. /sluzby, /o-nas, /prihlaseni, /dashboard/tickety. Kod zustava anglicky.

Data v pameti. Vedome zjednoduseni prototypu. Uloziste jsou oddelena od rout, takze napojeni na databazi znamena prepsat soubory v src/data/, ne endpointy.

Filtr na firmu je povinny argument. listTickets, listPeople i listAutomations vyzaduji tenantIds. Zapomenuty filtr tak neznamena "vse", ale nezkompiluje se. Podrobnosti v 07-firmy-a-prava.md.

Prava se nikdy nedovozuji na klientovi. Server vraci GET /api/dashboard/access s tim, co uzivatel smi. Kdyby si to klient pocital sam, pocitalo by se to na dvou mistech a jednou se to rozejde.

Resitel neni uzivatel. Uzivatel se prihlasuje do portalu, resitel ma u sebe tickety. Technik muze mit tickety a ucet nikdy nemit. Spojka je e-mail, podrobnosti v 06-tickety.md.

Filtrovani ticketu dela server. Klient posila query parametry a dostane hotovy seznam. Kdyby filtroval sam, ukazoval by jina cisla nez prehled vytizeni.

Krok vidi jen to, co je pred nim. Parametry spoustece plus vystupy predchozich kroku. Vetev podminky nepridava nic do sekvence za podminkou, protoze nemusela probehnout. Vypocet je v flowScope.ts, priklady v 06-tickety.md.

Sablony odkazuji jmenem, ne ID. Opak podminek, a je to zamer: {{subject}} uzivatel napise a precte, {{f_42}} ne. Rozbite odkazy po prejmenovani se hlasi jako nedodelek.

Zadna ticha selhani. Kazdy catch loguje a uzivatel se o chybe dozvi.