summaryrefslogtreecommitdiff
path: root/database/sessions.go
diff options
context:
space:
mode:
authorElizabeth Alexander Hunt <me@liz.coffee>2026-06-20 09:40:07 -0700
committerElizabeth Alexander Hunt <me@liz.coffee>2026-06-20 09:40:07 -0700
commitfb653292612eddca5b088ed88466c546d1597107 (patch)
tree900ed32e066812688858ed3bb15128c41bb78054 /database/sessions.go
downloadpenguins.lan-fb653292612eddca5b088ed88466c546d1597107.tar.gz
penguins.lan-fb653292612eddca5b088ed88466c546d1597107.zip
Initial commit
Diffstat (limited to 'database/sessions.go')
-rw-r--r--database/sessions.go44
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
+}