From f113ae6cbaf741f9531f1440e432ffd9139fe2cf Mon Sep 17 00:00:00 2001
From: LittleSheep <littlesheep.code@hotmail.com>
Date: Sat, 29 Mar 2025 15:21:30 +0800
Subject: [PATCH] =?UTF-8?q?:sparkles:=20User=20info=20DirectAccess?=
 =?UTF-8?q?=E2=84=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/internal/auth/userinfo.go    | 15 +++++++++++++++
 pkg/internal/cache/redis.go      | 16 ++++++++++++++--
 pkg/nex/cachekit/direct_const.go | 13 +++++++++++++
 3 files changed, 42 insertions(+), 2 deletions(-)
 create mode 100644 pkg/nex/cachekit/direct_const.go

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)
+}