From 3fc0859037a3bb58a6c8bb4742ac142949ed9281 Mon Sep 17 00:00:00 2001 From: okatu-loli Date: Tue, 9 Sep 2025 22:26:40 +0800 Subject: [PATCH] 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. --- internal/db/session.go | 19 +++++++++++++++++++ server/handles/session.go | 4 +++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/internal/db/session.go b/internal/db/session.go index 757809ba..93c085f1 100644 --- a/internal/db/session.go +++ b/internal/db/session.go @@ -1,11 +1,17 @@ package db import ( + "github.com/alist-org/alist/v3/internal/conf" "github.com/alist-org/alist/v3/internal/model" "github.com/pkg/errors" "gorm.io/gorm/clause" ) +type SessionWithUser struct { + model.Session + Username string +} + func GetSession(userID uint, deviceKey string) (*model.Session, error) { 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 { @@ -64,6 +70,19 @@ func ListSessions() ([]model.Session, error) { 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 { return errors.WithStack(db.Model(&model.Session{}).Where("device_key = ?", sessionID).Update("status", model.SessionInactive).Error) } diff --git a/server/handles/session.go b/server/handles/session.go index 6f905de4..7dfab3f6 100644 --- a/server/handles/session.go +++ b/server/handles/session.go @@ -10,6 +10,7 @@ import ( type SessionResp struct { SessionID string `json:"session_id"` UserID uint `json:"user_id,omitempty"` + Username string `json:"username,omitempty"` LastActive int64 `json:"last_active"` Status int `json:"status"` UA string `json:"ua"` @@ -64,7 +65,7 @@ func EvictMySession(c *gin.Context) { } func ListSessions(c *gin.Context) { - sessions, err := db.ListSessions() + sessions, err := db.ListSessionsWithUser() if err != nil { common.ErrorResp(c, err, 500) return @@ -74,6 +75,7 @@ func ListSessions(c *gin.Context) { resp[i] = SessionResp{ SessionID: s.DeviceKey, UserID: s.UserID, + Username: s.Username, LastActive: s.LastActive, Status: s.Status, UA: s.UserAgent,