package session import ( "context" "net/http" "time" "management/internal/pkg/config" "github.com/alexedwards/scs/postgresstore" "github.com/alexedwards/scs/v2" "gorm.io/gorm" ) type Session interface { Destroy(ctx context.Context) error LoadAndSave(next http.Handler) http.Handler Put(ctx context.Context, key string, val any) GetBytes(ctx context.Context, key string) []byte Exists(ctx context.Context, key string) bool RenewToken(ctx context.Context) error } type session struct { sessionManager *scs.SessionManager } func New(db *gorm.DB, config *config.Config) Session { sessionManager := scs.New() sessionManager.Lifetime = 24 * time.Hour sessionManager.IdleTimeout = 2 * time.Hour sessionManager.Cookie.Name = "token" sessionManager.Cookie.HttpOnly = true sessionManager.Cookie.Persist = true sessionManager.Cookie.SameSite = http.SameSiteStrictMode sessionManager.Cookie.Secure = config.App.Prod sqlDB, _ := db.DB() // postgres // github.com/alexedwards/scs/postgresstore sessionManager.Store = postgresstore.New(sqlDB) // pgx // github.com/alexedwards/scs/pgxstore // sessionManager.Store = pgxstore.New(pool) // redis // sessionManager.Store = newRedisStore() return &session{ sessionManager: sessionManager, } } func (s *session) Destroy(ctx context.Context) error { return s.sessionManager.Destroy(ctx) } func (s *session) LoadAndSave(next http.Handler) http.Handler { return s.sessionManager.LoadAndSave(next) } func (s *session) Put(ctx context.Context, key string, val any) { s.sessionManager.Put(ctx, key, val) } func (s *session) GetBytes(ctx context.Context, key string) []byte { return s.sessionManager.GetBytes(ctx, key) } func (s *session) Exists(ctx context.Context, key string) bool { return s.sessionManager.Exists(ctx, key) } func (s *session) RenewToken(ctx context.Context) error { return s.sessionManager.RenewToken(ctx) }