sessions/redis/redis.go

66 lines
1.4 KiB
Go
Raw Permalink Normal View History

2022-05-22 18:49:54 +02:00
package redis
import (
"context"
"errors"
"code.icod.de/gin-session/sessions"
"code.icod.de/gin-session/sessions/redisstore"
"github.com/go-redis/redis/v8"
)
type Store interface {
sessions.Store
}
// NewStore creates a new store with address="localhost:6379" and prefix="session:"
func NewStore(address string, prefix string) (Store, error) {
if address == "" {
address = "localhost:6379"
}
client := redis.NewClient(&redis.Options{
Addr: address,
})
s, err := redisstore.NewRedisStore(context.Background(), client)
if err != nil {
return nil, err
}
if prefix == "" {
prefix = "session:"
}
s.KeyPrefix(prefix)
return &store{s}, nil
}
type store struct {
*redisstore.RedisStore
}
// GetRedisStore get the actual woking store.
// Ref: https://godoc.org/github.com/boj/redistore#RediStore
func GetRedisStore(s Store) (err error, rediStore *redisstore.RedisStore) {
realStore, ok := s.(*store)
if !ok {
err = errors.New("unable to get the redis store: Store isn't *store")
return
}
rediStore = realStore.RedisStore
return
}
// SetKeyPrefix sets the key prefix in the redis database.
func SetKeyPrefix(s Store, prefix string) error {
err, rediStore := GetRedisStore(s)
if err != nil {
return err
}
rediStore.KeyPrefix(prefix)
return nil
}
func (c *store) Options(options sessions.Options) {
c.RedisStore.Options = *options.ToGorillaOptions()
}