166 lines
5.6 KiB
Go
166 lines
5.6 KiB
Go
package handler
|
|
|
|
import (
|
|
"database/sql"
|
|
"html/template"
|
|
"io/fs"
|
|
"net/http"
|
|
|
|
"ntech/internal/db"
|
|
"ntech/internal/db/sqlite"
|
|
"ntech/internal/middleware"
|
|
"ntech/internal/model"
|
|
)
|
|
|
|
// Handler drži zavisnosti koje su potrebne svim handlerima
|
|
type Handler struct {
|
|
DB *sql.DB
|
|
PutanjaBaze string
|
|
Artikli db.ArtikalRepository
|
|
KategorijeRepo db.KategorijaRepository
|
|
DobavljaciRepo db.DobavljacRepository
|
|
NabavkeRepo db.NabavkaRepository
|
|
KlijentiRepo db.KlijentRepository
|
|
ServisRepo db.ServisRepository
|
|
ProdajaRepo db.ProdajaRepository
|
|
KorisniciRepo db.KorisniciRepository
|
|
SesijeRepo db.SesijeRepository
|
|
PodsetniciFRepo db.PodsetnikRepository
|
|
PokusajiRepo db.PokusajiPrijaveRepository
|
|
LoginIstorijsaRepo db.LoginIstorijsaRepository
|
|
DozvoleRepo db.DozvoleRepository
|
|
Verzija string
|
|
Templates map[string]*template.Template
|
|
TemplatesFS fs.FS
|
|
}
|
|
|
|
// Novi kreira novi Handler sa datom bazom
|
|
func Novi(baza *sql.DB) *Handler {
|
|
return &Handler{
|
|
DB: baza,
|
|
Artikli: sqlite.NoviArtikalRepo(baza),
|
|
KategorijeRepo: sqlite.NovaKategorijaRepo(baza),
|
|
DobavljaciRepo: sqlite.NoviDobavljacRepo(baza),
|
|
NabavkeRepo: sqlite.NoviNabavkaRepo(baza),
|
|
KlijentiRepo: sqlite.NoviKlijentRepo(baza),
|
|
ServisRepo: sqlite.NoviServisRepo(baza),
|
|
ProdajaRepo: sqlite.NoviProdajaRepo(baza),
|
|
KorisniciRepo: sqlite.NoviKorisniciRepo(baza),
|
|
SesijeRepo: sqlite.NoviSesijeRepo(baza),
|
|
PodsetniciFRepo: sqlite.NoviPodsetnikRepo(baza),
|
|
PokusajiRepo: sqlite.NoviPokusajiPrijaveRepo(baza),
|
|
LoginIstorijsaRepo: sqlite.NoviLoginIstorijsaRepo(baza),
|
|
DozvoleRepo: sqlite.NoviDozvoleRepo(baza, middleware.ImaDozvolu, middleware.SveAkcije()),
|
|
}
|
|
}
|
|
|
|
// reinicijalzijRepozitorijume zamenjuje sve repozitorijume posle obnove baze
|
|
func (h *Handler) reinicijalzijRepozitorijume(novaDB *sql.DB) {
|
|
h.DB = novaDB
|
|
h.Artikli = sqlite.NoviArtikalRepo(novaDB)
|
|
h.KategorijeRepo = sqlite.NovaKategorijaRepo(novaDB)
|
|
h.DobavljaciRepo = sqlite.NoviDobavljacRepo(novaDB)
|
|
h.NabavkeRepo = sqlite.NoviNabavkaRepo(novaDB)
|
|
h.KlijentiRepo = sqlite.NoviKlijentRepo(novaDB)
|
|
h.ServisRepo = sqlite.NoviServisRepo(novaDB)
|
|
h.ProdajaRepo = sqlite.NoviProdajaRepo(novaDB)
|
|
h.KorisniciRepo = sqlite.NoviKorisniciRepo(novaDB)
|
|
h.SesijeRepo = sqlite.NoviSesijeRepo(novaDB)
|
|
h.PodsetniciFRepo = sqlite.NoviPodsetnikRepo(novaDB)
|
|
h.PokusajiRepo = sqlite.NoviPokusajiPrijaveRepo(novaDB)
|
|
h.LoginIstorijsaRepo = sqlite.NoviLoginIstorijsaRepo(novaDB)
|
|
h.DozvoleRepo = sqlite.NoviDozvoleRepo(novaDB, middleware.ImaDozvolu, middleware.SveAkcije())
|
|
}
|
|
|
|
// popuniPodaciStranice popunjava zajednička polja stranice uključujući prijavljenog korisnika
|
|
func (h *Handler) popuniPodaciStranice(r *http.Request, podesavanja map[string]string) model.PodaciStranice {
|
|
// redosled prioriteta teme: pozadinska slika → lokalna → globalna → fallback
|
|
globalnaTema := podesavanja["globalna_tema"]
|
|
if globalnaTema == "" {
|
|
globalnaTema = podesavanja["tema"]
|
|
}
|
|
if globalnaTema == "" {
|
|
globalnaTema = "tamna"
|
|
}
|
|
tema := globalnaTema
|
|
|
|
ps := model.PodaciStranice{
|
|
Tema: tema,
|
|
NazivFirme: podesavanja["naziv_firme"],
|
|
Podnazlov: podesavanja["podnazlov"],
|
|
LogoTip: podesavanja["logo_tip"],
|
|
LogoPutanja: podesavanja["logo_putanja"],
|
|
Korisnik: "Admin",
|
|
}
|
|
var korisnik *model.Korisnik
|
|
if k := middleware.KorisnikIzKonteksta(r.Context()); k != nil {
|
|
korisnik = k
|
|
ps.Korisnik = k.KorisnickoIme
|
|
ps.KorisnikIme = k.KorisnickoIme
|
|
ps.KorisnikUloga = k.Uloga
|
|
ps.Dozvole = h.DozvoleRepo.SveDozvole(r.Context(), k.Uloga)
|
|
// lokalna tema korisnika
|
|
if k.KoristiLokalnuTemu && k.LokalnaTema != "" {
|
|
ps.Tema = k.LokalnaTema
|
|
}
|
|
}
|
|
ps.CsrfToken = middleware.CsrfToken(r.Context())
|
|
ps.Flash = middleware.GetFlash(r, h.DB)
|
|
|
|
// logika pozadine:
|
|
// - lična pozadina (samo kada je lokalni režim aktivan) → zamenjuje globalnu
|
|
// - globalna pozadina → prikazuje se svima koji nemaju ličnu
|
|
// KoristiLokalnuTemu utiče na izbor tamne/svetle teme, ne na vidljivost pozadine
|
|
if korisnik != nil && korisnik.KoristiLokalnuTemu && korisnik.LokalnaPozadina != "" {
|
|
ps.AppPozadina = korisnik.LokalnaPozadina
|
|
ps.Tema = "tamna"
|
|
ps.AppPozadinaOpacity = korisnik.LokalnaPozadinaOpacity
|
|
if ps.AppPozadinaOpacity == "" {
|
|
ps.AppPozadinaOpacity = "50"
|
|
}
|
|
ps.AppPozadinaBlur = korisnik.LokalnaPozadinaBlur
|
|
if ps.AppPozadinaBlur == "" {
|
|
ps.AppPozadinaBlur = "12"
|
|
}
|
|
ps.AppPozadinaBlurPozadine = korisnik.LokalnaPozadinaBlurPozadine
|
|
if ps.AppPozadinaBlurPozadine == "" {
|
|
ps.AppPozadinaBlurPozadine = "0"
|
|
}
|
|
} else {
|
|
ps.AppPozadina = podesavanja["app_pozadina"]
|
|
if ps.AppPozadina != "" {
|
|
// globalna pozadina forsira tamnu temu, osim ako korisnik ima aktivnu lokalnu temu
|
|
if korisnik == nil || !korisnik.KoristiLokalnuTemu {
|
|
ps.Tema = "tamna"
|
|
}
|
|
ps.AppPozadinaOpacity = podesavanja["app_pozadina_opacity"]
|
|
if ps.AppPozadinaOpacity == "" {
|
|
ps.AppPozadinaOpacity = "50"
|
|
}
|
|
ps.AppPozadinaBlur = podesavanja["app_pozadina_blur"]
|
|
if ps.AppPozadinaBlur == "" {
|
|
ps.AppPozadinaBlur = "12"
|
|
}
|
|
ps.AppPozadinaBlurPozadine = podesavanja["app_pozadina_blur_pozadine"]
|
|
if ps.AppPozadinaBlurPozadine == "" {
|
|
ps.AppPozadinaBlurPozadine = "0"
|
|
}
|
|
} else {
|
|
ps.AppPozadinaOpacity = podesavanja["app_pozadina_opacity"]
|
|
if ps.AppPozadinaOpacity == "" {
|
|
ps.AppPozadinaOpacity = "50"
|
|
}
|
|
ps.AppPozadinaBlur = podesavanja["app_pozadina_blur"]
|
|
if ps.AppPozadinaBlur == "" {
|
|
ps.AppPozadinaBlur = "12"
|
|
}
|
|
ps.AppPozadinaBlurPozadine = podesavanja["app_pozadina_blur_pozadine"]
|
|
if ps.AppPozadinaBlurPozadine == "" {
|
|
ps.AppPozadinaBlurPozadine = "0"
|
|
}
|
|
}
|
|
}
|
|
|
|
return ps
|
|
}
|