Hayden Hargreaves a54575b003 (FIX): Fixed up the environent, much needed.
Super cool package that uses struct tags to load the environment. Still
need to clean up the function in the server/server.go file.
2026-01-26 23:26:07 -07:00

117 lines
4.0 KiB
Go

package domain
import (
"fmt"
"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"
"github.com/kelseyhightower/envconfig"
)
// 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 `envconfig:"GOOGLE_CLIENT_ID" required:"true"`
GoogleClientSecret string `envconfig:"GOOGLE_CLIENT_SECRET" required:"true"`
JwtSecret string `envconfig:"JWT_SECRET" required:"true"`
DatabaseUrl string `envconfig:"DATABASE_URL" required:"true"`
Domain string `envconfig:"DOMAIN" required:"true"`
FrontendDomain string `envconfig:"FRONTEND_DOMAIN" required:"true"`
Environment string `envconfig:"ENVIRONMENT" required:"true"`
LogFilePath string `envconfig:"LOG_FILE_PATH" required:"false"`
}
// 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
}
// LoadEnvironment loads the environment values from either an .env file or docker environment.
func LoadEnvironment() (*EnvironmentConfig, error) {
// NOTE: Does the error return matter?
godotenv.Load(".env")
cfg := &EnvironmentConfig{}
if err := envconfig.Process("", cfg); err != nil {
return nil, fmt.Errorf("Failed to load environment: %w", err)
}
return cfg, nil
}
// SetCookie sets a cookie value with a duration provided. This function handles setting the security
// configuration as well as the domain. These values are based on the EnvironmentConfig, therefore
// the value should be set. Nothing is returned by this function, but the cookie will be set.
//
// This function can also be used to clear cookies, if a blank value ("") and invalid duration (-1)
// is provided.
//
// If 0 is provided as the duration, then a session cookie is created, which will be cleared when
// the browser is closed.
//
// DEPRECATED: As of September 4th, 2025.
// func SetCookie(ctx *gin.Context, name, value string, duration time.Duration) {
// deps := ctx.MustGet("deps").(*InjectedDependencies)
//
// var (
// path string = "/"
// httpOnly bool = true
// maxAge int
// secure bool
// domain string
// )
//
// if duration < 0 {
// // Delete the cookie
// maxAge = -1
// } else if duration == 0 {
// // Session cookie, clears when browser is closed
// maxAge = 0
// } else {
// // Normal calculation
// maxAge = int(time.Now().Add(duration).Sub(time.Now()).Seconds())
// }
//
// if deps.EnvironmentConfig.Environment == "prod" {
// secure = true
// domain = deps.EnvironmentConfig.Domain
//
// } else if deps.EnvironmentConfig.Environment == "dev" {
// secure = false
// domain = deps.EnvironmentConfig.Domain
//
// } else {
// // Defaults
// secure = false
// domain = ""
// }
//
// ctx.SetCookie(name, value, maxAge, path, domain, secure, httpOnly)
// }