main.go 1.7 KB

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