package server import ( "encoding/json" "errors" "net/http" "mgit.msbls.de/m/cablegui/internal/db" ) type portCreate struct { TypeID int64 `json:"type_id"` Label string `json:"label,omitempty"` XOffset float64 `json:"x_offset"` YOffset float64 `json:"y_offset"` } type portPatch struct { TypeID *int64 `json:"type_id,omitempty"` Label *string `json:"label,omitempty"` XOffset *float64 `json:"x_offset,omitempty"` YOffset *float64 `json:"y_offset,omitempty"` } func (h *handlers) listPortsForDevice(w http.ResponseWriter, r *http.Request) { pid, ok := parseInt64Path(r, "pid") if !ok { writeError(w, db.ErrInvalidInput, "pid must be a positive integer") return } id, ok := parseInt64Path(r, "id") if !ok { writeError(w, db.ErrInvalidInput, "id must be a positive integer") return } ps, err := h.store.ListPortsForDevice(pid, id) if err != nil { writeError(w, err, nil) return } writeJSON(w, http.StatusOK, ps) } func (h *handlers) createPort(w http.ResponseWriter, r *http.Request) { pid, ok := parseInt64Path(r, "pid") if !ok { writeError(w, db.ErrInvalidInput, "pid must be a positive integer") return } id, ok := parseInt64Path(r, "id") if !ok { writeError(w, db.ErrInvalidInput, "id must be a positive integer") return } var body portCreate if err := json.NewDecoder(r.Body).Decode(&body); err != nil { writeError(w, errors.Join(db.ErrInvalidInput, err), nil) return } p, err := h.store.CreatePort(pid, id, db.PortCreate{ TypeID: body.TypeID, Label: body.Label, XOffset: body.XOffset, YOffset: body.YOffset, }) if err != nil { writeError(w, err, nil) return } writeJSON(w, http.StatusCreated, p) } func (h *handlers) patchPort(w http.ResponseWriter, r *http.Request) { pid, ok := parseInt64Path(r, "pid") if !ok { writeError(w, db.ErrInvalidInput, "pid must be a positive integer") return } id, ok := parseInt64Path(r, "id") if !ok { writeError(w, db.ErrInvalidInput, "id must be a positive integer") return } var body portPatch if err := json.NewDecoder(r.Body).Decode(&body); err != nil { writeError(w, errors.Join(db.ErrInvalidInput, err), nil) return } p, err := h.store.UpdatePort(pid, id, db.PortUpdate{ TypeID: body.TypeID, Label: body.Label, XOffset: body.XOffset, YOffset: body.YOffset, }) if err != nil { writeError(w, err, nil) return } writeJSON(w, http.StatusOK, p) } func (h *handlers) deletePort(w http.ResponseWriter, r *http.Request) { pid, ok := parseInt64Path(r, "pid") if !ok { writeError(w, db.ErrInvalidInput, "pid must be a positive integer") return } id, ok := parseInt64Path(r, "id") if !ok { writeError(w, db.ErrInvalidInput, "id must be a positive integer") return } if err := h.store.DeletePort(pid, id); err != nil { writeError(w, err, nil) return } w.WriteHeader(http.StatusNoContent) }