From 4fe6d53bf9d46679bb3e0100806971a21d13b023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Tue, 16 Jun 2026 03:00:38 +0200 Subject: [PATCH] =?UTF-8?q?Ispravke:=20ugnje=C5=BEdena=20forma,=20gre?= =?UTF-8?q?=C5=A1ka=20=C4=8Ditanja=20fajla,=20mrtvi=20flag,=20refaktor=20s?= =?UTF-8?q?truct?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - podesavanja_opste.html: forma za uklanjanje loga premešena van forme za otpremanje — ugnježdene forme su nevažeći HTML - ProfilOtpremiAvatar: greška iz fajl.Read(buf) se sada proverava (dozvoljava io.EOF, odbacuje pravi problem čitanja) - TopbarLogoTekst uklonjen: iz modela, oba handlera i struct-a u podesavanja.go (podešavanje nije korišćeno ni u jednom šablonu) - korisnici.go: dodeliOpcijeKorisnika prima korisnikOpcije struct umesto dugačke liste parametara; skeniraiKorisnika i Lista ažurirani --- internal/db/sqlite/korisnici.go | 81 ++++++++++--------- internal/handler/handler.go | 1 - internal/handler/podesavanja.go | 8 -- internal/handler/profil.go | 7 +- internal/model/stranica.go | 1 - web/templates/stranice/podesavanja_opste.html | 46 +++++------ 6 files changed, 70 insertions(+), 74 deletions(-) diff --git a/internal/db/sqlite/korisnici.go b/internal/db/sqlite/korisnici.go index 171e67a..430e29c 100644 --- a/internal/db/sqlite/korisnici.go +++ b/internal/db/sqlite/korisnici.go @@ -17,43 +17,48 @@ type sqliteKorisniciRepo struct { kljuc []byte } -// dodeliOpcijeKorisnika popunjava bool i opciona polja korisnika iz skeniranih -// NULL vrednosti — deljeno između skeniraiKorisnika (jedan red) i Lista (više redova) -func dodeliOpcijeKorisnika(k *model.Korisnik, aktivan, koristiLokalnuTemu int, - lokalnaTema, lokalnaPozadina, lokalnaPozadinaOpacity, lokalnaPozadinaBlur, - lokalnaPozadinaBlurPozadine, lokalnaPozadinaGlassOpacity, avatarPutanja sql.NullString, - datumKreiranja time.Time) { - k.Aktivan = aktivan == 1 - k.LokalnaTema = lokalnaTema.String - k.KoristiLokalnuTemu = koristiLokalnuTemu == 1 - k.DatumKreiranja = datumKreiranja - k.LokalnaPozadina = lokalnaPozadina.String - k.LokalnaPozadinaOpacity = lokalnaPozadinaOpacity.String - k.LokalnaPozadinaBlur = lokalnaPozadinaBlur.String - k.LokalnaPozadinaBlurPozadine = lokalnaPozadinaBlurPozadine.String - k.LokalnaPozadinaGlassOpacity = lokalnaPozadinaGlassOpacity.String - k.AvatarPutanja = avatarPutanja.String +// korisnikOpcije drži NULL vrednosti skeniranih opcionalnih kolona korisnika; +// dodavanje novog polja zahteva izmenu samo ovog struct-a i relevantnih Scan poziva. +type korisnikOpcije struct { + aktivan int + koristiLokalnuTemu int + datumKreiranja time.Time + lokalnaTema sql.NullString + lokalnaPozadina sql.NullString + lokalnaPozadinaOpacity sql.NullString + lokalnaPozadinaBlur sql.NullString + lokalnaPozadinaBlurPozadine sql.NullString + lokalnaPozadinaGlassOpacity sql.NullString + avatarPutanja sql.NullString +} + +// dodeliOpcijeKorisnika prenosi vrednosti iz korisnikOpcije na model.Korisnik +func dodeliOpcijeKorisnika(k *model.Korisnik, o korisnikOpcije) { + k.Aktivan = o.aktivan == 1 + k.KoristiLokalnuTemu = o.koristiLokalnuTemu == 1 + k.DatumKreiranja = o.datumKreiranja + k.LokalnaTema = o.lokalnaTema.String + k.LokalnaPozadina = o.lokalnaPozadina.String + k.LokalnaPozadinaOpacity = o.lokalnaPozadinaOpacity.String + k.LokalnaPozadinaBlur = o.lokalnaPozadinaBlur.String + k.LokalnaPozadinaBlurPozadine = o.lokalnaPozadinaBlurPozadine.String + k.LokalnaPozadinaGlassOpacity = o.lokalnaPozadinaGlassOpacity.String + k.AvatarPutanja = o.avatarPutanja.String } // skeniraiKorisnika čita jedan red iz baze i popunjava model.Korisnik func skeniraiKorisnika(row interface{ Scan(...any) error }) (*model.Korisnik, error) { k := &model.Korisnik{} - var aktivan, koristiLokalnuTemu int - var lokalnaTema sql.NullString - var lokalnaPozadina, lokalnaPozadinaOpacity, lokalnaPozadinaBlur, lokalnaPozadinaBlurPozadine, lokalnaPozadinaGlassOpacity sql.NullString - var avatarPutanja sql.NullString - var datumKreiranja time.Time + var o korisnikOpcije if err := row.Scan( - &k.ID, &k.KorisnickoIme, &k.LozinkaHash, &k.Uloga, &aktivan, &k.TotpTajna, - &lokalnaTema, &koristiLokalnuTemu, &datumKreiranja, - &lokalnaPozadina, &lokalnaPozadinaOpacity, &lokalnaPozadinaBlur, - &lokalnaPozadinaBlurPozadine, &lokalnaPozadinaGlassOpacity, &avatarPutanja, + &k.ID, &k.KorisnickoIme, &k.LozinkaHash, &k.Uloga, &o.aktivan, &k.TotpTajna, + &o.lokalnaTema, &o.koristiLokalnuTemu, &o.datumKreiranja, + &o.lokalnaPozadina, &o.lokalnaPozadinaOpacity, &o.lokalnaPozadinaBlur, + &o.lokalnaPozadinaBlurPozadine, &o.lokalnaPozadinaGlassOpacity, &o.avatarPutanja, ); err != nil { return nil, err } - dodeliOpcijeKorisnika(k, aktivan, koristiLokalnuTemu, lokalnaTema, - lokalnaPozadina, lokalnaPozadinaOpacity, lokalnaPozadinaBlur, - lokalnaPozadinaBlurPozadine, lokalnaPozadinaGlassOpacity, avatarPutanja, datumKreiranja) + dodeliOpcijeKorisnika(k, o) return k, nil } @@ -134,20 +139,16 @@ func (r *sqliteKorisniciRepo) Lista(ctx context.Context) ([]model.Korisnik, erro var lista []model.Korisnik for rows.Next() { var k model.Korisnik - var aktivan, koristiLokalnuTemu int - var lokalnaTema sql.NullString - var lokalnaPozadina, lokalnaPozadinaOpacity, lokalnaPozadinaBlur, lokalnaPozadinaBlurPozadine, lokalnaPozadinaGlassOpacity sql.NullString - var avatarPutanja sql.NullString - var datumKreiranja time.Time - if err := rows.Scan(&k.ID, &k.KorisnickoIme, &k.Uloga, &aktivan, &k.TotpTajna, - &lokalnaTema, &koristiLokalnuTemu, &datumKreiranja, - &lokalnaPozadina, &lokalnaPozadinaOpacity, &lokalnaPozadinaBlur, &lokalnaPozadinaBlurPozadine, - &lokalnaPozadinaGlassOpacity, &avatarPutanja); err != nil { + var o korisnikOpcije + if err := rows.Scan( + &k.ID, &k.KorisnickoIme, &k.Uloga, &o.aktivan, &k.TotpTajna, + &o.lokalnaTema, &o.koristiLokalnuTemu, &o.datumKreiranja, + &o.lokalnaPozadina, &o.lokalnaPozadinaOpacity, &o.lokalnaPozadinaBlur, + &o.lokalnaPozadinaBlurPozadine, &o.lokalnaPozadinaGlassOpacity, &o.avatarPutanja, + ); err != nil { return nil, fmt.Errorf("ntech: korisnici.Lista: %w", err) } - dodeliOpcijeKorisnika(&k, aktivan, koristiLokalnuTemu, lokalnaTema, - lokalnaPozadina, lokalnaPozadinaOpacity, lokalnaPozadinaBlur, - lokalnaPozadinaBlurPozadine, lokalnaPozadinaGlassOpacity, avatarPutanja, datumKreiranja) + dodeliOpcijeKorisnika(&k, o) r.desifrujTotpTajnu(&k) lista = append(lista, k) } diff --git a/internal/handler/handler.go b/internal/handler/handler.go index b70674c..717e218 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -166,7 +166,6 @@ func (h *Handler) popuniPodaciStranice(r *http.Request, podesavanja map[string]s Podnazlov: podesavanja["podnazlov"], LogoPutanja: podesavanja["logo_putanja"], TopbarLogoSlika: podesavanja["topbar_logo_slika"] == "1", - TopbarLogoTekst: podesavanja["topbar_logo_tekst"] == "1", Korisnik: "Admin", } var korisnik *model.Korisnik diff --git a/internal/handler/podesavanja.go b/internal/handler/podesavanja.go index b02ff24..48c48d4 100644 --- a/internal/handler/podesavanja.go +++ b/internal/handler/podesavanja.go @@ -30,7 +30,6 @@ type PodaciPodesavanja struct { PIB string LogoPutanja string TopbarLogoSlika bool - TopbarLogoTekst bool // profil firme — pravni/poreski status (Faza 0); određuje koji se zakonski moduli pale FirmaPravniOblik string FirmaPdvObveznik string @@ -84,7 +83,6 @@ func (h *Handler) Podesavanja(w http.ResponseWriter, r *http.Request) { PIB: podesavanja["pib"], LogoPutanja: podesavanja["logo_putanja"], TopbarLogoSlika: podesavanja["topbar_logo_slika"] == "1", - TopbarLogoTekst: podesavanja["topbar_logo_tekst"] == "1", Sacuvano: r.URL.Query().Get("sacuvano") == "1", BackupVracen: r.URL.Query().Get("sacuvano") == "vraceno", Verzija: h.Verzija, @@ -240,10 +238,6 @@ func (h *Handler) SacuvajPodesavanja(w http.ResponseWriter, r *http.Request) { if r.FormValue("topbar_logo_slika") == "1" { topbarLogoSlika = "1" } - topbarLogoTekst := "0" - if r.FormValue("topbar_logo_tekst") == "1" { - topbarLogoTekst = "1" - } polja := map[string]string{ "naziv_firme": r.FormValue("naziv_firme"), @@ -252,7 +246,6 @@ func (h *Handler) SacuvajPodesavanja(w http.ResponseWriter, r *http.Request) { "telefon": r.FormValue("telefon"), "pib": r.FormValue("pib"), "topbar_logo_slika": topbarLogoSlika, - "topbar_logo_tekst": topbarLogoTekst, // profil firme (Faza 0) — radio dugmad uvek šalju vrednost, pa se uredno čuvaju "firma_pravni_oblik": r.FormValue("firma_pravni_oblik"), "firma_pdv_obveznik": r.FormValue("firma_pdv_obveznik"), @@ -654,7 +647,6 @@ func (h *Handler) napuniPodaciPodesavanja(r *http.Request, naslov string) (Podac PIB: podesavanja["pib"], LogoPutanja: podesavanja["logo_putanja"], TopbarLogoSlika: podesavanja["topbar_logo_slika"] == "1", - TopbarLogoTekst: podesavanja["topbar_logo_tekst"] == "1", FirmaPravniOblik: vrednostIliDefault(podesavanja, "firma_pravni_oblik", "pausalac"), FirmaPdvObveznik: vrednostIliDefault(podesavanja, "firma_pdv_obveznik", "ne"), FirmaFiskalizacija: vrednostIliDefault(podesavanja, "firma_fiskalizacija", "ne"), diff --git a/internal/handler/profil.go b/internal/handler/profil.go index dcd59c2..eadca45 100644 --- a/internal/handler/profil.go +++ b/internal/handler/profil.go @@ -328,7 +328,12 @@ func (h *Handler) ProfilOtpremiAvatar(w http.ResponseWriter, r *http.Request) { } buf := make([]byte, 512) - n, _ := fajl.Read(buf) + n, err := fajl.Read(buf) + if err != nil && err != io.EOF { + middleware.SetFlash(w, r, h.DB, "greska", "Greška pri čitanju fajla.") + http.Redirect(w, r, "/profil/tema", http.StatusSeeOther) + return + } stvarniMime := http.DetectContentType(buf[:n]) if !strings.HasPrefix(stvarniMime, ocekivaniMime) { middleware.SetFlash(w, r, h.DB, "greska", "Sadržaj fajla ne odgovara odabranoj ekstenziji.") diff --git a/internal/model/stranica.go b/internal/model/stranica.go index 052f48d..3699fd3 100644 --- a/internal/model/stranica.go +++ b/internal/model/stranica.go @@ -38,7 +38,6 @@ type PodaciStranice struct { Podnazlov string LogoPutanja string // putanja do slike loga firme TopbarLogoSlika bool // prikaži logo sliku u topbaru - TopbarLogoTekst bool // prikaži naziv firme u topbaru AvatarPutanja string // putanja do lične avatar slike korisnika Korisnik string KorisnikIme string // korisničko ime prijavljenog korisnika diff --git a/web/templates/stranice/podesavanja_opste.html b/web/templates/stranice/podesavanja_opste.html index 74d3f8f..cc84e99 100644 --- a/web/templates/stranice/podesavanja_opste.html +++ b/web/templates/stranice/podesavanja_opste.html @@ -9,27 +9,27 @@
Podešavanja su uspešno sačuvana.
{{end}} - -
- -
-
- - Logo firme -
- {{if .LogoPutanja}} -
- Trenutni logo - - - - -
- {{end}} + +
+
+ + Logo firme +
+ {{if .LogoPutanja}} +
+ Trenutni logo +
+ + +
+
+ {{end}} +
+
PNG, JPG ili SVG — maksimum 2 MB
-
- + +