Raw
 1package storage
 2
 3import (
 4	"context"
 5	"database/sql"
 6	"errors"
 7	"fmt"
 8)
 9
10const googleSignInRead = `
11SELECT l.user_id, u.disabled, u.credentials_epoch
12FROM google_links l JOIN users u ON u.id = l.user_id
13WHERE l.google_sub = ?`
14
15type GoogleSignIn struct {
16	UserID           string
17	Disabled         bool
18	CredentialsEpoch int64
19}
20
21func (s *Store) LookupGoogleSignIn(ctx context.Context, googleSub string) (GoogleSignIn, error) {
22	const operation = "lookup google sign-in"
23	if err := s.checkOpen(operation); err != nil {
24		return GoogleSignIn{}, err
25	}
26	if err := requireValue("google subject", googleSub); err != nil {
27		return GoogleSignIn{}, invalid(operation, err)
28	}
29	var g GoogleSignIn
30	var disabled int
31	err := s.sql.QueryRowContext(ctx, googleSignInRead, googleSub).Scan(&g.UserID, &disabled, &g.CredentialsEpoch)
32	if errors.Is(err, sql.ErrNoRows) {
33		return GoogleSignIn{}, fmt.Errorf("%s: %w", operation, ErrNotFound)
34	}
35	if err != nil {
36		return GoogleSignIn{}, classify(operation, err)
37	}
38	g.Disabled = disabled != 0
39	return g, nil
40}