parse env variable in dedicated struct

This commit is contained in:
rmanach
2025-01-03 10:06:54 +01:00
parent 0d48db8b94
commit f712242e39
4 changed files with 69 additions and 36 deletions
+63
View File
@@ -0,0 +1,63 @@
package services
import (
"os"
"strconv"
"sync"
"time"
"github.com/rs/zerolog/log"
)
const defaultAPISessionExpirationDuration = 30 * time.Second
const defaultPort = 8585
var GetEnv = sync.OnceValue[env](newEnv)
type env struct {
adminUsername string
adminPassword string
sessionExpirationDuration time.Duration
port int
isSecure bool
}
func (e env) GetCredentials() (username, password string) {
return e.adminUsername, e.adminPassword
}
func (e env) GetSessionExpirationDuration() time.Duration {
return e.sessionExpirationDuration
}
func (e env) GetPort() int {
return e.port
}
func (e env) IsSecure() bool {
return e.isSecure
}
func newEnv() env {
env := env{
adminUsername: os.Getenv("API_ADMIN_USERNAME"),
adminPassword: os.Getenv("API_ADMIN_PASSWORD"),
isSecure: os.Getenv("API_SECURE") == "true",
}
sessionExpirationDuration, err := strconv.Atoi(os.Getenv("API_SESSION_EXPIRATION_DURATION"))
env.sessionExpirationDuration = time.Duration(sessionExpirationDuration)
if err != nil {
log.Warn().Err(err).Dur("default", defaultAPISessionExpirationDuration).Msg("unable to load API_SESSION_EXPIRATION_DURATION, set to default")
env.sessionExpirationDuration = defaultAPISessionExpirationDuration
}
port, err := strconv.Atoi(os.Getenv("API_PORT"))
env.port = port
if err != nil {
log.Warn().Err(err).Int("default", defaultPort).Msg("unable to load API_PORT, set to default")
env.port = defaultPort
}
return env
}
+2 -19
View File
@@ -6,29 +6,12 @@ import (
"encoding/hex"
"errors"
"net/http"
"os"
"strconv"
"sync"
"time"
"github.com/rs/zerolog/log"
)
const defaultAPISessionExpirationDuration = 30 * time.Second
var APISessionExpirationDuration = sync.OnceValue[time.Duration](func() time.Duration {
expirationDuration, err := strconv.Atoi(os.Getenv("API_SESSION_EXPIRATION_DURATION"))
if err != nil {
log.Debug().Err(err).Msg("unable to load API_SESSION_EXPIRATION_DURATION")
return defaultAPISessionExpirationDuration
}
return time.Duration(expirationDuration * int(time.Second))
})
var APISecure = sync.OnceValue[bool](func() bool {
return os.Getenv("API_SECURE") == "true"
})
var (
ErrSessionIDCollision = errors.New("sessionId collision")
ErrUnauthorized = errors.New("unauthorized")
@@ -57,7 +40,7 @@ func (s *Session) GenerateCookie() *http.Cookie {
Name: "session_id",
Value: s.sessionID,
HttpOnly: true,
Secure: APISecure(),
Secure: GetEnv().isSecure,
Expires: s.expirationTime,
}
}
@@ -141,7 +124,7 @@ func (s *SessionStore) NewSession() (*Session, error) {
return nil, ErrSessionIDCollision
}
now := time.Now().Add(APISessionExpirationDuration())
now := time.Now().Add(GetEnv().GetSessionExpirationDuration())
session := Session{expirationTime: now, sessionID: sessionID}
s.sessions[sessionID] = &session