package admin import ( "encoding/json" "net/http" "slices" "forge.cadoles.com/cadoles/bouncer/internal/setup" "forge.cadoles.com/cadoles/bouncer/internal/store" "github.com/pkg/errors" "gitlab.com/wpetit/goweb/api" ) type QueryLayerDefinitionResponse struct { Definitions []store.LayerDefinition `json:"definitions"` } func (s *Server) queryLayerDefinition(w http.ResponseWriter, r *http.Request) { typesFilter, ok := getStringableSliceValues(w, r, "types", nil, transformLayerType) if !ok { return } existingTypes := setup.GetLayerTypes() slices.Sort(existingTypes) definitions := make([]store.LayerDefinition, 0, len(existingTypes)) for _, layerType := range existingTypes { if len(typesFilter) != 0 && !slices.Contains(typesFilter, layerType) { continue } schema, err := setup.GetLayerOptionsRawSchema(layerType) if err != nil { logAndCaptureError(r.Context(), "could not retrieve layer options schema", errors.WithStack(err)) api.ErrorResponse(w, http.StatusInternalServerError, api.ErrCodeUnknownError, nil) return } definitions = append(definitions, store.LayerDefinition{ Type: layerType, Options: json.RawMessage(schema), }) } api.DataResponse(w, http.StatusOK, QueryLayerDefinitionResponse{ Definitions: definitions, }) } func transformLayerType(v string) (store.LayerType, error) { return store.LayerType(v), nil }