config.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. port, hasPort := os.LookupEnv("POSTGRES_PORT")
  48. if !hasPort {
  49. port = "5432"
  50. }
  51. portNumeric, err := strconv.Atoi(port)
  52. if err != nil {
  53. log.Fatal("POSTGRES_PORT must be numeric")
  54. }
  55. database, hasDatabase := os.LookupEnv("POSTGRES_DATABASE")
  56. if !hasDatabase {
  57. log.Fatal("Must set POSTGRES_DATABASE")
  58. }
  59. databaseUrl := fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=disable", user, url.QueryEscape(password), host, portNumeric, database)
  60. return databaseUrl
  61. }
  62. const defaultLogLevel = logger.LevelInfo
  63. func getLogLevel() logger.LogLevel {
  64. level, hasLevel := os.LookupEnv("LOG_LEVEL")
  65. if !hasLevel {
  66. return defaultLogLevel
  67. }
  68. levelInt, err := strconv.Atoi(level)
  69. if err != nil {
  70. return defaultLogLevel
  71. }
  72. switch levelInt {
  73. case 0:
  74. return logger.LevelNone
  75. case 1:
  76. return logger.LevelError
  77. case 2:
  78. return logger.LevelWarn
  79. case 3:
  80. return logger.LevelInfo
  81. case 4:
  82. return logger.LevelVerbose
  83. case 5:
  84. return logger.LevelDebug
  85. }
  86. return defaultLogLevel
  87. }
  88. func getPort() int {
  89. var defaultPort = 3000
  90. port, hasPort := os.LookupEnv("PORT")
  91. if !hasPort {
  92. return defaultPort
  93. }
  94. result, err := strconv.Atoi(port)
  95. if err != nil {
  96. return defaultPort
  97. }
  98. return result
  99. }
  100. func getListenHost() string {
  101. var defaultHost = "localhost"
  102. host, hasHost := os.LookupEnv("HOST")
  103. if !hasHost {
  104. return defaultHost
  105. }
  106. return host
  107. }
  108. func getRedisUrl() string {
  109. url, hasUrl := os.LookupEnv("REDIS_URL")
  110. if !hasUrl {
  111. return "localhost:6379"
  112. }
  113. return url
  114. }
  115. func getAllowedOrigins() []string {
  116. origins, hasOrigins := os.LookupEnv("ALLOWED_ORIGINS")
  117. if !hasOrigins {
  118. return []string{"*"}
  119. }
  120. return strings.Split(origins, ",")
  121. }
  122. type config struct {
  123. DatabaseUrl string
  124. LogLevel logger.LogLevel
  125. LibraryDirectory string
  126. Host string
  127. Port int
  128. RedisUrl string
  129. AllowedOrigins []string
  130. }