1
0
mirror of https://github.com/rancher/steve.git synced 2025-04-27 02:51:10 +00:00
steve/pkg/schemaserver/builtin/schema.go
Darren Shepherd 8b42d0aff8 Refactor
2020-01-30 22:37:59 -07:00

89 lines
2.4 KiB
Go

package builtin
import (
"net/http"
"github.com/rancher/steve/pkg/schemaserver/store/schema"
"github.com/rancher/steve/pkg/schemaserver/types"
"github.com/rancher/wrangler/pkg/schemas"
"github.com/rancher/wrangler/pkg/slice"
)
var (
Schema = types.APISchema{
Schema: &schemas.Schema{
ID: "schema",
PluralName: "schemas",
CollectionMethods: []string{"GET"},
ResourceMethods: []string{"GET"},
ResourceFields: map[string]schemas.Field{
"collectionActions": {Type: "map[json]"},
"collectionFields": {Type: "map[json]"},
"collectionFilters": {Type: "map[json]"},
"collectionMethods": {Type: "array[string]"},
"pluralName": {Type: "string"},
"resourceActions": {Type: "map[json]"},
"attributes": {Type: "map[json]"},
"resourceFields": {Type: "map[json]"},
"resourceMethods": {Type: "array[string]"},
"version": {Type: "map[json]"},
},
},
Formatter: SchemaFormatter,
Store: schema.NewSchemaStore(),
}
Error = types.APISchema{
Schema: &schemas.Schema{
ID: "error",
ResourceMethods: []string{},
CollectionMethods: []string{},
ResourceFields: map[string]schemas.Field{
"code": {Type: "string"},
"detail": {Type: "string", Nullable: true},
"message": {Type: "string", Nullable: true},
"fieldName": {Type: "string", Nullable: true},
"status": {Type: "int"},
},
},
}
Collection = types.APISchema{
Schema: &schemas.Schema{
ID: "collection",
ResourceMethods: []string{},
CollectionMethods: []string{},
ResourceFields: map[string]schemas.Field{
"data": {Type: "array[json]"},
"pagination": {Type: "map[json]"},
"sort": {Type: "map[json]"},
"filters": {Type: "map[json]"},
},
},
}
Schemas = types.EmptyAPISchemas().
MustAddSchema(Schema).
MustAddSchema(Error).
MustAddSchema(Collection)
)
func SchemaFormatter(apiOp *types.APIRequest, resource *types.RawResource) {
schema := apiOp.Schemas.LookupSchema(resource.ID)
if schema == nil {
return
}
collectionLink := getSchemaCollectionLink(apiOp, schema)
if collectionLink != "" {
resource.Links["collection"] = collectionLink
}
}
func getSchemaCollectionLink(apiOp *types.APIRequest, schema *types.APISchema) string {
if schema != nil && slice.ContainsString(schema.CollectionMethods, http.MethodGet) {
return apiOp.URLBuilder.Collection(schema)
}
return ""
}