main.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package main
  2. import (
  3. "encoding/json"
  4. "log"
  5. "net"
  6. "net/http"
  7. "os"
  8. "strings"
  9. "time"
  10. // "git.mmnx.de/Moe/webOffice_backend/contacts"
  11. // "git.mmnx.de/Moe/webOffice_backend/module"
  12. "git.mmnx.de/mmnx/cdn/module"
  13. "git.mmnx.de/mmnx/cdn/files"
  14. "github.com/gorilla/mux"
  15. "github.com/jinzhu/gorm"
  16. _ "github.com/jinzhu/gorm/dialects/mysql"
  17. "github.com/rs/cors"
  18. "github.com/urfave/negroni"
  19. )
  20. func connectDB(host string) *gorm.DB {
  21. time.Sleep(250 * time.Millisecond) // let mysql startup
  22. db, err := gorm.Open("mysql", "root:root@tcp("+host+")/cdn?charset=utf8mb4&parseTime=True&loc=Local")
  23. if err != nil {
  24. if strings.HasPrefix(err.Error(), "default addr for network") {
  25. log.Println("Reconnecting..")
  26. return connectDB(host)
  27. }
  28. log.Println(err)
  29. return nil
  30. }
  31. log.Println("Apparently connected")
  32. return db
  33. }
  34. func main() {
  35. log.SetFlags(log.LstdFlags | log.Lshortfile) // get line numberz
  36. c := cors.New(cors.Options{ // allow ng dev server access
  37. AllowedOrigins: []string{"http://localhost:4200"},
  38. AllowedMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE"},
  39. })
  40. // lookup docker db ip
  41. names, err := net.LookupHost("cdn-db")
  42. if err != nil {
  43. log.Println("Failed to get DB host: ", err)
  44. return // TODO retry
  45. }
  46. if len(names) < 1 {
  47. log.Println("No hosts")
  48. return
  49. }
  50. db := connectDB(names[0])
  51. defer db.Close()
  52. router := mux.NewRouter()
  53. apiV1 := router.PathPrefix("/api/v1").Subrouter()
  54. modConf := module.Config{apiV1, "/api/v1", db, true, log.New(os.Stdout, "[debug] ", log.LstdFlags|log.Lshortfile)} // debug
  55. //modConf := module.Config{apiV1, "/api/v1", db, false, log.New(os.Stdout, "[log] ", log.LstdFlags|log.Lshortfile)} // production
  56. module.Conf = modConf
  57. // contacts.RegisterModule(&modConf)
  58. files.RegisterModule(&modConf)
  59. module.NegroniRoute(apiV1, "/api/v1", "/test", "GET", HandlerFunc, AuthFunc)
  60. n := negroni.Classic()
  61. n.Use(module.NewHTTPStatusHandler())
  62. n.Use(c)
  63. n.UseHandler(router)
  64. n.Run(":3000")
  65. }
  66. // AuthFunc ...
  67. func AuthFunc(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
  68. // TODO some kind of auth
  69. next(w, r)
  70. }
  71. // HandlerFunc ...
  72. func HandlerFunc(w http.ResponseWriter, r *http.Request) {
  73. encJSON, _ := json.Marshal("wörks") // err
  74. // errs.HandleError(errs.ErrEncodingJSON, err)
  75. //
  76. // // Error handling debug
  77. // err = errors.New("ayyyyy")
  78. // errs.HandleError(errs.ErrUnknown, err)
  79. // names, err := net.LookupHost("weboffice-db")
  80. // module.HandleError(module.ErrUnknown, err)
  81. //
  82. // spew.Dump(names)
  83. w.Write(encJSON)
  84. // log.Println(string(encJSON))
  85. }