package main import ( "database/sql" "encoding/json" "fmt" "github.com/gorilla/sessions" _ "github.com/lib/pq" "html/template" "net/http" "os" "path/filepath" "regexp" "flag" ) const ( VERSION = "0.1" MAX_DB_CONNS = 10 // already excessive for personal app ) type Config struct { Sql struct { Host string Dbname string Username string Password string } Port string Url string } const ( flash_err = "_flash_err" flash_info = "_flash_info" ) var ( config Config db *sql.DB store = sessions.NewCookieStore([]byte("key-store-auth-secret")) templates = map[string]*template.Template{} ) func loadConfig(env string) { file, err := os.Open("config/" + env + ".json") if err != nil { fmt.Println("Error: cannot open config file: config/" + env + ".json") os.Exit(-1) } decoder := json.NewDecoder(file) err = decoder.Decode(&config) if err != nil { fmt.Println("Error: cannot decode config file: ", err) os.Exit(-1) } } func dbConnect() { var err error db, err = sql.Open("postgres", fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=require", config.Sql.Username, config.Sql.Password, config.Sql.Host, config.Sql.Dbname)) if err != nil { fmt.Println("DB ERROR: ", err) } db.SetMaxIdleConns(MAX_DB_CONNS) err = db.Ping() if err != nil { fmt.Println("DB Error on Ping(): ", err) os.Exit(-1) } } func initTemplates() { files, _ := filepath.Glob("templates/pages/*.html") re := regexp.MustCompile("templates/pages/(.*).html") fmt.Println("Loading Templates:") for _, t := range files { name := re.FindStringSubmatch(t) fmt.Println(" ", name[1]) var err error templates[name[1]], err = template.ParseFiles("templates/layout.html", t) if err != nil { fmt.Println("Template load error: ", err) os.Exit(-1) } } } func main() { fmt.Println("transmet ", VERSION) envFlag := flag.String("env", "local", "load config/{env}.json") flag.Parse() fmt.Println("Loading...") loadConfig(*envFlag) dbConnect() initTemplates() init_route_handlers() fmt.Println("Listening on", config.Port, "...") err := http.ListenAndServe(":"+config.Port, nil) if err != nil { fmt.Println("Fatal Error: ", err) } db.Close() }