package store import ( "context" "atlas9.dev/c/core" "atlas9.dev/c/core/dbi" "atlas9.dev/c/core/iam" ) type SqliteOAuthStore struct { db dbi.DBI } var _ iam.OAuthStore = (*SqliteOAuthStore)(nil) func NewSqliteOAuthStore(db dbi.DBI) *SqliteOAuthStore { return &SqliteOAuthStore{db: db} } // TODO caps func (s *SqliteOAuthStore) AddProvider(ctx context.Context, userID core.ID, provider, providerID string) error { // TODO guard // TODO it's possible to insert an empty user ID. bah. so much for sql data integrity. _, err := s.db.Exec(ctx, ` INSERT INTO oauth_providers (user_id, provider, provider_id) VALUES ($1, $2, $3) ON CONFLICT (provider, provider_id) DO NOTHING `, userID, provider, providerID) return err } func (s *SqliteOAuthStore) GetUserByProvider(ctx context.Context, provider, providerID string, out *iam.User) error { err := dbi.Get(ctx, s.db, out, ` SELECT u.id, u.email FROM users u JOIN oauth_providers op ON u.id = op.user_id WHERE op.provider = $1 AND op.provider_id = $2 `, provider, providerID) return err }