mirror of
https://github.com/josmo/drone-rancher.git
synced 2026-06-16 14:50:35 +08:00
110 lines
2.7 KiB
Go
110 lines
2.7 KiB
Go
package api
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
"github.com/gorilla/context"
|
|
"github.com/gorilla/mux"
|
|
"github.com/rancher/go-rancher/client"
|
|
)
|
|
|
|
func ApiHandler(schemas *client.Schemas, f http.Handler) http.Handler {
|
|
return context.ClearHandler(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
if err := CreateApiContext(rw, r, schemas); err != nil {
|
|
logrus.WithField("err", err).Errorf("Failed to create API context")
|
|
rw.WriteHeader(500)
|
|
return
|
|
}
|
|
|
|
f.ServeHTTP(rw, r)
|
|
}))
|
|
}
|
|
|
|
func VersionsHandler(schemas *client.Schemas, versions ...string) http.Handler {
|
|
return ApiHandler(schemas, http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
apiContext := GetApiContext(r)
|
|
|
|
collection := client.GenericCollection{
|
|
Collection: client.Collection{
|
|
Links: map[string]string{},
|
|
},
|
|
Data: []interface{}{},
|
|
}
|
|
|
|
for i, version := range versions {
|
|
collection.Data = append(collection.Data, client.Resource{
|
|
Id: version,
|
|
Links: map[string]string{
|
|
SELF: apiContext.UrlBuilder.Version(version),
|
|
},
|
|
Type: "apiVersion",
|
|
})
|
|
|
|
if i == len(versions)-1 {
|
|
collection.Links[LATEST] = apiContext.UrlBuilder.Version(version)
|
|
}
|
|
}
|
|
|
|
apiContext.Write(&collection)
|
|
}))
|
|
}
|
|
|
|
func contains(list []string, item string) bool {
|
|
for _, i := range list {
|
|
if i == item {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func VersionHandler(schemas *client.Schemas, version string) http.Handler {
|
|
return ApiHandler(schemas, http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
apiContext := GetApiContext(r)
|
|
|
|
versionResource := client.Resource{
|
|
Id: version,
|
|
Type: "apiVersion",
|
|
Links: map[string]string{},
|
|
}
|
|
|
|
for _, schema := range schemas.Data {
|
|
if contains(schema.CollectionMethods, "GET") {
|
|
versionResource.Links[schema.PluralName] = apiContext.UrlBuilder.Collection(schema.Id)
|
|
}
|
|
}
|
|
|
|
apiContext.Write(&versionResource)
|
|
}))
|
|
}
|
|
|
|
func SchemasHandler(schemas *client.Schemas) http.Handler {
|
|
return ApiHandler(schemas, http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
apiContext := GetApiContext(r)
|
|
schemasCopy := *schemas
|
|
for i := range schemasCopy.Data {
|
|
populateSchema(apiContext, &schemasCopy.Data[i])
|
|
}
|
|
apiContext.Write(&schemasCopy)
|
|
}))
|
|
}
|
|
|
|
func populateSchema(apiContext *ApiContext, schema *client.Schema) {
|
|
if contains(schema.CollectionMethods, "GET") {
|
|
schema.Links["collection"] = apiContext.UrlBuilder.Collection(schema.Id)
|
|
}
|
|
}
|
|
|
|
func SchemaHandler(schemas *client.Schemas) http.Handler {
|
|
return ApiHandler(schemas, http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
|
apiContext := GetApiContext(r)
|
|
|
|
schema := schemas.Schema(mux.Vars(r)["id"])
|
|
|
|
populateSchema(apiContext, &schema)
|
|
|
|
apiContext.Write(&schema)
|
|
}))
|
|
}
|