package session import ( "context" "net/http" "time" "github.com/alexedwards/scs/pgxstore" "github.com/alexedwards/scs/v2" "github.com/jackc/pgx/v5/pgxpool" ) type ISession 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(pool *pgxpool.Pool, prod bool) ISession { 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 = prod // postgres // github.com/alexedwards/scs/postgresstore // sessionManager.Store = postgresstore.New(db) // 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) }