diff --git a/server/memorystore/providers/redis/core.go b/server/memorystore/providers/redis/core.go new file mode 100644 index 0000000..82a0b88 --- /dev/null +++ b/server/memorystore/providers/redis/core.go @@ -0,0 +1,27 @@ +package redis + +import ( + "fmt" +) + +// GetUserProfile возвращает профиль пользователя в виде сырого JSON +func (c *provider) GetUserProfile(userId string) (string, error) { + key := fmt.Sprintf("user:%s:profile", userId) + profileJSON, err := c.store.Get(c.ctx, key).Result() + if err != nil { + return "", err + } + + return profileJSON, nil +} + +// GetUserFollows возвращает список подписок пользователя в виде сырого JSON +func (c *provider) GetUserFollows(userId string) (string, error) { + key := fmt.Sprintf("user:%s:follows", userId) + followsJSON, err := c.store.Get(c.ctx, key).Result() + if err != nil { + return "", err + } + + return followsJSON, nil +} diff --git a/server/resolvers/session.go b/server/resolvers/session.go index 964d1b5..be09b6d 100644 --- a/server/resolvers/session.go +++ b/server/resolvers/session.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "time" + "os" "github.com/google/uuid" log "github.com/sirupsen/logrus" @@ -14,6 +15,7 @@ import ( "github.com/authorizerdev/authorizer/server/db" "github.com/authorizerdev/authorizer/server/graph/model" "github.com/authorizerdev/authorizer/server/memorystore" + "github.com/authorizerdev/authorizer/server/memorystore/providers/redis" "github.com/authorizerdev/authorizer/server/token" "github.com/authorizerdev/authorizer/server/utils" ) @@ -102,6 +104,33 @@ func SessionResolver(ctx context.Context, params *model.SessionQueryInput) (*mod memorystore.Provider.SetUserSession(sessionKey, constants.TokenTypeSessionToken+"_"+authToken.FingerPrint, authToken.FingerPrintHash, authToken.SessionTokenExpiresAt) memorystore.Provider.SetUserSession(sessionKey, constants.TokenTypeAccessToken+"_"+authToken.FingerPrint, authToken.AccessToken.Token, authToken.AccessToken.ExpiresAt) + redisURL := os.Getenv(constants.EnvKeyRedisURL) + if redisURL != "" { + log.Info("Initializing Redis provider") + Provider, _ := redis.NewRedisProvider(redisURL) + if err != nil { + log.Debug("Failed to init Redis: ", err) + } + + if res.User.AppData == nil { + res.User.AppData = make(map[string]interface{}) + } + + follows, err := Provider.GetUserFollows(userID) + if err != nil { + log.Debug("Failed to get follows from Redis: ", err) + } else { + res.User.AppData["follows"] = follows + } + + author, err := Provider.GetUserProfile(userID) + if err != nil { + log.Debug("Failed to get author from Redis: ", err) + } else { + res.User.AppData["author"] = author + } + } + if authToken.RefreshToken != nil { res.RefreshToken = &authToken.RefreshToken.Token memorystore.Provider.SetUserSession(sessionKey, constants.TokenTypeRefreshToken+"_"+authToken.FingerPrint, authToken.RefreshToken.Token, authToken.RefreshToken.ExpiresAt)