Files

57 lines
1.3 KiB
Go

package sqlite
import (
"fmt"
"time"
"lunar-tear/server/internal/store"
)
func (s *SQLiteStore) CreateSession(uuid string, ttl time.Duration) (store.SessionState, error) {
var userId int64
err := s.db.QueryRow(`SELECT user_id FROM users WHERE uuid = ?`, uuid).Scan(&userId)
if err != nil {
return store.SessionState{}, store.ErrNotFound
}
now := s.clock()
sessionKey := fmt.Sprintf("session_%d_%d", userId, now.UnixNano())
expireAt := now.Add(ttl)
_, err = s.db.Exec(
`INSERT INTO sessions (session_key, user_id, uuid, expire_at) VALUES (?, ?, ?, ?)`,
sessionKey, userId, uuid, expireAt.Format(time.RFC3339Nano),
)
if err != nil {
return store.SessionState{}, fmt.Errorf("insert session: %w", err)
}
return store.SessionState{
SessionKey: sessionKey,
UserId: userId,
Uuid: uuid,
ExpireAt: expireAt,
}, nil
}
func (s *SQLiteStore) ResolveUserId(sessionKey string) (int64, error) {
var userId int64
var expireStr string
err := s.db.QueryRow(
`SELECT user_id, expire_at FROM sessions WHERE session_key = ?`, sessionKey,
).Scan(&userId, &expireStr)
if err != nil {
return 0, store.ErrNotFound
}
expireAt, err := time.Parse(time.RFC3339Nano, expireStr)
if err != nil {
return 0, store.ErrNotFound
}
if s.clock().After(expireAt) {
return 0, store.ErrNotFound
}
return userId, nil
}