config.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package config
  2. import (
  3. "fmt"
  4. "log"
  5. "net/url"
  6. "os"
  7. "path/filepath"
  8. "strconv"
  9. "strings"
  10. "github.com/joho/godotenv"
  11. "github.com/felamaslen/gmus-backend/pkg/logger"
  12. )
  13. var envLoaded = false
  14. func getEnvFile() (string, bool) {
  15. goEnv, _ := os.LookupEnv("GO_ENV")
  16. switch goEnv {
  17. case "test":
  18. return "test.env", true
  19. case "ci":
  20. return "ci.env", true
  21. case "development":
  22. return ".env", true
  23. default:
  24. return "", false
  25. }
  26. }
  27. func loadEnv() {
  28. envFileBase, loadEnvFile := getEnvFile()
  29. cwd, _ := os.Getwd()
  30. envFile := filepath.Join(cwd, envFileBase)
  31. if loadEnvFile {
  32. err := godotenv.Load(envFile)
  33. if err != nil {
  34. log.Printf("Error loading dotenv file: %v\n", err)
  35. } else {
  36. envLoaded = true
  37. }
  38. }
  39. }
  40. func getDatabaseUrl() string {
  41. host, hasHost := os.LookupEnv("POSTGRES_HOST")
  42. if !hasHost {
  43. log.Fatal("Must set POSTGRES_HOST")
  44. }
  45. user := os.Getenv("POSTGRES_USER")
  46. password := os.Getenv("POSTGRES_PASSWORD")
  47. portDev, hasPortDev := os.LookupEnv("DB_PORT_GMUS_DEV")
  48. port, hasPort := os.LookupEnv("POSTGRES_PORT")
  49. if hasPortDev {
  50. port = portDev
  51. } else if !hasPort {
  52. port = "5432"
  53. }
  54. portNumeric, err := strconv.Atoi(port)
  55. if err != nil {
  56. log.Fatal("POSTGRES_PORT must be numeric")
  57. }
  58. database, hasDatabase := os.LookupEnv("POSTGRES_DATABASE")
  59. if !hasDatabase {
  60. log.Fatal("Must set POSTGRES_DATABASE")
  61. }
  62. databaseUrl := fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=disable", user, url.QueryEscape(password), host, portNumeric, database)
  63. return databaseUrl
  64. }
  65. const defaultLogLevel = logger.LevelInfo
  66. func getLogLevel() logger.LogLevel {
  67. level, hasLevel := os.LookupEnv("LOG_LEVEL")
  68. if !hasLevel {
  69. return defaultLogLevel
  70. }
  71. levelInt, err := strconv.Atoi(level)
  72. if err != nil {
  73. return defaultLogLevel
  74. }
  75. switch levelInt {
  76. case 0:
  77. return logger.LevelNone
  78. case 1:
  79. return logger.LevelError
  80. case 2:
  81. return logger.LevelWarn
  82. case 3:
  83. return logger.LevelInfo
  84. case 4:
  85. return logger.LevelVerbose
  86. case 5:
  87. return logger.LevelDebug
  88. }
  89. return defaultLogLevel
  90. }
  91. func getPort() int {
  92. var defaultPort = 3000
  93. port, hasPort := os.LookupEnv("PORT")
  94. if !hasPort {
  95. return defaultPort
  96. }
  97. result, err := strconv.Atoi(port)
  98. if err != nil {
  99. return defaultPort
  100. }
  101. return result
  102. }
  103. func getListenHost() string {
  104. var defaultHost = "localhost"
  105. host, hasHost := os.LookupEnv("HOST")
  106. if !hasHost {
  107. return defaultHost
  108. }
  109. return host
  110. }
  111. func getRedisUrl() string {
  112. url, hasUrl := os.LookupEnv("REDIS_URL")
  113. if !hasUrl {
  114. return "localhost:6379"
  115. }
  116. return url
  117. }
  118. func getAllowedOrigins() []string {
  119. origins, hasOrigins := os.LookupEnv("ALLOWED_ORIGINS")
  120. if !hasOrigins {
  121. return []string{"*"}
  122. }
  123. return strings.Split(origins, ",")
  124. }
  125. type config struct {
  126. DatabaseUrl string
  127. LogLevel logger.LogLevel
  128. LibraryDirectory string
  129. Host string
  130. Port int
  131. RedisUrl string
  132. AllowedOrigins []string
  133. }