Super cool package that uses struct tags to load the environment. Still need to clean up the function in the server/server.go file.
117 lines
4.0 KiB
Go
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)
|
|
// }
|