diff options
| author | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-06-20 09:40:07 -0700 |
|---|---|---|
| committer | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-06-20 09:40:07 -0700 |
| commit | fb653292612eddca5b088ed88466c546d1597107 (patch) | |
| tree | 900ed32e066812688858ed3bb15128c41bb78054 /database/sessions.go | |
| download | penguins.lan-fb653292612eddca5b088ed88466c546d1597107.tar.gz penguins.lan-fb653292612eddca5b088ed88466c546d1597107.zip | |
Initial commit
Diffstat (limited to 'database/sessions.go')
| -rw-r--r-- | database/sessions.go | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/database/sessions.go b/database/sessions.go new file mode 100644 index 0000000..5644281 --- /dev/null +++ b/database/sessions.go @@ -0,0 +1,44 @@ +package database + +import ( + "database/sql" + "time" + + _ "github.com/mattn/go-sqlite3" +) + +type Session struct { + ID string + UserID string + ExpireAt time.Time +} + +func CreateSession(db *sql.DB, id, userID string, ttl time.Duration) (*Session, error) { + now := time.Now() + expire := now.Add(ttl) + _, err := db.Exec( + "INSERT INTO sessions (id, user_id, created_at, expire_at) VALUES (?, ?, ?, ?)", + id, userID, now, expire, + ) + if err != nil { + return nil, err + } + return &Session{ID: id, UserID: userID, ExpireAt: expire}, nil +} + +func GetSessionUser(db *sql.DB, id string) (*User, error) { + return scanUser(db.QueryRow( + "SELECT u.id, u.username, u.created_at, u.last_seen FROM users u JOIN sessions s ON s.user_id = u.id WHERE s.id = ? AND s.expire_at > ?", + id, time.Now(), + )) +} + +func DeleteExpiredSessions(db *sql.DB) error { + _, err := db.Exec("DELETE FROM sessions WHERE expire_at < ?", time.Now()) + return err +} + +func DeleteSession(db *sql.DB, id string) error { + _, err := db.Exec("DELETE FROM sessions WHERE id = ?", id) + return err +} |
