licence-server/docs/loggerservice/01-rbac-model.md
Nenad Djukic 28296b390c Preuzet radni paket LoggerService (RBAC kontrolna ravan) iz firmverskog repoa
Paket je nastao u asp-terminia/serviseri/ ali je sav posao serverski (isti
backend i baza kao ASP-Terminia licenciranje), pa se seli ovde - isto
obrazlozenje i put kao docs/asp-terminia/.

- docs/loggerservice/ - 7 dokumenata: vizija/MVP (merodavan dokument),
  ZAKLJUCEN RBAC model (stablo orgs, 4 role, invarijante, seme tabela),
  heartbeat/discovery formati koje uredjaj vec salje, provisioning i
  katalog firmvera, zadaci S1-S7, pravila rada na produkciji
- reference prepravljene: "ASP repo" = https://git.terminia.net/djuka/asp-terminia,
  link ka docs/asp-terminia/ unutar istog repoa umesto stare "dal-license-server
  repo:" oznake
- CLAUDE.md: sekcija LoggerService + koordinacija sa docs/asp-terminia/
  (S1-S2 idu POSLE Z1 da se migracije ne sudare)

Firmverska strana (svc.cpp, discovery/heartbeat) ostaje u ASP repou i ne dira se.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-25 07:10:37 +02:00

82 lines
3.4 KiB
Markdown

# RBAC model — ZAKLJUČENO sa vlasnikom 2026-07-24
> Ovo NIJE predlog za raspravu — model je dogovoren. Slobodne su implementacione
> odluke (imena kolona, indeksi, Go slojevi), ne semantika.
## 1. Stablo organizacija
Hijerarhijsko stablo proizvoljne dubine; **koren = Terminia (vendor)**. Primer:
```
Terminia (vendor, koren)
├─ DAL (kupac) ← DAL je KUPAC, ne vendor!
│ ├─ Bazen Gradski (objekat/pod-firma)
│ └─ Spa Centar X
├─ Distributer Jug
│ └─ Firma Y
│ └─ Bazen Z
└─ ServisPlus (org tipa "serviser") ← eksterni serviseri kao zaseban org
```
### Tabele (dogovorene; tipove/indekse odrediti po MySQL praksi projekta)
```sql
orgs(id, parent_id NULL za koren, tip ENUM('vendor','distributer','firma','objekat','serviser',...),
naziv, status)
users(id, org_id, rola ENUM('owner','admin','operator','viewer'), ime, email, auth...)
devices(id, org_id, mac UNIQUE, product_code, fw_verzija, status, license_id NULL,
naziv, poslednji_heartbeat, ip)
entitlements(id, org_id, product_code, max_uredjaja, fw_kanal, vazi_do)
service_grants(id, serviser_org_id, ciljni_org_id NULL / ciljni_device_id NULL,
dozvole SET('registruj','flesuj_fw','odrzavanje'), vazi_do)
sale_grants(id, prodavac_user_id ili org_id, plan/proizvod opseg, vazi_do)
```
## 2. Role (iste na SVAKOM čvoru stabla)
| Rola | Prava |
|---|---|
| **Owner** | pun vlasnik org-a i CELOG podstabla |
| **Admin** | upravljanje unutar org-a |
| **Operator** | operativni rad (kasir na terminalu / interni serviser) |
| **Viewer** | samo pregled |
## 3. Invarijante (moraju biti sprovedene u kodu, ne samo dogovoru)
1. **Delegacija sa podskupom:** dete-org dobija PODSKUP prava roditelja; zbir
entitlements dece ≤ roditeljev max (`max_uredjaja` itd.).
2. **Vidljivost (row-level):** org vidi SEBE + celo svoje PODSTABLO. Ništa iznad,
ništa bočno. Svaki upit ide kroz filter podstabla (CTE po `parent_id` ili
materijalizovana putanja — implementaciona odluka).
3. **Serviser ≠ vlasnik:** service_grant daje PRISTUP (registruj/flešuj/održavaj)
nad tuđim org-om/uređajima, sa rokom — NE daje vlasništvo ni uvid u naplatu.
4. **Prodavac ne kreira** zone/cenovnik (to su entiteti objekta na uređaju) —
`sale_grants` samo kaže KOJE planove sme da prodaje.
## 4. Odnos sa licencama
- `devices.license_id` → licenca iz postojećeg licencnog sistema ([`docs/asp-terminia/`](../asp-terminia/README.md)).
- `entitlements` je „koliko čega sme org" — licencni server pri izdavanju ključa
proverava entitlement (npr. max_uredjaja).
- **Kill-switch lanac:** opoziv licence (revoked) + istek + offline grejs na
uređaju + sigurno stanje — mehanika na uređaju, okidač na serveru.
## 5. Dva lica, jedan mozak
- **Terminia lice** (`terminia.net`): vendor pogled — proizvodi, licence, katalog FW.
- **LoggerService lice** (`loggerservice.com`): serviserski pogled — moji grantovi,
uređaji do kojih smem, registracija/flešovanje/održavanje, nalozi servisera.
- Tehnički: isti Go backend + baza; lice se bira po hostu (nginx `server_name`) i/ili
po tipu org-a prijavljenog korisnika. Brendiranje (logo/boje/naziv) po licu.
## 6. Pristup „sve odmah / UI inkrementalno"
Dogovor: **pun MODEL/šema odmah** (migracije za sve tabele iznad), a **UI dashboard
inkrementalno** (prvo orgs+devices+users, pa grantovi). Uređaji teku paralelno —
heartbeat prijem (02) može i pre punog UI-ja.