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}