package redis import ( "context" "errors" "fmt" "fwh-toolbox-server/cache" "fwh-toolbox-server/domain" "strconv" "time" "golang.org/x/oauth2" ) var ( ctx = context.Background() ) type SessionInfo struct { AccessToken string `json:"access_token"` RefreshToken string `json:"refresh_token"` AccessExp int64 `json:"access_exp"` } func StoreSession(sid string, token *oauth2.Token) error { key := fmt.Sprintf("session:%s", sid) exp := time.Now().Add(domain.SessionTTL) accessExp := time.Now().Add(time.Duration(token.ExpiresIn) * time.Second).Unix() fields := map[string]interface{}{ "refresh_token": token.RefreshToken, "access_token": token.AccessToken, "access_exp": accessExp, } if err := cache.HSet(ctx, key, fields); err != nil { return err } _, err := cache.ExpireAt(ctx, key, exp) return err } func GetSession(sid string) (*SessionInfo, error) { key := fmt.Sprintf("session:%s", sid) res, err := cache.HGetAll(ctx, key) if err != nil { return nil, err } if len(res) == 0 { return nil, errors.New("no session") } accessToken := res["access_token"] refreshToken := res["refresh_token"] accessExpStr := res["access_exp"] var accessExp int64 if accessExpStr != "" { accessExp, err = strconv.ParseInt(accessExpStr, 10, 64) if err != nil { return nil, err } } return &SessionInfo{ AccessToken: accessToken, RefreshToken: refreshToken, AccessExp: accessExp, }, nil } func DeleteSession(sid string) error { key := fmt.Sprintf("session:%s", sid) return cache.Delete(ctx, key) }