package store import ( "context" "time" "atlas9.dev/c/core" "atlas9.dev/c/core/dbi" "atlas9.dev/c/core/iam" ) type SqliteSessionStore struct { db dbi.DBI } var _ iam.SessionStore = (*SqliteSessionStore)(nil) func NewSqliteSessionStore(db dbi.DBI) *SqliteSessionStore { return &SqliteSessionStore{db: db} } func (s *SqliteSessionStore) Get(ctx context.Context, token string, out *iam.Session) error { var expUnix int64 row := s.db.QueryRow(ctx, `SELECT token, principal, expiration FROM sessions WHERE token = $1`, token) if err := row.Scan(&out.Token, &out.Principal, &expUnix); err != nil { return dbi.TranslateNotFound(err, core.ErrNotFound) } out.Expiration = time.Unix(expUnix, 0).UTC() return nil } func (s *SqliteSessionStore) Save(ctx context.Context, sess *iam.Session) error { _, err := s.db.Exec(ctx, ` INSERT INTO sessions (token, principal, expiration) VALUES ($1, $2, $3) ON CONFLICT (token) DO UPDATE SET principal = $2, expiration = $3 `, sess.Token, sess.Principal, sess.Expiration.Unix()) return err } func (s *SqliteSessionStore) Delete(ctx context.Context, token string) error { _, err := s.db.Exec(ctx, `DELETE FROM sessions WHERE token = $1`, token) return err }