package handlers import ( "net/http" "strconv" "lostcavewireplanner/internal/models" ) type RackCard struct { Rack models.Rack DeviceCount int } type OverviewData struct { Racks []RackCard Devices []models.Device Connections []models.Connection AllModels []models.DeviceModel Error string } func (h *Handlers) Overview(w http.ResponseWriter, r *http.Request) { racks, _ := h.Store.RackGetAll() devices, _ := h.Store.DeviceGetAllUnracked() connections, _ := h.Store.ConnectionGetAll() allModels, _ := h.Store.ModelGetAll() if racks == nil { racks = []models.Rack{} } if devices == nil { devices = []models.Device{} } if connections == nil { connections = []models.Connection{} } if allModels == nil { allModels = []models.DeviceModel{} } var rackCards []RackCard for _, r := range racks { racked, _ := h.Store.DeviceGetByRackID(r.ID) unracked, _ := h.Store.DeviceGetUnrackedByRackID(r.ID) count := 0 if racked != nil { count += len(racked) } if unracked != nil { count += len(unracked) } rackCards = append(rackCards, RackCard{Rack: r, DeviceCount: count}) } h.render(w, "overview.html", OverviewData{ Racks: rackCards, Devices: devices, Connections: connections, AllModels: allModels, }) } func (h *Handlers) RackCreate(w http.ResponseWriter, r *http.Request) { r.ParseForm() name := r.FormValue("name") rackType := r.FormValue("rack_type") depth := r.FormValue("depth") heightUnits := 42 if huStr := r.FormValue("height_units"); huStr != "" { if n, err := strconv.Atoi(huStr); err == nil && n > 0 { heightUnits = n } } if name == "" { h.renderError(w, "overview.html", "Name is required") return } rack := &models.Rack{ Name: name, RackType: rackType, Depth: depth, HeightUnits: heightUnits, } _, err := h.Store.RackCreate(rack) if err != nil { h.renderError(w, "overview.html", err.Error()) return } h.redirect(w, r, "/") } func renderOverviewError(h *Handlers, w http.ResponseWriter, errMsg string) { racks, _ := h.Store.RackGetAll() devices, _ := h.Store.DeviceGetAllUnracked() connections, _ := h.Store.ConnectionGetAll() allModels, _ := h.Store.ModelGetAll() if racks == nil { racks = []models.Rack{} } if devices == nil { devices = []models.Device{} } if connections == nil { connections = []models.Connection{} } if allModels == nil { allModels = []models.DeviceModel{} } var rackCards []RackCard for _, r := range racks { racked, _ := h.Store.DeviceGetByRackID(r.ID) unracked, _ := h.Store.DeviceGetUnrackedByRackID(r.ID) count := 0 if racked != nil { count += len(racked) } if unracked != nil { count += len(unracked) } rackCards = append(rackCards, RackCard{Rack: r, DeviceCount: count}) } h.render(w, "overview.html", OverviewData{Racks: rackCards, Devices: devices, Connections: connections, AllModels: allModels, Error: errMsg}) } func (h *Handlers) renderError(w http.ResponseWriter, page string, errMsg string) { switch page { case "overview.html": renderOverviewError(h, w, errMsg) default: http.Error(w, errMsg, http.StatusBadRequest) } }