Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/db/session.go
1560 views
1
package db
2
3
import (
4
"github.com/alist-org/alist/v3/internal/model"
5
"github.com/pkg/errors"
6
"gorm.io/gorm/clause"
7
)
8
9
func GetSession(userID uint, deviceKey string) (*model.Session, error) {
10
s := model.Session{UserID: userID, DeviceKey: deviceKey}
11
if err := db.Select("user_id, device_key, last_active, status, user_agent, ip").Where(&s).First(&s).Error; err != nil {
12
return nil, errors.Wrap(err, "failed find session")
13
}
14
return &s, nil
15
}
16
17
func CreateSession(s *model.Session) error {
18
return errors.WithStack(db.Create(s).Error)
19
}
20
21
func UpsertSession(s *model.Session) error {
22
return errors.WithStack(db.Clauses(clause.OnConflict{UpdateAll: true}).Create(s).Error)
23
}
24
25
func DeleteSession(userID uint, deviceKey string) error {
26
return errors.WithStack(db.Where("user_id = ? AND device_key = ?", userID, deviceKey).Delete(&model.Session{}).Error)
27
}
28
29
func CountActiveSessionsByUser(userID uint) (int64, error) {
30
var count int64
31
err := db.Model(&model.Session{}).
32
Where("user_id = ? AND status = ?", userID, model.SessionActive).
33
Count(&count).Error
34
return count, errors.WithStack(err)
35
}
36
37
func DeleteSessionsBefore(ts int64) error {
38
return errors.WithStack(db.Where("last_active < ?", ts).Delete(&model.Session{}).Error)
39
}
40
41
// GetOldestActiveSession returns the oldest active session for the specified user.
42
func GetOldestActiveSession(userID uint) (*model.Session, error) {
43
var s model.Session
44
if err := db.Where("user_id = ? AND status = ?", userID, model.SessionActive).
45
Order("last_active ASC").First(&s).Error; err != nil {
46
return nil, errors.Wrap(err, "failed get oldest active session")
47
}
48
return &s, nil
49
}
50
51
func UpdateSessionLastActive(userID uint, deviceKey string, lastActive int64) error {
52
return errors.WithStack(db.Model(&model.Session{}).Where("user_id = ? AND device_key = ?", userID, deviceKey).Update("last_active", lastActive).Error)
53
}
54
55
func ListSessionsByUser(userID uint) ([]model.Session, error) {
56
var sessions []model.Session
57
err := db.Select("user_id, device_key, last_active, status, user_agent, ip").Where("user_id = ? AND status = ?", userID, model.SessionActive).Find(&sessions).Error
58
return sessions, errors.WithStack(err)
59
}
60
61
func ListSessions() ([]model.Session, error) {
62
var sessions []model.Session
63
err := db.Select("user_id, device_key, last_active, status, user_agent, ip").Where("status = ?", model.SessionActive).Find(&sessions).Error
64
return sessions, errors.WithStack(err)
65
}
66
67
func MarkInactive(sessionID string) error {
68
return errors.WithStack(db.Model(&model.Session{}).Where("device_key = ?", sessionID).Update("status", model.SessionInactive).Error)
69
}
70
71