github.com/tuingking/flamingo@v0.0.0-20220403134817-2796ae0e84ca/handler/rest/routes.go (about)

     1  package rest
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  	"os"
     7  
     8  	"github.com/go-chi/chi"
     9  	"github.com/go-chi/chi/middleware"
    10  	"github.com/go-chi/cors"
    11  	httpSwagger "github.com/swaggo/http-swagger"
    12  
    13  	_ "github.com/tuingking/flamingo/docs"
    14  )
    15  
    16  func NewHttpHandler(h RestHandler) http.Handler {
    17  	r := chi.NewRouter()
    18  	r.Use(middleware.Logger)
    19  	r.Use(middleware.Recoverer)
    20  
    21  	// health
    22  	r.Route("/application", func(r chi.Router) {
    23  		r.Get("/health", h.Health)
    24  	})
    25  
    26  	// swagger
    27  	r.Get("/swagger/*", httpSwagger.Handler(httpSwagger.URL("./doc.json")))
    28  
    29  	// Web
    30  	r.Route("/", func(r chi.Router) {
    31  		r.Get("/", h.Home)
    32  	})
    33  
    34  	// public API
    35  	r.Post("/api/auth/token", h.IssueAccessToken)
    36  	r.Post("/api/account", h.RegisterNewAccount)
    37  
    38  	// protected API
    39  	r.Mount("/api", privateRoute(h))
    40  
    41  	return r
    42  }
    43  
    44  func privateRoute(h RestHandler) http.Handler {
    45  	r := chi.NewRouter()
    46  	r.Use(middleware.Heartbeat("/ping"))
    47  	r.Use(middleware.RequestID)
    48  	r.Use(middleware.Logger)
    49  	r.Use(middleware.RealIP)
    50  	r.Use(middleware.Recoverer)
    51  	// r.Use(panics.HTTPRecoveryMiddleware)
    52  	r.Use(cors.Handler(cors.Options{
    53  		AllowedOrigins: []string{"*"},
    54  		AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "PATCH"},
    55  		AllowedHeaders: []string{"Accept", "Authorization", "Content-Type"},
    56  	}))
    57  	// r.Use(flaware.Satpam(h.auth))
    58  
    59  	// API route
    60  	r.Route("/products", func(r chi.Router) {
    61  		r.Get("/", h.GetAllProducts)
    62  		r.Post("/seed/{n}", h.SeedProduct)
    63  	})
    64  
    65  	return r
    66  }
    67  
    68  func (rs *RestHandler) Health(w http.ResponseWriter, r *http.Request) {
    69  	resp := map[string]interface{}{
    70  		"name": os.Args[0],
    71  		"status": map[string]string{
    72  			"application": "OK",
    73  		},
    74  	}
    75  
    76  	data, _ := json.Marshal(resp)
    77  	w.Header().Set("Content-Type", "application/json")
    78  	w.Write(data)
    79  }