in src/middleware/main.go [40:95]
func main() {
conn := os.Getenv("db_conn")
user := os.Getenv("db_user")
host := os.Getenv("db_host")
name := os.Getenv("db_name")
pass := os.Getenv("db_pass")
redisHost := os.Getenv("redis_host")
redisPort := os.Getenv("redis_port")
port := os.Getenv("PORT")
if err := storage.Init(user, pass, host, name, conn, redisHost, redisPort, true); err != nil {
log.Fatalf("cannot initialize storage systems: %s", err)
}
defer storage.sqlstorage.Close()
signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
headersOk := handlers.AllowedHeaders([]string{"X-Requested-With"})
originsOk := handlers.AllowedOrigins([]string{"*"})
methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS", "DELETE"})
router := mux.NewRouter().StrictSlash(true)
router.HandleFunc("/healthz", healthHandler).Methods(http.MethodGet)
router.HandleFunc("/api/v1/todo", listHandler).Methods(http.MethodGet, http.MethodOptions)
router.HandleFunc("/api/v1/todo", createHandler).Methods(http.MethodPost)
router.HandleFunc("/api/v1/todo/{id}", readHandler).Methods(http.MethodGet)
router.HandleFunc("/api/v1/todo/{id}", deleteHandler).Methods(http.MethodDelete)
router.HandleFunc("/api/v1/todo/{id}", updateHandler).Methods(http.MethodPost, http.MethodPut)
srv := &http.Server{
Addr: ":" + port,
Handler: httpLog(handlers.CORS(originsOk, headersOk, methodsOk)(router)),
}
go func() {
log.Printf("listening on port %s", port)
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatal(err)
}
}()
sig := <-signalChan
log.Printf("%s signal caught", sig)
// Timeout if waiting for connections to return idle.
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
storage.sqlstorage.Close()
// Gracefully shutdown the server by waiting on existing requests (except websockets).
if err := srv.Shutdown(ctx); err != nil {
log.Printf("server shutdown failed: %+v", err)
}
log.Print("server exited")
}