mirror of https://github.com/Xhofe/alist
feat(session): Added session list functionality with usernames
- Added the `SessionWithUser` structure, which includes `Session` and `Username` fields. - Added the `ListSessionsWithUser` function, which queries and returns a list of sessions with usernames. - Used a `JOIN` operation to join the session and user tables to retrieve the username associated with each session. - Changed `ListSessions` to `ListSessionsWithUser` to ensure that the username is retrieved.pull/9315/head
parent
af2a115547
commit
3fc0859037
|
@ -1,11 +1,17 @@
|
||||||
package db
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/alist-org/alist/v3/internal/conf"
|
||||||
"github.com/alist-org/alist/v3/internal/model"
|
"github.com/alist-org/alist/v3/internal/model"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"gorm.io/gorm/clause"
|
"gorm.io/gorm/clause"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type SessionWithUser struct {
|
||||||
|
model.Session
|
||||||
|
Username string
|
||||||
|
}
|
||||||
|
|
||||||
func GetSession(userID uint, deviceKey string) (*model.Session, error) {
|
func GetSession(userID uint, deviceKey string) (*model.Session, error) {
|
||||||
s := model.Session{UserID: userID, DeviceKey: deviceKey}
|
s := model.Session{UserID: userID, DeviceKey: deviceKey}
|
||||||
if err := db.Select("user_id, device_key, last_active, status, user_agent, ip").Where(&s).First(&s).Error; err != nil {
|
if err := db.Select("user_id, device_key, last_active, status, user_agent, ip").Where(&s).First(&s).Error; err != nil {
|
||||||
|
@ -64,6 +70,19 @@ func ListSessions() ([]model.Session, error) {
|
||||||
return sessions, errors.WithStack(err)
|
return sessions, errors.WithStack(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ListSessionsWithUser() ([]SessionWithUser, error) {
|
||||||
|
var sessions []SessionWithUser
|
||||||
|
sessionTable := conf.Conf.Database.TablePrefix + "sessions"
|
||||||
|
userTable := conf.Conf.Database.TablePrefix + "users"
|
||||||
|
err := db.Table(sessionTable).
|
||||||
|
Select(sessionTable+".user_id, "+sessionTable+".device_key, "+sessionTable+".last_active, "+
|
||||||
|
sessionTable+".status, "+sessionTable+".user_agent, "+sessionTable+".ip, "+userTable+".username").
|
||||||
|
Joins("JOIN "+userTable+" ON "+sessionTable+".user_id = "+userTable+".id").
|
||||||
|
Where(sessionTable+".status = ?", model.SessionActive).
|
||||||
|
Scan(&sessions).Error
|
||||||
|
return sessions, errors.WithStack(err)
|
||||||
|
}
|
||||||
|
|
||||||
func MarkInactive(sessionID string) error {
|
func MarkInactive(sessionID string) error {
|
||||||
return errors.WithStack(db.Model(&model.Session{}).Where("device_key = ?", sessionID).Update("status", model.SessionInactive).Error)
|
return errors.WithStack(db.Model(&model.Session{}).Where("device_key = ?", sessionID).Update("status", model.SessionInactive).Error)
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
type SessionResp struct {
|
type SessionResp struct {
|
||||||
SessionID string `json:"session_id"`
|
SessionID string `json:"session_id"`
|
||||||
UserID uint `json:"user_id,omitempty"`
|
UserID uint `json:"user_id,omitempty"`
|
||||||
|
Username string `json:"username,omitempty"`
|
||||||
LastActive int64 `json:"last_active"`
|
LastActive int64 `json:"last_active"`
|
||||||
Status int `json:"status"`
|
Status int `json:"status"`
|
||||||
UA string `json:"ua"`
|
UA string `json:"ua"`
|
||||||
|
@ -64,7 +65,7 @@ func EvictMySession(c *gin.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ListSessions(c *gin.Context) {
|
func ListSessions(c *gin.Context) {
|
||||||
sessions, err := db.ListSessions()
|
sessions, err := db.ListSessionsWithUser()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
common.ErrorResp(c, err, 500)
|
common.ErrorResp(c, err, 500)
|
||||||
return
|
return
|
||||||
|
@ -74,6 +75,7 @@ func ListSessions(c *gin.Context) {
|
||||||
resp[i] = SessionResp{
|
resp[i] = SessionResp{
|
||||||
SessionID: s.DeviceKey,
|
SessionID: s.DeviceKey,
|
||||||
UserID: s.UserID,
|
UserID: s.UserID,
|
||||||
|
Username: s.Username,
|
||||||
LastActive: s.LastActive,
|
LastActive: s.LastActive,
|
||||||
Status: s.Status,
|
Status: s.Status,
|
||||||
UA: s.UserAgent,
|
UA: s.UserAgent,
|
||||||
|
|
Loading…
Reference in New Issue