diff --git a/api/database/database.go b/api/database/database.go index 3dd025a..674771a 100644 --- a/api/database/database.go +++ b/api/database/database.go @@ -3,7 +3,6 @@ package database import ( "context" "fmt" - "os" "time" db "zardzul/music-index/sqlc" @@ -11,16 +10,11 @@ import ( "github.com/jackc/pgx/v5/pgxpool" ) -func Connect() (*pgxpool.Pool, *db.Queries, error) { +func Connect(databaseurl string) (*pgxpool.Pool, *db.Queries, error) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - databaseURL := os.Getenv("DATABASE_URL") - if databaseURL == "" { - panic("DATABASE_URL environment variable not set") - } - - pool, err := pgxpool.New(ctx, databaseURL) + pool, err := pgxpool.New(ctx, databaseurl) if err != nil { return nil, nil, fmt.Errorf("create pool: %w", err) } diff --git a/api/main.go b/api/main.go index 861e5f0..2e39a26 100644 --- a/api/main.go +++ b/api/main.go @@ -1,17 +1,15 @@ package main import ( - "os" - "strconv" "time" "zardzul/music-index/database" _ "zardzul/music-index/docs" "zardzul/music-index/handlers" "zardzul/music-index/repository" "zardzul/music-index/routes" + "zardzul/music-index/utils" "github.com/gin-gonic/gin" - "github.com/joho/godotenv" ) // @title Music Index API @@ -20,43 +18,25 @@ import ( // @BasePath /api/v1/ func main() { - err := godotenv.Load(".env") + + config, err := utils.LoadConfig() if err != nil { - panic("Error loading .env file") + return } - pool, queries, databaseError := database.Connect() + pool, queries, databaseError := database.Connect(config.DBURL) if databaseError != nil { panic(databaseError) } defer pool.Close() - jwtSecret := os.Getenv("JWT_SECRET") - if jwtSecret == "" { - panic("JWT_SECRET is required") - } - - jwtIssuer := os.Getenv("JWT_ISSUER") - if jwtIssuer == "" { - jwtIssuer = "music-index-api" - } - - jwtTTLMinutes := 60 - if envTTL := os.Getenv("JWT_TTL_MINUTES"); envTTL != "" { - parsed, parseErr := strconv.Atoi(envTTL) - if parseErr != nil || parsed <= 0 { - panic("JWT_TTL_MINUTES must be a positive integer") - } - jwtTTLMinutes = parsed - } - userRepo := repository.NewUserRepository(queries) - userHandler := handlers.NewUserHandler(userRepo, jwtSecret, jwtIssuer, time.Duration(jwtTTLMinutes)*time.Minute) + userHandler := handlers.NewUserHandler(userRepo, config.JWTsecret, config.JWTIssuer, time.Duration(config.JWTTTL)*time.Minute) artistRepo := repository.NewArtistRepository(queries) artistHandler := handlers.NewArtistHandler(artistRepo) router := gin.Default() - routes.Routes(router, userHandler, artistHandler, jwtSecret) + routes.Routes(router, userHandler, artistHandler, config.JWTsecret) if routerError := router.Run(":8080"); routerError != nil { panic(routerError) diff --git a/api/utils/config.go b/api/utils/config.go new file mode 100644 index 0000000..13fe18e --- /dev/null +++ b/api/utils/config.go @@ -0,0 +1,50 @@ +package utils + +import ( + "os" + "strconv" + + "github.com/joho/godotenv" +) + +type Config struct { + JWTsecret string + JWTIssuer string + JWTTTL int + DBURL string +} + +func LoadConfig() (*Config, error) { + Config := new(Config) + + err := godotenv.Load(".env") + if err != nil { + panic("Error loading .env file") + } + + Config.JWTsecret = os.Getenv("JWT_SECRET") + if Config.JWTsecret == "" { + panic("JWT_SECRET is required") + } + + Config.JWTIssuer = os.Getenv("JWT_ISSUER") + if Config.JWTIssuer == "" { + Config.JWTIssuer = "music-index-api" + } + + Config.JWTTTL = 60 + if envTTL := os.Getenv("JWT_TTL_MINUTES"); envTTL != "" { + parsed, parseErr := strconv.Atoi(envTTL) + if parseErr != nil || parsed <= 0 { + panic("JWT_TTL_MINUTES must be a positive integer") + } + Config.JWTTTL = parsed + } + + Config.DBURL = os.Getenv("DATABASE_URL") + if Config.DBURL == "" { + panic("DATABASE_URL environment variable not set") + } + + return Config, nil +}