Co-Authored-By: Codex GPT-6-astra <noreply@openai.com> Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
38 lines
1.5 KiB
Go
38 lines
1.5 KiB
Go
package yeekeclient
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"go-admin/app/goauto/models"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/clause"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type SessionStore struct{ db *gorm.DB }
|
|
|
|
func NewSessionStore(db *gorm.DB) *SessionStore { return &SessionStore{db: db} }
|
|
func (s *SessionStore) Save(ctx context.Context, x Session) error {
|
|
if strings.TrimSpace(x.Username) == "" || x.Token == "" || x.ExpiresAt.IsZero() {
|
|
return errors.New("invalid yeeke session")
|
|
}
|
|
return s.db.WithContext(ctx).Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "username"}}, DoUpdates: clause.AssignmentColumns([]string{"token", "cookies_json", "user_id", "expires_at", "updated_at"})}).Create(&models.YeekeSession{Username: strings.TrimSpace(x.Username), Token: x.Token, CookiesJSON: x.CookiesJSON, UserID: x.UserID, ExpiresAt: x.ExpiresAt.UTC()}).Error
|
|
}
|
|
func (s *SessionStore) Load(ctx context.Context, user string, now time.Time) (Session, error) {
|
|
var r models.YeekeSession
|
|
if e := s.db.WithContext(ctx).Where("username = ?", strings.TrimSpace(user)).First(&r).Error; e != nil {
|
|
if errors.Is(e, gorm.ErrRecordNotFound) {
|
|
return Session{}, ErrNoSession
|
|
}
|
|
return Session{}, e
|
|
}
|
|
if !now.UTC().Before(r.ExpiresAt) {
|
|
return Session{}, ErrNoSession
|
|
}
|
|
return Session{Username: r.Username, Token: r.Token, CookiesJSON: r.CookiesJSON, UserID: r.UserID, ExpiresAt: r.ExpiresAt}, nil
|
|
}
|
|
func (s *SessionStore) Delete(ctx context.Context, user string) error {
|
|
return s.db.WithContext(ctx).Where("username = ?", strings.TrimSpace(user)).Delete(&models.YeekeSession{}).Error
|
|
}
|