package session import ( "time" "github.com/gin-contrib/sessions" "edge-infra.dev/pkg/edge/auth-proxy/types" "edge-infra.dev/pkg/lib/uuid" ) const ( // DefaultDuration Duration a session should be active. DefaultDuration = 15 * time.Minute ) // Provider represents a session provider. type Provider struct { session sessions.Session sessionDuration time.Duration correlationID string } // UserInstance represents a session user instance. type UserInstance struct { username string email string token string refreshToken string authType AuthProvider roles []string organization string bannerEdgeIDs []string } // New returns a new session provider. func New(session sessions.Session, sessionDuration time.Duration, correlationID string) *Provider { if sessionDuration == 0 { sessionDuration = DefaultDuration } return &Provider{session: session, sessionDuration: sessionDuration, correlationID: correlationID} } // CreateUserSession saves a new user session. func (s *Provider) CreateUserSession(usr *UserInstance) error { s.session.Set(types.SessionIDField, uuid.New().UUID) s.session.Set(types.SessionUsernameField, usr.username) s.session.Set(types.SessionEmailField, usr.email) s.session.Set(types.SessionTokenField, usr.token) s.session.Set(types.SessionRefreshTokenField, usr.refreshToken) s.session.Set(types.SessionAuthTypeField, usr.authType.String()) s.session.Set(types.SessionRolesField, usr.roles) s.session.Set(types.SessionOrganizationField, usr.organization) s.session.Set(types.SessionBannerEdgeIDs, usr.bannerEdgeIDs) createdAt := time.Now().UTC() s.session.Set(types.SessionCreationField, createdAt) s.session.Set(types.SessionExpirationField, createdAt.Add(s.sessionDuration)) s.session.Set(types.SessionCorrelationID, s.correlationID) return s.session.Save() }