package main import ( "flag" "fmt" "log" "net/http" "os" "time" ) const ( version = "1.0.0" ) type config struct { port int smtp struct { host string port int username string password string } frontend string } type application struct { config config infoLog *log.Logger errorLog *log.Logger version string } func (app *application) serve() error { srv := &http.Server{ Addr: fmt.Sprintf(":%d", app.config.port), Handler: app.routes(), IdleTimeout: 30 * time.Second, ReadTimeout: 10 * time.Second, ReadHeaderTimeout: 5 * time.Second, WriteTimeout: 5 * time.Second, } app.infoLog.Printf( "Starting invoice microservice on port %d", app.config.port, ) return srv.ListenAndServe() } func main() { var cfg config flag.IntVar(&cfg.port, "port", 5000, "Server port to listen on") flag.StringVar(&cfg.smtp.host, "smtphost", "0.0.0.0", "smtp host") flag.IntVar(&cfg.smtp.port, "smtpport", 1025, "smtp host") flag.StringVar(&cfg.smtp.username, "smtpuser", "user", "smtp user") flag.StringVar(&cfg.smtp.password, "smtppwd", "password", "smtp password") flag.StringVar(&cfg.frontend, "frontend", "http://localhost:4000", "frontend address") flag.Parse() infoLog := log.New(os.Stdout, "INFO\t", log.Ldate|log.Ltime) errorLog := log.New(os.Stdout, "ERROR\t", log.Ldate|log.Ltime|log.Lshortfile) app := &application{ version: version, config: cfg, infoLog: infoLog, errorLog: errorLog, } app.CreateDirIfNotExist("./invoices") err := app.serve() if err != nil { log.Fatal(err) } }