We can now use environment values to dictate which values are used for the DB and the domain. This is a simple solution, but for now, it works! This will merge into master and we can then see it live in action!
120 lines
3.7 KiB
Go
120 lines
3.7 KiB
Go
package domain
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/golang-jwt/jwt/v5"
|
|
domainAuth "github.com/haydenhargreaves/Potion/internal/domain/auth"
|
|
domainEngagement "github.com/haydenhargreaves/Potion/internal/domain/engagement"
|
|
domainRecipe "github.com/haydenhargreaves/Potion/internal/domain/recipe"
|
|
domainUser "github.com/haydenhargreaves/Potion/internal/domain/user"
|
|
"github.com/joho/godotenv"
|
|
)
|
|
|
|
// EnvironmentConfig stores the configuration of the environment. Anything loaded from the .env
|
|
// or docker environment will be stored here and can be accessed from the InjectedDependencies
|
|
// struct, which this is attached to.
|
|
type EnvironmentConfig struct {
|
|
GoogleClientId string
|
|
GoogleClientSecret string
|
|
JwtSecret string
|
|
DatabaseUrl string
|
|
Environment string
|
|
Domain string
|
|
}
|
|
|
|
// InjectedDependencies is a collection of dependencies that are injected into the application. They
|
|
// are stored in the context and can be accessed by handlers via the context.
|
|
type InjectedDependencies struct {
|
|
UserService domainUser.UserService
|
|
AuthService domainAuth.AuthService
|
|
RecipeService domainRecipe.RecipeService
|
|
EngagementService domainEngagement.EngagementService
|
|
EnvironmentConfig EnvironmentConfig
|
|
}
|
|
|
|
// JwtClaims is the data stored in the JSON web token. All that is needed is the users ID and their
|
|
// Google email provided.
|
|
type JwtClaims struct {
|
|
UserId int `json:"id"`
|
|
Email string `json:"email"`
|
|
jwt.RegisteredClaims
|
|
}
|
|
|
|
// IsLoggedIn checks the cookies in a request and returns whether the user is logged in.
|
|
func IsLoggedIn(ctx *gin.Context) bool {
|
|
_, id := ctx.Get("userId")
|
|
_, email := ctx.Get("userEmail")
|
|
return id && email
|
|
}
|
|
|
|
func LoadEnvironment() (*EnvironmentConfig, error) {
|
|
err := godotenv.Load(".env")
|
|
if err != nil {
|
|
fmt.Printf("No .env file found or error loading .env: %v. Relying on system environment variables.", err)
|
|
}
|
|
|
|
env := os.Getenv("ENVIRONMENT")
|
|
if env == "" {
|
|
return nil, fmt.Errorf("ENVIRONMENT environment variable is required.")
|
|
}
|
|
|
|
googleClientId := os.Getenv("GOOGLE_CLIENT_ID")
|
|
if googleClientId == "" {
|
|
return nil, fmt.Errorf("GOOGLE_CLIENT_ID environment variable is required.")
|
|
}
|
|
|
|
googleClientSecret := os.Getenv("GOOGLE_CLIENT_SECRET")
|
|
if googleClientSecret == "" {
|
|
return nil, fmt.Errorf("GOOGLE_CLIENT_SECRET environment variable is required.")
|
|
}
|
|
|
|
jwtSecret := os.Getenv("JWT_SECRET")
|
|
if jwtSecret == "" {
|
|
return nil, fmt.Errorf("JWT_SECRET environment variable is required.")
|
|
}
|
|
|
|
var domain string
|
|
if env == "dev" {
|
|
domain = os.Getenv("DOMAIN_DEV")
|
|
if domain == "" {
|
|
return nil, fmt.Errorf("DOMAIN_DEV environment variable is required when ENVIRONMENT is 'dev'.")
|
|
}
|
|
} else if env == "prod" {
|
|
domain = os.Getenv("DOMAIN_PROD")
|
|
if domain == "" {
|
|
return nil, fmt.Errorf("DOMAIN_PROD environment variable is required when ENVIRONMENT is 'prod'.")
|
|
}
|
|
} else {
|
|
return nil, fmt.Errorf("ENVIRONMENT environment variable is required and must be 'dev' or 'prod'.")
|
|
}
|
|
|
|
var dbUrl string
|
|
if env == "dev" {
|
|
dbUrl = os.Getenv("DATABASE_URL_DEV")
|
|
if dbUrl == "" {
|
|
return nil, fmt.Errorf("DATABASE_URL_DEV environment variable is required when ENVIRONMENT is 'dev'.")
|
|
}
|
|
} else if env == "prod" {
|
|
dbUrl = os.Getenv("DATABASE_URL_PROD")
|
|
if dbUrl == "" {
|
|
return nil, fmt.Errorf("DATABASE_URL_PROD environment variable is required when ENVIRONMENT is 'prod'.")
|
|
}
|
|
} else {
|
|
return nil, fmt.Errorf("ENVIRONMENT environment variable is required and must be 'dev' or 'prod'.")
|
|
}
|
|
|
|
cfg := &EnvironmentConfig{
|
|
GoogleClientId: googleClientId,
|
|
GoogleClientSecret: googleClientSecret,
|
|
JwtSecret: jwtSecret,
|
|
DatabaseUrl: dbUrl,
|
|
Environment: env,
|
|
Domain: domain,
|
|
}
|
|
|
|
return cfg, nil
|
|
}
|