Commit 7dc2dcec authored by Eric's avatar Eric

[Update] Cached user assets when user login

parent c66d86aa
...@@ -20,13 +20,32 @@ import ( ...@@ -20,13 +20,32 @@ import (
"cocogo/pkg/utils" "cocogo/pkg/utils"
) )
type assetsCacheContainer struct {
mapData map[string][]model.Asset
lock *sync.RWMutex
}
func (c *assetsCacheContainer) Get(key string) ([]model.Asset, bool) {
c.lock.RLock()
defer c.lock.RUnlock()
value, ok := c.mapData[key]
return value, ok
}
func (c *assetsCacheContainer) SetValue(key string, value []model.Asset) {
c.lock.Lock()
defer c.lock.Unlock()
c.mapData[key] = value
}
var userAssetsCached = assetsCacheContainer{mapData: make(map[string][]model.Asset), lock: new(sync.RWMutex)}
func SessionHandler(sess ssh.Session) { func SessionHandler(sess ssh.Session) {
pty, _, ok := sess.Pty() pty, _, ok := sess.Pty()
if ok { if ok {
ctx, cancel := cctx.NewContext(sess) ctx, cancel := cctx.NewContext(sess)
defer cancel() defer cancel()
handler := newInteractiveHandler(sess, ctx.User()) handler := newInteractiveHandler(sess, ctx.User())
handler.termHeight, handler.termWidth = pty.Window.Height, pty.Window.Width
logger.Debugf("User Request pty: %s %s", sess.User(), pty.Term) logger.Debugf("User Request pty: %s %s", sess.User(), pty.Term)
handler.Dispatch(ctx) handler.Dispatch(ctx)
} else { } else {
...@@ -37,7 +56,13 @@ func SessionHandler(sess ssh.Session) { ...@@ -37,7 +56,13 @@ func SessionHandler(sess ssh.Session) {
func newInteractiveHandler(sess ssh.Session, user *model.User) *interactiveHandler { func newInteractiveHandler(sess ssh.Session, user *model.User) *interactiveHandler {
term := utils.NewTerminal(sess, "Opt> ") term := utils.NewTerminal(sess, "Opt> ")
handler := &interactiveHandler{sess: sess, user: user, term: term} handler := &interactiveHandler{
sess: sess,
user: user,
term: term,
mu: new(sync.RWMutex),
finishedLoaded: make(chan struct{}),
}
handler.Initial() handler.Initial()
return handler return handler
} }
...@@ -54,19 +79,33 @@ type interactiveHandler struct { ...@@ -54,19 +79,33 @@ type interactiveHandler struct {
searchResult model.AssetList searchResult model.AssetList
nodes model.NodeList nodes model.NodeList
mu *sync.RWMutex mu *sync.RWMutex
finishedLoaded chan struct{}
termWidth int
termHeight int
} }
func (h *interactiveHandler) Initial() { func (h *interactiveHandler) Initial() {
h.displayBanner() h.displayBanner()
h.loadUserAssets() h.loadAssetsFromCache()
h.loadUserAssetNodes() h.searchResult = make([]model.Asset, 0)
h.searchResult = h.assets[:0]
h.winWatchChan = make(chan bool) h.winWatchChan = make(chan bool)
} }
func (h *interactiveHandler) loadAssetsFromCache() {
if assets, ok := userAssetsCached.Get(h.user.ID); ok {
h.assets = assets
go h.firstLoadAssetAndNodes()
} else {
h.assets = make([]model.Asset, 0)
h.firstLoadAssetAndNodes()
}
}
func (h *interactiveHandler) firstLoadAssetAndNodes() {
h.loadUserAssets("1")
h.loadUserAssetNodes("1")
close(h.finishedLoaded)
logger.Debug("first Load Asset And Nodes done")
}
func (h *interactiveHandler) displayBanner() { func (h *interactiveHandler) displayBanner() {
displayBanner(h.sess, h.user.Name) displayBanner(h.sess, h.user.Name)
} }
...@@ -123,8 +162,11 @@ func (h *interactiveHandler) Dispatch(ctx cctx.Context) { ...@@ -123,8 +162,11 @@ func (h *interactiveHandler) Dispatch(ctx cctx.Context) {
case 0, 1: case 0, 1:
switch strings.ToLower(line) { switch strings.ToLower(line) {
case "", "p": case "", "p":
h.mu.RLock()
h.displayAssets(h.assets) h.displayAssets(h.assets)
h.mu.RUnlock()
case "g": case "g":
<-h.finishedLoaded
h.displayNodes(h.nodes) h.displayNodes(h.nodes)
case "h": case "h":
h.displayBanner() h.displayBanner()
...@@ -249,18 +291,24 @@ func (h *interactiveHandler) displayNodes(nodes []model.Node) { ...@@ -249,18 +291,24 @@ func (h *interactiveHandler) displayNodes(nodes []model.Node) {
} }
func (h *interactiveHandler) refreshAssetsAndNodesData() { func (h *interactiveHandler) refreshAssetsAndNodesData() {
h.loadUserAssets("2")
h.loadUserAssetNodes("2")
_, err := io.WriteString(h.sess, "Refresh done\r\n") _, err := io.WriteString(h.sess, "Refresh done\r\n")
if err != nil { if err != nil {
logger.Error("refresh Assets Nodes err:", err) logger.Error("refresh Assets Nodes err:", err)
} }
} }
func (h *interactiveHandler) loadUserAssets() { func (h *interactiveHandler) loadUserAssets(cachePolicy string) {
h.assets = service.GetUserAssets(h.user.ID, "1") assets := service.GetUserAssets(h.user.ID, cachePolicy)
userAssetsCached.SetValue(h.user.ID, assets)
h.mu.Lock()
h.assets = assets
h.mu.Unlock()
} }
func (h *interactiveHandler) loadUserAssetNodes() { func (h *interactiveHandler) loadUserAssetNodes(cachePolicy string) {
h.nodes = service.GetUserNodes(h.user.ID, "1") h.nodes = service.GetUserNodes(h.user.ID, cachePolicy)
} }
func (h *interactiveHandler) searchAsset(key string) (assets []model.Asset) { func (h *interactiveHandler) searchAsset(key string) (assets []model.Asset) {
...@@ -273,7 +321,9 @@ func (h *interactiveHandler) searchAsset(key string) (assets []model.Asset) { ...@@ -273,7 +321,9 @@ func (h *interactiveHandler) searchAsset(key string) (assets []model.Asset) {
var searchData []model.Asset var searchData []model.Asset
switch len(h.searchResult) { switch len(h.searchResult) {
case 0: case 0:
h.mu.RLock()
searchData = h.assets searchData = h.assets
h.mu.RUnlock()
default: default:
searchData = h.searchResult searchData = h.searchResult
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment