main.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/caarlos0/env/v6"
  6. "github.com/labstack/echo/v4"
  7. "go.uber.org/zap"
  8. "godash/bookmarks"
  9. "godash/hub"
  10. "godash/system"
  11. "godash/weather"
  12. "html/template"
  13. "net/http"
  14. "os"
  15. "os/signal"
  16. "time"
  17. )
  18. type goDash struct {
  19. router *echo.Echo
  20. logger *zap.SugaredLogger
  21. hub *hub.Hub
  22. config config
  23. info info
  24. }
  25. type info struct {
  26. weather *weather.Weather
  27. bookmarks *bookmarks.Config
  28. system *system.System
  29. }
  30. type config struct {
  31. Title string `env:"TITLE" envDefault:"goDash"`
  32. Port int `env:"PORT" envDefault:"4000"`
  33. AllowedHosts []string `env:"ALLOWED_HOSTS" envDefault:"*" envSeparator:","`
  34. LogLevel string `env:"LOG_LEVEL" envDefault:"info"`
  35. LiveSystem bool `env:"LIVE_SYSTEM" envDefault:"true"`
  36. }
  37. func (g *goDash) createInfoServices() {
  38. g.hub = hub.NewHub(g.logger)
  39. g.info = info{
  40. weather: weather.NewWeatherService(g.logger, g.hub),
  41. bookmarks: bookmarks.NewBookmarkService(g.logger),
  42. system: system.NewSystemService(g.config.LiveSystem, g.logger, g.hub),
  43. }
  44. }
  45. func (g *goDash) startServer() {
  46. if err := g.router.Start(fmt.Sprintf(":%d", g.config.Port)); err != nil && err != http.ErrServerClosed {
  47. g.logger.Fatal("shutting down the server")
  48. }
  49. }
  50. func (g *goDash) setupTemplateRender() {
  51. g.router.Renderer = &TemplateRenderer{
  52. templates: template.Must(template.ParseGlob("templates/*.gohtml")),
  53. }
  54. }
  55. func main() {
  56. g := goDash{router: echo.New()}
  57. if err := env.Parse(&g.config); err != nil {
  58. panic(err)
  59. }
  60. g.setupTemplateRender()
  61. g.setupLogger()
  62. defer func(logger *zap.SugaredLogger) {
  63. _ = logger.Sync()
  64. }(g.logger)
  65. g.setupEchoLogging()
  66. g.setupMiddlewares()
  67. g.createInfoServices()
  68. g.setupRouter()
  69. go g.startServer()
  70. g.logger.Infof("running on %s:%d", "http://localhost", g.config.Port)
  71. // handle graceful shutdown
  72. quit := make(chan os.Signal, 1)
  73. signal.Notify(quit, os.Interrupt)
  74. <-quit
  75. ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
  76. defer cancel()
  77. if err := g.router.Shutdown(ctx); err != nil {
  78. g.logger.Fatal(err)
  79. }
  80. }