package webConfig
import (
"fmt"
"git.ssns.se/git/frozendragon/pokemon-go-trade/internal/web"
nested "github.com/antonfisher/nested-logrus-formatter"
"github.com/go-chi/chi"
"github.com/sirupsen/logrus"
"github.com/spf13/viper"
"io"
"net/http"
"os"
"path/filepath"
"strings"
)
func CreateServer() {
log := SetupLogging()
log.Info("Starting application")
config, err := setupEnvironment()
if err != nil {
panic(err)
}
//database := pg.Connect(&pg.Options{
// Addr: config.GetString(configKey.DatabaseAddr),
// User: config.GetString(configKey.DatabaseUser),
// Password: config.GetString(configKey.DatabasePassword),
// Database: config.GetString(configKey.DatabaseName),
//})
//defer database.Close()
webPackage := web.WebPackage{
Config: config,
Log: log,
}
r := chi.NewRouter()
workDir, _ := os.Getwd()
filesDir := filepath.Join(workDir, "static/html/build")
filesImagesDir := filepath.Join(workDir, "static/images")
r.Route("/", func(r chi.Router) {
FileServer(r, "/", http.Dir(filesDir))
})
r.Route("/api", func(r chi.Router) {
r.Get("/available-pokemon", webPackage.GetAvailablePokemon)
r.Get("/stored-pokemon", webPackage.GetStoredPokemon)
r.Post("/stored-pokemon", webPackage.PostStoredPokemon)
})
FileServer(r, "/image", http.Dir(filesImagesDir))
err = http.ListenAndServe(":8080", r)
if err != nil {
panic(err)
}
}
func setupEnvironment() (*viper.Viper, error) {
var config = viper.New()
config.SetConfigType("json")
file, err := os.Open("config/environment.json")
if err != nil {
return nil, err
}
err = config.ReadConfig(file)
if err != nil {
return nil, err
}
config.SetConfigType("json")
file, err = os.Open(fmt.Sprintf("config/%s.json", config.GetString("environment")))
if err != nil {
return nil, err
}
err = config.ReadConfig(file)
if err != nil {
return nil, err
}
return config, nil
}
func SetupLogging() *logrus.Logger {
log := logrus.New()
log.SetFormatter(&nested.Formatter{
HideKeys: true,
FieldsOrder: []string{"component", "category"},
})
file, err := os.OpenFile("log/info.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
mw := io.MultiWriter(os.Stdout, file)
if err == nil {
log.SetOutput(mw)
} else {
log.Info("Failed to log to file, using default stderr")
}
log.SetLevel(logrus.InfoLevel)
return log
}
func FileServer(r chi.Router, path string, root http.FileSystem) {
if strings.ContainsAny(path, "{}*") {
panic("FileServer does not permit URL parameters.")
}
fs := http.StripPrefix(path, http.FileServer(root))
if path != "/" && path[len(path)-1] != '/' {
r.Get(path, http.RedirectHandler(path+"/", 301).ServeHTTP)
path += "/"
}
path += "*"
r.Get(path, func(w http.ResponseWriter, r *http.Request) {
fs.ServeHTTP(w, r)
})
}