main.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "os"
  7. "time"
  8. "github.com/gorilla/handlers"
  9. "github.com/jinzhu/gorm"
  10. "gogs.carducci-dante.gov.it/karmen/config"
  11. "gogs.carducci-dante.gov.it/karmen/core/api"
  12. "gogs.carducci-dante.gov.it/karmen/core/renderer"
  13. "gogs.carducci-dante.gov.it/karmen/orm"
  14. )
  15. const (
  16. MaxNumRetries = 20
  17. RetryTimeInterval = 2
  18. )
  19. func regenerateRelations(db *gorm.DB) error {
  20. var activities []orm.Activity
  21. if err := db.Find(&activities).Error; err != nil {
  22. return err
  23. }
  24. defer func() {
  25. if err := recover(); err != nil {
  26. log.Print(err)
  27. }
  28. }()
  29. for _, a := range activities {
  30. err := db.Save(&a).Error
  31. if err != nil {
  32. panic(err)
  33. }
  34. }
  35. return nil
  36. }
  37. func main() {
  38. var (
  39. db *gorm.DB
  40. err error
  41. )
  42. log.Println("Loading config file...")
  43. err = config.ReadFile("config/config.yaml", config.Config)
  44. if err != nil {
  45. panic(err)
  46. }
  47. log.Println("Starting karmen and waiting for the DB...")
  48. count := MaxNumRetries
  49. wait := true
  50. for wait && count > 0 {
  51. db, err = orm.New(fmt.Sprintf("%s?%s", config.Config.Orm.Connection, config.Config.Orm.Options))
  52. if err != nil {
  53. count--
  54. log.Println(err)
  55. log.Printf("Remaining retries: %d", count)
  56. time.Sleep(time.Second * RetryTimeInterval)
  57. continue
  58. }
  59. wait = false
  60. }
  61. orm.Use(db)
  62. if config.Config.Orm.Reset {
  63. log.Print("Resetting the DB...")
  64. orm.Reset()
  65. }
  66. if config.Config.Orm.AutoMigrate {
  67. log.Print("Automigrating...")
  68. orm.AutoMigrate()
  69. }
  70. if config.Config.Orm.Regenerate {
  71. log.Print("Regenerate relations...")
  72. if err := regenerateRelations(db); err != nil {
  73. panic(err)
  74. }
  75. }
  76. rend, err := renderer.NewHTMLRenderer("templates/")
  77. if err != nil {
  78. panic(err)
  79. }
  80. renderer.Use(rend)
  81. log.Println("karmen is listening to port 3000...")
  82. if err := http.ListenAndServe(":3000", handlers.LoggingHandler(os.Stdout, api.Handlers())); err != nil {
  83. panic(err)
  84. }
  85. }