config.go 2.5 KB

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