serve.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package main
  2. import (
  3. "code.osinet.fr/fgm/kurz/api"
  4. "code.osinet.fr/fgm/kurz/domain"
  5. "code.osinet.fr/fgm/kurz/infrastructure"
  6. "database/sql"
  7. "github.com/spf13/cobra"
  8. "github.com/spf13/viper"
  9. "log"
  10. )
  11. var cmdServe = &cobra.Command{
  12. Args: cobra.NoArgs,
  13. Long: "Start HTTP Server",
  14. Run: serveMarkupHandler,
  15. Short: "Top-level command for HTTP Serving.",
  16. Use: "serve",
  17. }
  18. // db is the database connection shared by "serve *" commands.
  19. var db *sql.DB
  20. func init() {
  21. cmd.AddCommand(cmdServe)
  22. }
  23. func ensureInfrastructure(db *sql.DB) *sql.DB {
  24. if db != nil {
  25. err := db.Ping()
  26. if err != nil {
  27. db = nil
  28. }
  29. }
  30. if db != nil {
  31. return db
  32. }
  33. dbDriver, dbDsn := infrastructure.ParseDbCred()
  34. db, err := infrastructure.DbDial(dbDriver, dbDsn)
  35. if err != nil {
  36. panic(err)
  37. }
  38. domain.RegisterRepositories(
  39. infrastructure.MySQLShortURLRepository{DB: db},
  40. infrastructure.MySQLTargetURLRepository{DB: db},
  41. )
  42. return db
  43. }
  44. // serveMarkupHandler handles paths below /web/public.
  45. func serveMarkupHandler(_ *cobra.Command, args []string) {
  46. db = ensureInfrastructure(db)
  47. defer db.Close()
  48. address := viper.Get("web.address").(string)
  49. err := api.ListenAndServe(address)
  50. log.Fatal(err)
  51. }