Files
2026-02-03 22:03:08 +01:00

80 lines
2.2 KiB
Go

package router
import (
"context"
"net/http"
"os"
"simple-cluster-node/health"
"simple-cluster-node/node"
"github.com/google/uuid"
"github.com/gorilla/mux"
log "gitlab.com/gdulai/simpleloglvl"
)
func SetupRouter() *mux.Router {
r := mux.NewRouter()
r.Use(identifyRequest, corsCheck, logRequest)
r.HandleFunc("/health", health.Handle).Methods("GET", "OPTIONS")
r.HandleFunc("/node/info", node.HandleInfo).Methods("GET", "OPTIONS")
r.HandleFunc("/node/start", node.HandleStart).Methods("POST", "OPTIONS")
r.HandleFunc("/node/stop", node.HandleStop).Methods("POST", "OPTIONS")
return r
}
func identifyRequest(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
requestId, err := uuid.NewRandom()
if err != nil {
log.LogInfo("Failed to generated requestId!")
w.WriteHeader(http.StatusInternalServerError)
return
}
log.LogInfo("Assigned UUID to request! (%s)", &requestId)
context := context.WithValue(r.Context(), "requestId", requestId)
log.LogDebug("Next handler called! (%s)", requestId)
next.ServeHTTP(w, r.WithContext(context))
})
}
func corsCheck(handler http.Handler) http.Handler {
origins := os.Getenv("CORS_ORIGINS")
methods := os.Getenv("CORS_METHODS")
header := os.Getenv("CORS_HEADERS")
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
requestId := r.Context().Value("requestId")
log.LogInfo("CORS check called... (%s)", requestId)
w.Header().Set("Access-Control-Allow-Origin", origins)
w.Header().Set("Access-Control-Allow-Methods", methods)
w.Header().Set("Access-Control-Allow-Headers", header)
if r.Method == http.MethodOptions {
log.LogInfo("Pre flight check OK! (%s)", requestId)
w.WriteHeader(http.StatusOK)
return
}
log.LogDebug("Next handler called! (%s)", requestId)
handler.ServeHTTP(w, r)
})
}
func logRequest(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
requestId := r.Context().Value("requestId")
log.LogInfo("%s %s %s from %s (%s)", r.Method, r.RequestURI, r.Proto, r.RemoteAddr, r.Context().Value("requestId"))
log.LogDebug("Next handler called! (%s)", requestId)
next.ServeHTTP(w, r)
})
}