package main import ( "context" "database/sql" "time" "atlas9.dev/c/iam/oidc_provider" ) type SqliteStateStore struct { db *sql.DB } var _ oidc_provider.StateStore = (*SqliteStateStore)(nil) func NewSqliteStateStore(db *sql.DB) *SqliteStateStore { return &SqliteStateStore{db: db} } func (s *SqliteStateStore) Set(key, value string, expiration time.Duration) error { expiresAt := time.Now().UTC().Add(expiration).Format("2006-01-02 15:04:05") _, err := s.db.ExecContext(context.Background(), ` INSERT INTO oauth_state (key, value, expires_at) VALUES ($1, $2, $3) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value, expires_at = EXCLUDED.expires_at `, key, value, expiresAt) return err } func (s *SqliteStateStore) GetAndDelete(key string) (string, error) { var value string err := s.db.QueryRowContext(context.Background(), ` DELETE FROM oauth_state WHERE key = $1 AND expires_at > datetime('now') RETURNING value `, key).Scan(&value) if err != nil { return "", nil } return value, nil }