Friendly duplicate-name errors on create/edit

UNIQUE constraint violations from rack/device/model creation and editing
now show readable messages like 'A rack named X already exists, onii-chan'
instead of raw SQLite error strings or silent redirects.
master
Joca 2026-06-09 20:11:52 -03:00
parent 56c525cb26
commit 75255d5551
Signed by: jocadbz
GPG Key ID: B1836DCE2F50BDF7
4 changed files with 31 additions and 5 deletions

View File

@ -3,6 +3,7 @@ package handlers
import (
"net/http"
"strconv"
"strings"
"lostcavewireplanner/internal/models"
)
@ -84,7 +85,11 @@ func (h *Handlers) DeviceCreate(w http.ResponseWriter, r *http.Request) {
id, err := h.Store.DeviceCreate(device)
if err != nil {
h.redirect(w, r, "/")
msg := err.Error()
if strings.Contains(strings.ToLower(msg), "unique") {
msg = "A device named '" + name + "' already exists, onii-chan."
}
renderDeviceCreateError(h, w, msg)
return
}

View File

@ -84,7 +84,11 @@ func (h *Handlers) ModelCreate(w http.ResponseWriter, r *http.Request) {
_, err := h.Store.ModelCreate(m, "uploads")
if err != nil {
h.render(w, "model_form.html", ModelFormData{Model: m, IsEdit: false, Error: err.Error()})
msg := err.Error()
if strings.Contains(strings.ToLower(msg), "unique") {
msg = "A model named '" + m.Name + "' already exists, onii-chan."
}
h.render(w, "model_form.html", ModelFormData{Model: m, IsEdit: false, Error: msg})
return
}
@ -138,7 +142,11 @@ func (h *Handlers) ModelUpdate(w http.ResponseWriter, r *http.Request) {
}
if err := h.Store.ModelUpdate(m); err != nil {
h.render(w, "model_form.html", ModelFormData{Model: m, IsEdit: true, Error: err.Error()})
msg := err.Error()
if strings.Contains(strings.ToLower(msg), "unique") {
msg = "A model named '" + m.Name + "' already exists, onii-chan."
}
h.render(w, "model_form.html", ModelFormData{Model: m, IsEdit: true, Error: msg})
return
}

View File

@ -3,6 +3,7 @@ package handlers
import (
"net/http"
"strconv"
"strings"
"lostcavewireplanner/internal/models"
)
@ -86,7 +87,11 @@ func (h *Handlers) RackCreate(w http.ResponseWriter, r *http.Request) {
}
_, err := h.Store.RackCreate(rack)
if err != nil {
h.renderError(w, "overview.html", err.Error())
msg := err.Error()
if strings.Contains(strings.ToLower(msg), "unique") {
msg = "A rack with this name already exists, onii-chan."
}
h.renderError(w, "overview.html", msg)
return
}
h.redirect(w, r, "/")
@ -133,3 +138,7 @@ func (h *Handlers) renderError(w http.ResponseWriter, page string, errMsg string
http.Error(w, errMsg, http.StatusBadRequest)
}
}
func renderDeviceCreateError(h *Handlers, w http.ResponseWriter, errMsg string) {
renderOverviewError(h, w, errMsg)
}

View File

@ -146,7 +146,11 @@ func (h *Handlers) RackEdit(w http.ResponseWriter, r *http.Request) {
rack.Comment = r.FormValue("comment")
if err := h.Store.RackUpdate(rack); err != nil {
h.renderRackError(w, *rack, "Failed to update: "+err.Error())
msg := err.Error()
if strings.Contains(strings.ToLower(msg), "unique") {
msg = "A rack named '" + rack.Name + "' already exists, onii-chan."
}
h.renderRackError(w, *rack, msg)
return
}
h.redirect(w, r, "/racks/"+idStr)