316 lines
8.9 KiB
Go
316 lines
8.9 KiB
Go
package handler
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"ntech/internal/db"
|
|
"ntech/internal/db/sqlite"
|
|
"ntech/internal/middleware"
|
|
"ntech/internal/model"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
)
|
|
|
|
|
|
// podaciPodsetnici su podaci za stranicu sa listom podsetnika
|
|
type podaciPodsetnici struct {
|
|
model.PodaciStranice
|
|
Podsetnici []model.Podsetnik
|
|
SamoAktivni bool
|
|
Sacuvano bool
|
|
Obrisan bool
|
|
}
|
|
|
|
// podaciPodsetnikForma su podaci za formu novog/izmenjenog podsetnika
|
|
type podaciPodsetnikForma struct {
|
|
model.PodaciStranice
|
|
Podsetnik model.Podsetnik
|
|
Greska string
|
|
Izmena bool
|
|
Korisnici []model.Korisnik
|
|
}
|
|
|
|
// Podsetnici renderuje listu podsetnika
|
|
func (h *Handler) Podsetnici(w http.ResponseWriter, r *http.Request) {
|
|
k := middleware.KorisnikIzKonteksta(r.Context())
|
|
|
|
podesavanja, err := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB)
|
|
if err != nil {
|
|
http.Error(w, "Greška pri učitavanju podešavanja", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
samoAktivni := r.URL.Query().Get("samo_aktivni") == "1"
|
|
|
|
// radnik vidi samo podsetnik koji su mu dodeljeni
|
|
filter := db.PodsetnikFilter{SamoAktivni: samoAktivni}
|
|
if k.Uloga == "radnik" {
|
|
filter.KorisnikID = &k.ID
|
|
}
|
|
|
|
lista, err := h.PodsetniciFRepo.Lista(r.Context(), filter)
|
|
if err != nil {
|
|
http.Error(w, "Greška pri učitavanju podsetnika", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
ps := h.popuniPodaciStranice(r, podesavanja)
|
|
ps.Stranica = "podsetnici"
|
|
ps.NaslovStranice = "Podsetnici"
|
|
|
|
podaci := podaciPodsetnici{
|
|
PodaciStranice: ps,
|
|
Podsetnici: lista,
|
|
SamoAktivni: samoAktivni,
|
|
Sacuvano: r.URL.Query().Get("sacuvano") == "1",
|
|
Obrisan: r.URL.Query().Get("obrisan") == "1",
|
|
}
|
|
|
|
h.renderujTemplate(w, "podsetnici", podaci)
|
|
}
|
|
|
|
// NoviPodsetnik prikazuje praznu formu za unos novog podsetnika
|
|
func (h *Handler) NoviPodsetnik(w http.ResponseWriter, r *http.Request) {
|
|
k := middleware.KorisnikIzKonteksta(r.Context())
|
|
|
|
podesavanja, err := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB)
|
|
if err != nil {
|
|
http.Error(w, "Greška pri učitavanju podešavanja", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
ps := h.popuniPodaciStranice(r, podesavanja)
|
|
ps.Stranica = "podsetnici"
|
|
ps.NaslovStranice = "Novi podsetnik"
|
|
|
|
var korisnici []model.Korisnik
|
|
if k.Uloga == "admin" || k.Uloga == "superadmin" {
|
|
korisnici, _ = h.KorisniciRepo.Lista(r.Context())
|
|
}
|
|
|
|
h.renderujFormuPodsetnika(w, podaciPodsetnikForma{
|
|
PodaciStranice: ps,
|
|
Izmena: false,
|
|
Korisnici: korisnici,
|
|
})
|
|
}
|
|
|
|
// SacuvajPodsetnik prima POST formu i upisuje novi podsetnik u bazu
|
|
func (h *Handler) SacuvajPodsetnik(w http.ResponseWriter, r *http.Request) {
|
|
k := middleware.KorisnikIzKonteksta(r.Context())
|
|
|
|
if err := r.ParseForm(); err != nil {
|
|
http.Error(w, "Greška pri čitanju forme", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
podsetnik, greska := parseFormuPodsetnika(r, k)
|
|
|
|
prikaziGresku := func(poruka string) {
|
|
podesavanja, _ := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB)
|
|
ps := h.popuniPodaciStranice(r, podesavanja)
|
|
ps.Stranica = "podsetnici"
|
|
ps.NaslovStranice = "Novi podsetnik"
|
|
var korisnici []model.Korisnik
|
|
if k.Uloga == "admin" || k.Uloga == "superadmin" {
|
|
korisnici, _ = h.KorisniciRepo.Lista(r.Context())
|
|
}
|
|
h.renderujFormuPodsetnika(w, podaciPodsetnikForma{
|
|
PodaciStranice: ps,
|
|
Podsetnik: podsetnik,
|
|
Greska: poruka,
|
|
Izmena: false,
|
|
Korisnici: korisnici,
|
|
})
|
|
}
|
|
|
|
if greska != "" {
|
|
prikaziGresku(greska)
|
|
return
|
|
}
|
|
|
|
if _, err := h.PodsetniciFRepo.Kreiraj(r.Context(), &podsetnik); err != nil {
|
|
log.Printf("greška pri čuvanju podsetnika: %v", err)
|
|
prikaziGresku("Došlo je do greške pri čuvanju. Pokušajte ponovo.")
|
|
return
|
|
}
|
|
|
|
http.Redirect(w, r, "/podsetnici?sacuvano=1", http.StatusSeeOther)
|
|
}
|
|
|
|
// IzmeniPodsetnik učitava podsetnik po ID-u i prikazuje popunjenu formu za izmenu
|
|
func (h *Handler) IzmeniPodsetnik(w http.ResponseWriter, r *http.Request) {
|
|
k := middleware.KorisnikIzKonteksta(r.Context())
|
|
|
|
id, err := parseID(chi.URLParam(r, "id"))
|
|
if err != nil {
|
|
http.Error(w, "Neispravan ID podsetnika", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
podsetnik, err := h.PodsetniciFRepo.DohvatiID(r.Context(), id)
|
|
if err != nil {
|
|
http.Error(w, "Podsetnik nije pronađen", http.StatusNotFound)
|
|
return
|
|
}
|
|
|
|
podesavanja, err := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB)
|
|
if err != nil {
|
|
http.Error(w, "Greška pri učitavanju podešavanja", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
ps := h.popuniPodaciStranice(r, podesavanja)
|
|
ps.Stranica = "podsetnici"
|
|
ps.NaslovStranice = "Izmeni podsetnik"
|
|
|
|
var korisnici []model.Korisnik
|
|
if k.Uloga == "admin" || k.Uloga == "superadmin" {
|
|
korisnici, _ = h.KorisniciRepo.Lista(r.Context())
|
|
}
|
|
|
|
h.renderujFormuPodsetnika(w, podaciPodsetnikForma{
|
|
PodaciStranice: ps,
|
|
Podsetnik: *podsetnik,
|
|
Izmena: true,
|
|
Korisnici: korisnici,
|
|
})
|
|
}
|
|
|
|
// SacuvajIzmenePodsetnika prima POST formu i ažurira postojeći podsetnik u bazi
|
|
func (h *Handler) SacuvajIzmenePodsetnika(w http.ResponseWriter, r *http.Request) {
|
|
k := middleware.KorisnikIzKonteksta(r.Context())
|
|
|
|
id, err := parseID(chi.URLParam(r, "id"))
|
|
if err != nil {
|
|
http.Error(w, "Neispravan ID podsetnika", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
if err := r.ParseForm(); err != nil {
|
|
http.Error(w, "Greška pri čitanju forme", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
podsetnik, greska := parseFormuPodsetnika(r, k)
|
|
podsetnik.ID = id
|
|
|
|
prikaziGresku := func(poruka string) {
|
|
podesavanja, _ := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB)
|
|
ps := h.popuniPodaciStranice(r, podesavanja)
|
|
ps.Stranica = "podsetnici"
|
|
ps.NaslovStranice = "Izmeni podsetnik"
|
|
var korisnici []model.Korisnik
|
|
if k.Uloga == "admin" || k.Uloga == "superadmin" {
|
|
korisnici, _ = h.KorisniciRepo.Lista(r.Context())
|
|
}
|
|
h.renderujFormuPodsetnika(w, podaciPodsetnikForma{
|
|
PodaciStranice: ps,
|
|
Podsetnik: podsetnik,
|
|
Greska: poruka,
|
|
Izmena: true,
|
|
Korisnici: korisnici,
|
|
})
|
|
}
|
|
|
|
if greska != "" {
|
|
prikaziGresku(greska)
|
|
return
|
|
}
|
|
|
|
if err := h.PodsetniciFRepo.Izmeni(r.Context(), &podsetnik); err != nil {
|
|
log.Printf("greška pri čuvanju izmene podsetnika: %v", err)
|
|
prikaziGresku("Došlo je do greške pri čuvanju. Pokušajte ponovo.")
|
|
return
|
|
}
|
|
|
|
http.Redirect(w, r, "/podsetnici?sacuvano=1", http.StatusSeeOther)
|
|
}
|
|
|
|
// OznaciPodsetnik prima POST zahtev i menja status završenosti podsetnika
|
|
func (h *Handler) OznaciPodsetnik(w http.ResponseWriter, r *http.Request) {
|
|
id, err := parseID(chi.URLParam(r, "id"))
|
|
if err != nil {
|
|
http.Error(w, "Neispravan ID podsetnika", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
// učitamo trenutni status pa ga preokrenemo
|
|
podsetnik, err := h.PodsetniciFRepo.DohvatiID(r.Context(), id)
|
|
if err != nil {
|
|
http.Error(w, "Podsetnik nije pronađen", http.StatusNotFound)
|
|
return
|
|
}
|
|
|
|
if err := h.PodsetniciFRepo.OznaciZavrsenim(r.Context(), id, !podsetnik.Zavrseno); err != nil {
|
|
http.Error(w, "Greška pri ažuriranju statusa", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
http.Redirect(w, r, "/podsetnici", http.StatusSeeOther)
|
|
}
|
|
|
|
// ObrisiPodsetnik prima POST zahtev i briše podsetnik po ID-u
|
|
func (h *Handler) ObrisiPodsetnik(w http.ResponseWriter, r *http.Request) {
|
|
id, err := parseID(chi.URLParam(r, "id"))
|
|
if err != nil {
|
|
http.Error(w, "Neispravan ID podsetnika", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
if err := h.PodsetniciFRepo.Obrisi(r.Context(), id); err != nil {
|
|
http.Error(w, "Greška pri brisanju podsetnika", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
http.Redirect(w, r, "/podsetnici?obrisan=1", http.StatusSeeOther)
|
|
}
|
|
|
|
// parseFormuPodsetnika čita polja iz HTTP forme, validira ih i vraća model i eventualnu grešku
|
|
func parseFormuPodsetnika(r *http.Request, k *model.Korisnik) (model.Podsetnik, string) {
|
|
naslov := strings.TrimSpace(r.FormValue("naslov"))
|
|
if naslov == "" {
|
|
return model.Podsetnik{}, "Naslov je obavezan."
|
|
}
|
|
|
|
datumStr := strings.TrimSpace(r.FormValue("datum_podsecanja"))
|
|
if datumStr == "" {
|
|
return model.Podsetnik{Naslov: naslov}, "Datum podsećanja je obavezan."
|
|
}
|
|
|
|
datum, err := time.Parse("2006-01-02", datumStr)
|
|
if err != nil {
|
|
return model.Podsetnik{Naslov: naslov}, "Datum podsećanja nije u ispravnom formatu."
|
|
}
|
|
|
|
p := model.Podsetnik{
|
|
Naslov: naslov,
|
|
Napomena: strings.TrimSpace(r.FormValue("napomena")),
|
|
DatumPodsecanja: datum,
|
|
Tip: model.TipOpsti,
|
|
}
|
|
|
|
// admin/superadmin mogu dodeliti podsetnik drugom korisniku
|
|
if k.Uloga == "admin" || k.Uloga == "superadmin" {
|
|
if kidStr := strings.TrimSpace(r.FormValue("korisnik_id")); kidStr != "" {
|
|
if kid, err := strconv.ParseInt(kidStr, 10, 64); err == nil && kid > 0 {
|
|
p.KorisnikID = &kid
|
|
}
|
|
}
|
|
} else {
|
|
// radnik dobija podsetnik dodeljen sebi
|
|
p.KorisnikID = &k.ID
|
|
}
|
|
|
|
return p, ""
|
|
}
|
|
|
|
// renderujFormuPodsetnika renderuje HTML šablon forme za unos ili izmenu podsetnika
|
|
func (h *Handler) renderujFormuPodsetnika(w http.ResponseWriter, podaci podaciPodsetnikForma) {
|
|
h.renderujTemplate(w, "podsetnik_forma", podaci)
|
|
}
|