/
externalapi.go
47 lines (35 loc) · 1.77 KB
/
externalapi.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package externalapi
import (
"net/http"
"github.com/gorilla/mux"
)
type MetadataHandler interface {
CreateService(w http.ResponseWriter, r *http.Request)
GetService(w http.ResponseWriter, r *http.Request)
GetServices(w http.ResponseWriter, r *http.Request)
UpdateService(w http.ResponseWriter, r *http.Request)
DeleteService(w http.ResponseWriter, r *http.Request)
}
type RedirectionHandler interface {
Redirect(w http.ResponseWriter, r *http.Request)
}
const apiSpecPath = "api.yaml"
func NewHandler(handler MetadataHandler, middlewares []mux.MiddlewareFunc) http.Handler {
router := mux.NewRouter()
apiSpecRedirectHandler := NewRedirectionHandler("/{application}/v1/metadata/api.yaml", http.StatusMovedPermanently)
for _, middleware := range middlewares {
router.Use(middleware)
}
router.Path("/v1/health").Handler(NewHealthCheckHandler()).Methods(http.MethodGet)
router.Path("/{application}/v1/metadata/api.yaml").Handler(NewStaticFileHandler(apiSpecPath)).Methods(http.MethodGet)
metadataRouter := router.PathPrefix("/{application}/v1/metadata").Subrouter()
metadataRouter.HandleFunc("", apiSpecRedirectHandler.Redirect)
metadataRouter.HandleFunc("/services", handler.CreateService).Methods(http.MethodPost)
metadataRouter.HandleFunc("/services", handler.GetServices).Methods(http.MethodGet)
metadataRouter.HandleFunc("/services/{serviceId}", handler.GetService).Methods(http.MethodGet)
metadataRouter.HandleFunc("/services/{serviceId}", handler.UpdateService).Methods(http.MethodPut)
metadataRouter.HandleFunc("/services/{serviceId}", handler.DeleteService).Methods(http.MethodDelete)
router.NotFoundHandler = NewErrorHandler(404, "Requested resource could not be found.")
router.MethodNotAllowedHandler = NewErrorHandler(405, "Method not allowed.")
return router
}