package redis import ( "context" "errors" "fwh-toolbox-server/cache" "fwh-toolbox-server/domain" "strconv" "time" "go.uber.org/zap" "golang.org/x/oauth2" ) var ( authCtx = context.Background() authKeyPrefix = "fwhtoolbox:session:" ) 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 := authKeyPrefix + 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(authCtx, key, fields); err != nil { zap.L().Error("HSet failed", zap.String("key", key), zap.Any("fields", fields), zap.String("err", err.Error())) return err } _, err := cache.ExpireAt(authCtx, key, exp) return err } func GetSession(sid string) (*SessionInfo, error) { key := authKeyPrefix + sid res, err := cache.HGetAll(authCtx, 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 := authKeyPrefix + sid return cache.Delete(authCtx, key) }