Files

63 lines
1.4 KiB
Go

package middleware
import (
"database/sql"
"encoding/json"
"net/http"
"ntech/internal/model"
)
// SetFlash čuva flash poruku u koloni flash aktivne sesije
func SetFlash(w http.ResponseWriter, r *http.Request, db *sql.DB, tip, poruka string) {
kolacic, err := r.Cookie("ntech_sesija")
if err != nil {
return
}
data, err := json.Marshal(model.FlashPoruka{Tip: tip, Poruka: poruka})
if err != nil {
return
}
db.ExecContext(r.Context(),
`UPDATE sesije SET flash = ? WHERE token = ?`,
string(data), kolacic.Value)
}
// GetFlash čita i atomično briše flash poruku iz aktivne sesije
func GetFlash(r *http.Request, db *sql.DB) *model.FlashPoruka {
kolacic, err := r.Cookie("ntech_sesija")
if err != nil {
return nil
}
tx, err := db.BeginTx(r.Context(), nil)
if err != nil {
return nil
}
defer tx.Rollback()
var flashJSON sql.NullString
if err := tx.QueryRowContext(r.Context(),
`SELECT flash FROM sesije WHERE token = ?`, kolacic.Value).Scan(&flashJSON); err != nil {
return nil
}
if !flashJSON.Valid || flashJSON.String == "" {
return nil
}
if _, err := tx.ExecContext(r.Context(),
`UPDATE sesije SET flash = NULL WHERE token = ?`, kolacic.Value); err != nil {
return nil
}
if err := tx.Commit(); err != nil {
return nil
}
var f model.FlashPoruka
if err := json.Unmarshal([]byte(flashJSON.String), &f); err != nil {
return nil
}
return &f
}