225 lines
4.9 KiB
Go
225 lines
4.9 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"lostcavewireplanner/internal/models"
|
|
"lostcavewireplanner/internal/services"
|
|
)
|
|
|
|
func (h *Handlers) ConnectionModal(w http.ResponseWriter, r *http.Request) {
|
|
portIDStr := r.PathValue("portId")
|
|
h.renderConnectionModal(w, portIDStr)
|
|
}
|
|
|
|
type FlatPort struct {
|
|
ID int64
|
|
Name string
|
|
Side string
|
|
DeviceID int64
|
|
DeviceName string
|
|
DeviceModel string
|
|
}
|
|
|
|
func (h *Handlers) mustGetAllRacks() []models.Rack {
|
|
racks, _ := h.Store.RackGetAll()
|
|
if racks == nil {
|
|
return []models.Rack{}
|
|
}
|
|
return racks
|
|
}
|
|
|
|
func (h *Handlers) ConnectionDelete(w http.ResponseWriter, r *http.Request) {
|
|
idStr := r.PathValue("id")
|
|
id, _ := strconv.ParseInt(idStr, 10, 64)
|
|
returnPortID := r.URL.Query().Get("return_port_id")
|
|
|
|
h.Store.ConnectionDelete(id)
|
|
|
|
if returnPortID != "" {
|
|
h.renderConnectionModal(w, returnPortID)
|
|
return
|
|
}
|
|
h.redirect(w, r, "/")
|
|
}
|
|
|
|
func (h *Handlers) ConnectionEdit(w http.ResponseWriter, r *http.Request) {
|
|
idStr := r.PathValue("id")
|
|
id, _ := strconv.ParseInt(idStr, 10, 64)
|
|
r.ParseForm()
|
|
|
|
_, err := h.Store.ConnectionGetByID(id)
|
|
if err != nil {
|
|
http.Error(w, "connection not found", http.StatusNotFound)
|
|
return
|
|
}
|
|
|
|
connTypeID, _ := strconv.ParseInt(r.FormValue("connection_type_id"), 10, 64)
|
|
label1 := r.FormValue("label_1")
|
|
label2 := r.FormValue("label_2")
|
|
color := r.FormValue("color")
|
|
returnPortID := r.FormValue("return_port_id")
|
|
|
|
if color == "" {
|
|
color = "#808080"
|
|
}
|
|
|
|
var label1Ptr, label2Ptr *string
|
|
if label1 != "" {
|
|
label1Ptr = &label1
|
|
}
|
|
if label2 != "" {
|
|
label2Ptr = &label2
|
|
}
|
|
|
|
_, err = h.Store.ConnectionGetByID(id)
|
|
if err == nil {
|
|
_ = h.Store.ConnectionUpdate(&models.Connection{
|
|
ID: id,
|
|
ConnectionTypeID: connTypeID,
|
|
Label1: label1Ptr,
|
|
Label2: label2Ptr,
|
|
Color: color,
|
|
})
|
|
}
|
|
|
|
if returnPortID != "" {
|
|
h.renderConnectionModal(w, returnPortID)
|
|
return
|
|
}
|
|
h.redirect(w, r, "/")
|
|
}
|
|
|
|
func (h *Handlers) ConnectionCreate(w http.ResponseWriter, r *http.Request) {
|
|
r.ParseForm()
|
|
|
|
connTypeID, _ := strconv.ParseInt(r.FormValue("connection_type_id"), 10, 64)
|
|
portID1Str := r.FormValue("port_id_1")
|
|
portID2Str := r.FormValue("port_id_2")
|
|
label1 := r.FormValue("label_1")
|
|
label2 := r.FormValue("label_2")
|
|
color := r.FormValue("color")
|
|
returnPortID := r.FormValue("return_port_id")
|
|
|
|
if color == "" {
|
|
color = "#808080"
|
|
}
|
|
|
|
var p1, p2 *int64
|
|
if portID1Str != "" {
|
|
v, _ := strconv.ParseInt(portID1Str, 10, 64)
|
|
p1 = &v
|
|
}
|
|
if portID2Str != "" {
|
|
v, _ := strconv.ParseInt(portID2Str, 10, 64)
|
|
p2 = &v
|
|
}
|
|
|
|
var label1Ptr, label2Ptr *string
|
|
if label1 != "" {
|
|
label1Ptr = &label1
|
|
}
|
|
if label2 != "" {
|
|
label2Ptr = &label2
|
|
}
|
|
|
|
conn := &models.Connection{
|
|
ConnectionTypeID: connTypeID,
|
|
Label1: label1Ptr,
|
|
Label2: label2Ptr,
|
|
Color: color,
|
|
PortID1: p1,
|
|
PortID2: p2,
|
|
}
|
|
|
|
if err := h.Store.ConnectionCreate(conn); err != nil {
|
|
if returnPortID != "" {
|
|
h.renderConnectionModal(w, returnPortID)
|
|
return
|
|
}
|
|
h.redirect(w, r, "/")
|
|
return
|
|
}
|
|
|
|
if returnPortID != "" {
|
|
h.renderConnectionModal(w, returnPortID)
|
|
return
|
|
}
|
|
h.redirect(w, r, "/")
|
|
}
|
|
|
|
func (h *Handlers) renderConnectionModal(w http.ResponseWriter, returnPortID string) {
|
|
portID, err := strconv.ParseInt(returnPortID, 10, 64)
|
|
if err != nil {
|
|
http.Error(w, "invalid port id", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
trace, err := services.TraceConnection(h.Store, portID)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
connTypes, _ := h.Store.ConnectionTypeGetAll()
|
|
if connTypes == nil {
|
|
connTypes = []models.ConnectionType{}
|
|
}
|
|
|
|
type ConnectionModalData struct {
|
|
Trace *services.TraceResult
|
|
ConnectionTypes []models.ConnectionType
|
|
AllPorts []FlatPort
|
|
}
|
|
|
|
allDevices, _ := h.Store.DeviceGetAllUnracked()
|
|
visitedMap := map[int64]bool{}
|
|
|
|
var flatPorts []FlatPort
|
|
addPorts := func(devices []models.Device) {
|
|
for _, d := range devices {
|
|
if visitedMap[d.ID] {
|
|
continue
|
|
}
|
|
visitedMap[d.ID] = true
|
|
for _, p := range d.Ports {
|
|
flatPorts = append(flatPorts, FlatPort{
|
|
ID: p.ID,
|
|
Name: p.Name,
|
|
Side: p.Side,
|
|
DeviceID: d.ID,
|
|
DeviceName: d.Name,
|
|
})
|
|
if d.Model != nil {
|
|
flatPorts[len(flatPorts)-1].DeviceModel = d.Model.Name
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
addPorts(allDevices)
|
|
for _, rack := range h.mustGetAllRacks() {
|
|
if devs, err := h.Store.DeviceGetByRackID(rack.ID); err == nil {
|
|
addPorts(devs)
|
|
}
|
|
if devs, err := h.Store.DeviceGetUnrackedByRackID(rack.ID); err == nil {
|
|
addPorts(devs)
|
|
}
|
|
}
|
|
|
|
h.render(w, "connection_modal.html", ConnectionModalData{
|
|
Trace: trace,
|
|
ConnectionTypes: connTypes,
|
|
AllPorts: flatPorts,
|
|
})
|
|
}
|
|
|
|
func (h *Handlers) ConnectionGetByID(id int64) (*models.Connection, error) {
|
|
conn, err := h.Store.ConnectionGetByID(id)
|
|
return conn, err
|
|
}
|
|
|
|
func lower(s string) string { return strings.ToLower(s) }
|