Prava a bezpecnost: spravce firmy uz nemuze nastavit priznak spravce platformy ani clenstvi v cizi firme; pozvanky, konektory a automatizace kontroluji sve pravo; cizi firma v query je 404; zivy stream posila udalosti jen firmam, kterych se tykaji; akce nad ticketem maji kontrolu prava za firmu ticketu a strop viditelnosti; tokeny se nelogujou; limit pokusu na prihlaseni, kontakt a pozvanky; bezpecnostni hlavicky; zachyceni chyb v async handlerech; timing-safe porovnani tokenu. Vykon: audit neskenuje celou kolekci pri kazdem zapisu a konecne maze firemni zaznamy; ticket se uklada jednou misto trikrat; zapisy do Postgresu jsou serializovane podle ID; prava se pocitaji jednou na request; widgety nacitaji tickety jednou; strankovani seznamu; worker je pool misto kol; na webu udalost ze streamu neodmontuje stranku, dotazy maji spolecny debounce a cache, ciselniky drzi typovany sklad. Runtime: opakuji se jen chyby oznacene retryable; smycka nenarazi na strop 50 kroku (novy strop 1000 akci); podminka nad datem funguje; vystup MCP nastroje neprepisuje spoustec; sandbox skriptu firmy nejde opustit; MCP session id se drzi mezi volanimi; incident z kroku patri firme; jedno rozhodnuti o rezimu uloziste; snapshot neprepise soubor po chybe cteni. Refaktory: sdilene typy API v src/shared (web nic nekopiruje, osm rozjetych tvaru sjednoceno); spolecny modul net/guard pro volani ven; formularova vrstva ui/form; rozdeleni Connectors a FlowCanvas; jeden helper pro firmu z query, validaci a CRUD udalosti; pomucky ctx.util pro skripty konektoru; i18n verejneho webu vcetne anglictiny. Nova funkce: zalozeni firmy z registru ARES v Nastaveni (IC nebo nazev, dotazeni IC, DIC, sidla a pravni formy, vyber soucasnych statutarnich zastupcu a prokury, ucty spravce firmy s nahradnim e-mailem IC-poradi@placeholder.cz). Dokumentace: zaznam v 99-zmeny.md a aktualizace 15 dalsich dokumentu. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
107 lines
3.1 KiB
TypeScript
107 lines
3.1 KiB
TypeScript
import tailwindcss from '@tailwindcss/vite';
|
|
import react from '@vitejs/plugin-react';
|
|
import { execSync } from 'node:child_process';
|
|
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { defineConfig, type Plugin } from 'vite';
|
|
|
|
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
|
|
/**
|
|
* Oznaceni buildu.
|
|
*
|
|
* Bez nej se nasazena verze nepozna: aplikace bezi, jen je stara, a z venku
|
|
* to vypada stejne jako kdyz je nova. Prave to nas jednou stalo pul hodiny
|
|
* hadani, proc je na produkci porad stary vzhled.
|
|
*
|
|
* Cas buildu je hlavni udaj, protoze funguje vzdycky. Commit je bonus: do
|
|
* image se `.git` nekopiruje (`.dockerignore`), takze v produkcnim buildu
|
|
* chybi a zustane prazdny.
|
|
*/
|
|
const pkg: { version: string } = JSON.parse(
|
|
fs.readFileSync(path.resolve(here, 'package.json'), 'utf8'),
|
|
);
|
|
|
|
function gitCommit(): string {
|
|
try {
|
|
return execSync('git rev-parse --short HEAD', { stdio: ['ignore', 'pipe', 'ignore'] })
|
|
.toString()
|
|
.trim();
|
|
} catch {
|
|
// V containeru `.git` neni. Neni to chyba, jen se commit nedozvime.
|
|
return '';
|
|
}
|
|
}
|
|
|
|
const buildInfo = {
|
|
version: pkg.version,
|
|
builtAt: new Date().toISOString(),
|
|
commit: gitCommit(),
|
|
};
|
|
|
|
/**
|
|
* Vlozi oznaceni buildu i do hlavicky stranky.
|
|
*
|
|
* V JS balicku uz je, ale ten se musi stahnout a rozbalit. Meta znacka je
|
|
* videt na jeden `curl` bez prihlaseni - a presne to clovek potrebuje, kdyz
|
|
* zjistuje, co vlastne bezi na produkci.
|
|
*/
|
|
function buildStamp(): Plugin {
|
|
return {
|
|
name: 'build-stamp',
|
|
transformIndexHtml() {
|
|
return [
|
|
{
|
|
tag: 'meta',
|
|
attrs: {
|
|
name: 'app-build',
|
|
content: [buildInfo.version, buildInfo.builtAt, buildInfo.commit]
|
|
.filter(Boolean)
|
|
.join(' '),
|
|
},
|
|
injectTo: 'head',
|
|
},
|
|
];
|
|
},
|
|
};
|
|
}
|
|
|
|
export default defineConfig({
|
|
root: path.resolve(here, 'web'),
|
|
/**
|
|
* Relativni base. Aplikace bezi za reverse proxy na /apps/<app-id>, ktery
|
|
* neni znamy pri buildu. Server proto do index.html vklada <base href>
|
|
* podle ROOT_PATH a relativni odkazy se podle nej slozi spravne.
|
|
*/
|
|
base: './',
|
|
plugins: [react(), tailwindcss(), buildStamp()],
|
|
define: {
|
|
__BUILD_INFO__: JSON.stringify(buildInfo),
|
|
},
|
|
resolve: {
|
|
// Musi zustat v souladu s "paths" ve web/tsconfig.json
|
|
alias: {
|
|
'@': path.resolve(here, 'web/src'),
|
|
// Typy API sdilene se serverem. Jen typy, do balicku se nic nedostane.
|
|
'@shared': path.resolve(here, 'src/shared'),
|
|
},
|
|
},
|
|
server: {
|
|
port: 5173,
|
|
proxy: {
|
|
// Lokalni vyvoj: web na 5173 vola API na 3000, bez reseni CORS.
|
|
'/api': { target: 'http://localhost:3000', changeOrigin: true },
|
|
'/webhook': { target: 'http://localhost:3000', changeOrigin: true },
|
|
},
|
|
},
|
|
build: {
|
|
// Server tuhle slozku obsluhuje jako statiku, viz src/index.ts.
|
|
outDir: path.resolve(here, 'dist/public'),
|
|
emptyOutDir: true,
|
|
// Zadne mapy do produkce: dist/public se serviruje jako statika a mapy
|
|
// by byly verejne. Ve vyvoji je Vite dela sam.
|
|
sourcemap: false,
|
|
},
|
|
});
|