JiriUhlirandClaude Opus 5 6bcd7f845c Hierarchie firmy: kdo co vidi, a zalozka Firma
Pohled na celou firmu dostal kazdy, kdo do ni patril: scopes.push('tenant')
se v access.ts neptalo na nic. mine byl dobrovolny filtr, ne strop, takze
resitel s roli agent poslal ?scope=tenant a dostal cely provoz.

Rozdil, na kterem to ted stoji: pohled je co chci videt, strop je co vubec smim
videt. Existoval jen pohled a klientovi se veril.

Model:

- Membership.seesAllTenant - vidi cely provoz firmy. Postaveni uctu ve firme,
  ne vlastnost resitele: clovek muze byt ve dvou firmach jednou reditel
  a jednou brigadnik
- PersonGroup.members je { personId, seesAll } misto holeho personIds. seesAll
  je vedouci sekce. Priznak visi na clenstvi, ne na cloveku a ne na skupine -
  diky tomu muze byt clovek v peti sekcich a jen ve dvou videt vsechno, coz
  role rict neumi, ta je jedna na celou firmu
- stara podoba personIds se dal cte, prevadi ji groupMembers

Vypocet stropu (visibilityFor), sjednoceni ne prunik: spravce platformy nebo
seesAllTenant vidi celou firmu, jinak svoje tickety plus vse ze sekci, kde ma
zaskrtnuto, plus jejich fronta. U zaznamu bez priznaku rozhoduje pravo
ticket.assign.others - kdo smel prehazovat cizi praci, uz stejne cely provoz
videl, takze se mu nic nebere.

Vynuceni:

- strop je povinna soucast TicketFilter, stejne jako tenantIds. Nepovinny filtr
  na prava je filtr, ktery jednou nekde chybi - takhle prekladac ukazal vsech
  trinact mist, ktera ho jeste nemela
- getWorkload a getAgentStats uz nesahaji do pole ticketu primo, jdou pres
  listTickets. Driv obchazely kazde omezeni viditelnosti
- getTicket kontroluje strop i u jednoho ticketu, bez toho by stacilo znat ID
- detail a prevzeti pocitaji strop za firmu ticketu, ne za prave prepnutou

Helpdesk se ridi toutez hierarchii, jen "moje" znamena, co jsem zalozil -
zadavatel pozadavek nikdy nema prirazeny. Ticket proto nese createdById.

Zalozka Firma: pod jednim mistem Prehled, Resitele, Sekce, Role a prava, Typy
ticketu a Pozvanky. V Nastaveni zustal Muj ucet a platformni veci. Role a Typy
jsou samostatne komponenty, sekce maji vlastni panel - u kazdeho clenstvi je
prepinac a radek na cloveka obecny EntityAdmin neumi.

Obsah ticketu se cte i v helpdesku, v seznamu jako jednoradkovy nahled.

Overeno na bezici instanci se tremi ucty nad tymiz daty: spravce platformy vidi
vsechny tri tickety vcetne neprirazeneho, Vomacka jako vedouci Servicedesku dva
(tickety obou clenu sekce), Kriz jako radovy clen jeden, jen svuj. Adresa cizho
ticketu vraci 404, vytizeni tymu ukazuje jen viditelne a po zaskrtnuti priznaku
se rozsah zmeni hned.

Co z toho plyne: neprirazeny ticket bez skupiny nevidi nikdo krome toho, kdo
vidi celou firmu. Prichozi praci musi nekdo smerovat.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-02 12:15:47 +02:00
2026-07-31 14:42:26 +00:00

csbot-prototype

Web a klientsky portal firmy zamerene na automatizace, voiceboty, integrace, dashboardy, tickety a incident management.

Jedna aplikace v jednom containeru: Express obsluhuje API i zbuildovanou React aplikaci. Bezi v AppFactory za reverse proxy na /apps/<app-id>.

Rychly start

npm install
npm run build
npm start

Aplikace nasloucha na 0.0.0.0:3000.

Lokalni vyvoj s hot reloadem (API na 3000, web na 5173):

npm run dev

Povinne endpointy

Cesta Ucel
/health Health check pro AppFactory, vraci 200
/docs Swagger UI
/openapi.json OpenAPI definice

Verejne pres proxy jako /apps/<app-id>/health a /apps/<app-id>/docs.

Demo prihlaseni

E-mail Heslo Role
admin@automia.cz demo1234 interni spravce
klient@firma.cz demo1234 klient

Environment variables

Promenna Povinna Vychozi Popis
PORT ne 3000 Port containeru, urcuje AppFactory sablona
ROOT_PATH ne prazdne Prefix proxy, napr. /apps/csbot-prototype
JWT_SECRET ano v produkci - Podpis tokenu, bez nej aplikace nenastartuje
JWT_EXPIRES_IN ne 8h Platnost tokenu
PUBLIC_ORIGIN ne prazdne Verejna domena pro absolutni adresy webhooku
CORS_ORIGIN ne localhost Povolene originy, jen pro lokalni vyvoj

Secrets se nikdy nelogují ani neukladaji do kodu.

Skripty

Prikaz Co dela
npm run build Zbuilduje server i web do dist/
npm start Spusti zbuildovanou aplikaci
npm run dev Vyvoj s hot reloadem
npm run typecheck Kontrola typu bez generovani vystupu

Dokumentace

Podrobnosti jsou ve slozce documentation/. Pred upravou projektu staci precist ji, neni nutne prochazet cely kod.

Pravidla pro AI asistenty a nastroje jsou v AGENTS.md.

S
Description
No description provided
Readme
2.8 MiB
Languages
TypeScript 91.8%
JavaScript 6.4%
HTML 1.5%
CSS 0.3%