Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package concepts | |
import ( | |
"context" | |
"net/http" | |
"github.com/weaviate/weaviate/entities/models" | |
) | |
type RESTHandlers struct { | |
inspector Inspector | |
} | |
func NewRESTHandlers(inspector Inspector) *RESTHandlers { | |
return &RESTHandlers{ | |
inspector: inspector, | |
} | |
} | |
func (h *RESTHandlers) Handler() http.Handler { | |
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | |
switch r.Method { | |
case http.MethodGet: | |
h.get(w, r) | |
default: | |
w.WriteHeader(http.StatusMethodNotAllowed) | |
} | |
}) | |
} | |
func (h *RESTHandlers) get(w http.ResponseWriter, r *http.Request) { | |
if len(r.URL.String()) == 0 || h.extractConcept(r) == "" { | |
w.WriteHeader(http.StatusNotFound) | |
return | |
} | |
h.getOne(w, r) | |
} | |
func (h *RESTHandlers) getOne(w http.ResponseWriter, r *http.Request) { | |
concept := h.extractConcept(r) | |
res, err := h.inspector.GetWords(r.Context(), concept) | |
if err != nil { | |
h.writeError(w, err, http.StatusBadRequest) | |
return | |
} | |
json, err := res.MarshalBinary() | |
if err != nil { | |
h.writeError(w, err, http.StatusInternalServerError) | |
return | |
} | |
w.Header().Add("content-type", "application/json") | |
w.WriteHeader(http.StatusOK) | |
w.Write(json) | |
} | |
func (h *RESTHandlers) writeError(w http.ResponseWriter, err error, code int) { | |
res := &models.ErrorResponse{Error: []*models.ErrorResponseErrorItems0{{ | |
Message: err.Error(), | |
}}} | |
json, mErr := res.MarshalBinary() | |
if mErr != nil { | |
// fallback to text | |
w.Header().Add("content-type", "text/plain") | |
w.WriteHeader(code) | |
w.Write([]byte(err.Error())) | |
} | |
w.Header().Add("content-type", "application/json") | |
w.WriteHeader(code) | |
w.Write(json) | |
} | |
func (h *RESTHandlers) extractConcept(r *http.Request) string { | |
// cutoff leading slash, consider the rest the concept | |
return r.URL.String()[1:] | |
} | |
type Inspector interface { | |
GetWords(ctx context.Context, words string) (*models.C11yWordsResponse, error) | |
} | |