Files
go-cli-course/order-ecommerce-api/cmd/api.go
T

63 lines
1.3 KiB
Go

package main
import (
"log"
"net/http"
"time"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
)
type application struct {
config config
// logger
// db driver
}
type dbConfig struct {
dsn string // database connection string
}
type config struct {
addr string // 12 factor document
db dbConfig
}
// mount
func (app *application) mount() http.Handler {
r := chi.NewRouter()
// A good base middleware stack
r.Use(middleware.RequestID) // important for rate-limiting
r.Use(middleware.ClientIPFromRemoteAddr) // also important for rate-limiting, analytics and tracing
r.Use(middleware.Logger)
r.Use(middleware.Recoverer) // nice to recover from panics and crashes
// Set a timeout value on the request context (ctx), that will signal
// through ctx.Done() that the request has timed out and further
// processing should be stopped.
r.Use(middleware.Timeout(60 * time.Second))
r.Get("/health", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hey"))
})
return r
}
// run
func (app *application) run(h http.Handler) error {
srv := &http.Server{
Addr: app.config.addr,
Handler: h,
WriteTimeout: 30 * time.Second,
ReadTimeout: 10 * time.Second,
IdleTimeout: 60 * time.Second,
}
log.Printf("Starting server on %s\n", app.config.addr)
return srv.ListenAndServe()
}