package api import ( "encoding/json" "io" "net/http" "strconv" "strings" ) func parseID(path, prefix string) (int64, bool) { if !strings.HasPrefix(path, prefix) { return 0, false } trimmed := strings.TrimPrefix(path, prefix) if trimmed == "" || strings.Contains(trimmed, "/") { return 0, false } id, err := strconv.ParseInt(trimmed, 10, 64) if err != nil || id <= 0 { return 0, false } return id, true } func parseSubresourceID(path, prefix, suffix string) (int64, bool) { if !strings.HasPrefix(path, prefix) || !strings.HasSuffix(path, suffix) { return 0, false } trimmed := strings.TrimPrefix(path, prefix) trimmed = strings.TrimSuffix(trimmed, suffix) if trimmed == "" || strings.Contains(trimmed, "/") { return 0, false } id, err := strconv.ParseInt(trimmed, 10, 64) if err != nil || id <= 0 { return 0, false } return id, true } func decodeJSON(r *http.Request, dest any) error { decoder := json.NewDecoder(r.Body) decoder.DisallowUnknownFields() if err := decoder.Decode(dest); err != nil { return err } if err := decoder.Decode(&struct{}{}); err != io.EOF { return err } return nil } func writeJSON(w http.ResponseWriter, status int, payload any) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) _ = json.NewEncoder(w).Encode(payload) } func writeError(w http.ResponseWriter, status int, message string) { writeJSON(w, status, map[string]string{"error": message}) }