85 lines
1.6 KiB
Go
85 lines
1.6 KiB
Go
package sessions
|
|
|
|
import (
|
|
"intent-system/pkg/itypes"
|
|
"intent-system/pkg/middleware"
|
|
"intent-system/pkg/storage"
|
|
"sync"
|
|
|
|
"github.com/civet148/log"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
var locker sync.RWMutex
|
|
var contexts = make(map[string]*itypes.Context, 0)
|
|
|
|
func init() {
|
|
preloadContexts()
|
|
}
|
|
|
|
func NewContext(s *itypes.Session) *itypes.Context {
|
|
ctx := &itypes.Context{
|
|
Session: &itypes.Session{
|
|
UserId: s.UserId,
|
|
UserName: s.UserName,
|
|
Email: s.Email,
|
|
Alias: s.Alias,
|
|
PhoneNumber: s.PhoneNumber,
|
|
IsAdmin: s.IsAdmin,
|
|
LoginIP: s.LoginIP,
|
|
AuthToken: s.AuthToken,
|
|
LoginMode: s.LoginMode,
|
|
},
|
|
}
|
|
locker.Lock()
|
|
defer locker.Unlock()
|
|
contexts[s.AuthToken] = ctx
|
|
putLevelDB(ctx)
|
|
return ctx
|
|
}
|
|
|
|
func RemoveContext(c *gin.Context) *itypes.Context {
|
|
strToken := middleware.GetAuthToken(c)
|
|
locker.Lock()
|
|
defer locker.Unlock()
|
|
for k, v := range contexts {
|
|
if v.AuthToken() == strToken {
|
|
delete(contexts, k)
|
|
deleteLevelDB(k)
|
|
return v
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func GetContext(c *gin.Context) *itypes.Context {
|
|
strToken := middleware.GetAuthToken(c)
|
|
locker.RLock()
|
|
defer locker.RUnlock()
|
|
v, ok := contexts[strToken]
|
|
if ok && v != nil {
|
|
return v
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func putLevelDB(ctx *itypes.Context) {
|
|
if err := storage.Store.PutContext(ctx); err != nil {
|
|
log.Errorf("level db put error [%s]", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
func deleteLevelDB(strAuthToken string) {
|
|
storage.Store.DeleteContext(strAuthToken)
|
|
}
|
|
|
|
func preloadContexts() {
|
|
var err error
|
|
locker.Lock()
|
|
defer locker.Unlock()
|
|
if contexts, err = storage.Store.LoadContexts(); err != nil {
|
|
log.Errorf(err.Error())
|
|
}
|
|
}
|