feat(moduli): mehanizam uključenih modula — Moduli mapa i RequireModul (Faza 0)

config.SviModuli + PodaciStranice.Moduli (uslovni meni, analogno Dozvole)
i middleware.RequireModul (zaštita ruta, analogno RequireDozvola). Sloj
iznad RBAC-a: zahtev mora proći i „modul uključen" i „korisnik sme".
Dopunjen test (TestSviModuli). Time je Faza 0 kompletna.
This commit is contained in:
2026-06-13 20:23:24 +02:00
parent 3817ba4cbd
commit 6d066f6704
5 changed files with 71 additions and 1 deletions
+27
View File
@@ -0,0 +1,27 @@
package middleware
import (
"context"
"net/http"
)
// RequireModul je chi middleware koji propušta zahtev samo ako je traženi zakonski
// modul uključen za firmu (prema profilu firme iz podešavanja). Ovo je sloj IZNAD
// RBAC-a: „da li firma uopšte koristi modul", nezavisno od „da li korisnik sme"
// (RequireDozvola). Zahtev mora proći oba sloja.
//
// Provera se prosleđuje kao funkcija (proveri) da paket middleware ne zavisi od
// config/sqlite — isti obrazac kao RequireDozvola. U praksi je to closure koja
// učita podešavanja i pozove config.ModulUkljucen.
func RequireModul(proveri func(ctx context.Context, modul string) bool, modul string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !proveri(r.Context(), modul) {
postaviFlashGresku(w, "Ovaj modul nije uključen za vašu firmu.")
http.Redirect(w, r, "/dashboard", http.StatusSeeOther)
return
}
next.ServeHTTP(w, r)
})
}
}