Firmy a prava: tenance napric portalem

Portal nemel zadnou tenanci. Kterykoliv prihlaseny uzivatel videl vsechny
tickety vsech firem i cely seznam resitelu, requireRole se nikde nevolal.

Tenant je hranice viditelnosti, tenantId na ticketu, resiteli i automatizaci.
Uzivatel muze patrit do vic firem, v kazde s jinou roli. Pristup napric firmami
je zvlast jako platformAdmin.

Tri pohledy na tickety: all, tenant, mine. Admin mezi nimi prepina vcetne
vyberu firmy. O pravech rozhoduje jedine data/access.ts, klient si nic
nedovozuje a bere je z GET /api/dashboard/access.

Filtr na firmu je v ulozistich povinny argument, takze zapomenuty filtr
neznamena vse, ale nezkompiluje se. Cizi firma vraci 403 nebo 404, nikdy
tise zuzeny vysledek.

Prirazeni jen v ramci firmy. Prehazovat praci mezi lidmi smi jen admin,
agent si smi vzit ticket na sebe.

Zmena prihlasovani: ucet klient@firma.cz zanikl, demo ucty jsou nove.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
JiriUhlir
2026-08-03 12:59:30 +02:00
co-authored by Claude Opus 5
parent dd021b5f69
commit 2a3d75c85e
25 changed files with 997 additions and 163 deletions
+15 -12
View File
@@ -37,16 +37,19 @@ export function requireAuth(req: Request, res: Response, next: NextFunction) {
}
}
/** Omezi pristup na konkretni role. Pouzivat vzdy AZ za requireAuth. */
export function requireRole(...roles: User['role'][]) {
return (req: Request, res: Response, next: NextFunction) => {
if (!req.user) {
console.error('[auth] requireRole pouzito bez requireAuth');
return res.status(401).json({ error: 'unauthorized' });
}
if (!roles.includes(req.user.role)) {
return res.status(403).json({ error: 'forbidden', message: 'Nedostatečná oprávnění.' });
}
return next();
};
/**
* Jen pro spravce platformy, tedy pristup napric vsemi firmami.
* Prava uvnitr firmy resi `data/access.ts`, ne middleware - zavisi na tom,
* kterou firmu pozadavek zrovna zajima.
*/
export function requirePlatformAdmin(req: Request, res: Response, next: NextFunction) {
if (!req.user) {
console.error('[auth] requirePlatformAdmin pouzito bez requireAuth');
return res.status(401).json({ error: 'unauthorized' });
}
if (!req.user.platformAdmin) {
console.warn(`[auth] ${req.user.email}: pokus o platformni akci`);
return res.status(403).json({ error: 'forbidden', message: 'Nedostatečná oprávnění.' });
}
return next();
}