diff --git a/pkg/internal/auth/userinfo.go b/pkg/internal/auth/userinfo.go index 46763eb..c93c2ac 100644 --- a/pkg/internal/auth/userinfo.go +++ b/pkg/internal/auth/userinfo.go @@ -6,8 +6,10 @@ import ( "strconv" "time" + "git.solsynth.dev/hypernet/nexus/pkg/internal/cache" "git.solsynth.dev/hypernet/nexus/pkg/internal/directory" "git.solsynth.dev/hypernet/nexus/pkg/nex" + "git.solsynth.dev/hypernet/nexus/pkg/nex/cachekit" "git.solsynth.dev/hypernet/nexus/pkg/nex/sec" "git.solsynth.dev/hypernet/nexus/pkg/proto" "github.com/gofiber/fiber/v2" @@ -20,6 +22,19 @@ func userinfoFetch(c *fiber.Ctx) error { return fiber.NewError(fiber.StatusUnauthorized, "user principal data was not found") } + if val, err := cachekit.Get[sec.UserInfo]( + cache.Kcc, + cachekit.FKey(cachekit.DAUserInfoPrefix, claims.Session), + ); err == nil { + c.Locals("nex_user", &val) + tk, err := IWriter.WriteUserInfoJwt(val) + if err != nil { + return fiber.NewError(fiber.StatusInternalServerError, fmt.Sprintf("unable to sign userinfo: %v", err)) + } + c.Locals("nex_token", tk) + return nil + } + service := directory.GetServiceInstanceByType(nex.ServiceTypeAuth) if service != nil { conn, err := service.GetGrpcConn() diff --git a/pkg/internal/cache/redis.go b/pkg/internal/cache/redis.go index ee3283d..120703c 100644 --- a/pkg/internal/cache/redis.go +++ b/pkg/internal/cache/redis.go @@ -1,8 +1,16 @@ package cache -import "github.com/redis/go-redis/v9" +import ( + "time" -var Rdb *redis.Client + "git.solsynth.dev/hypernet/nexus/pkg/nex/cachekit" + "github.com/redis/go-redis/v9" +) + +var ( + Rdb *redis.Client + Kcc *cachekit.Conn +) func ConnectRedis(addr, password string, db int) error { Rdb = redis.NewClient(&redis.Options{ @@ -10,5 +18,9 @@ func ConnectRedis(addr, password string, db int) error { Password: password, DB: db, }) + Kcc = &cachekit.Conn{ + Rd: Rdb, + Timeout: 3 * time.Second, + } return nil } diff --git a/pkg/nex/cachekit/direct_const.go b/pkg/nex/cachekit/direct_const.go new file mode 100644 index 0000000..3702472 --- /dev/null +++ b/pkg/nex/cachekit/direct_const.go @@ -0,0 +1,13 @@ +package cachekit + +import "fmt" + +// Those constants are used to directly get the cached data from redis +// Formatted like {prefix}#{key} +const ( + DAUserInfoPrefix = "userinfo" +) + +func FKey(prefix string, key any) string { + return fmt.Sprintf("%s#%v", prefix, key) +}