wireplanner/internal/handlers/overview.go

145 lines
3.4 KiB
Go

package handlers
import (
"net/http"
"strconv"
"strings"
"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 {
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, "/")
}
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)
}
}
func renderDeviceCreateError(h *Handlers, w http.ResponseWriter, errMsg string) {
renderOverviewError(h, w, errMsg)
}