feat: add google oauth
This commit is contained in:
parent
e6c7954a88
commit
488544dd5f
17 changed files with 685 additions and 21 deletions
|
@ -39,6 +39,9 @@ type User struct {
|
|||
Tumblr *string
|
||||
TumblrUsername *string
|
||||
|
||||
Google *string
|
||||
GoogleUsername *string
|
||||
|
||||
MaxInvites int
|
||||
IsAdmin bool
|
||||
ListPrivate bool
|
||||
|
@ -58,6 +61,9 @@ func (u User) NumProviders() (numProviders int) {
|
|||
if u.Tumblr != nil {
|
||||
numProviders++
|
||||
}
|
||||
if u.Google != nil {
|
||||
numProviders++
|
||||
}
|
||||
return numProviders
|
||||
}
|
||||
|
||||
|
@ -307,6 +313,67 @@ func (u *User) UnlinkTumblr(ctx context.Context, ex Execer) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// GoogleUser fetches a user by Google user ID.
|
||||
func (db *DB) GoogleUser(ctx context.Context, googleID string) (u User, err error) {
|
||||
sql, args, err := sq.Select("*", "(SELECT instance FROM fediverse_apps WHERE id = users.fediverse_app_id) AS fediverse_instance").
|
||||
From("users").Where("google = ?", googleID).ToSql()
|
||||
if err != nil {
|
||||
return u, errors.Wrap(err, "building sql")
|
||||
}
|
||||
|
||||
err = pgxscan.Get(ctx, db, &u, sql, args...)
|
||||
if err != nil {
|
||||
if errors.Cause(err) == pgx.ErrNoRows {
|
||||
return u, ErrUserNotFound
|
||||
}
|
||||
|
||||
return u, errors.Wrap(err, "executing query")
|
||||
}
|
||||
return u, nil
|
||||
}
|
||||
|
||||
func (u *User) UpdateFromGoogle(ctx context.Context, ex Execer, googleID, googleUsername string) error {
|
||||
sql, args, err := sq.Update("users").
|
||||
Set("google", googleID).
|
||||
Set("google_username", googleUsername).
|
||||
Where("id = ?", u.ID).
|
||||
ToSql()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "building sql")
|
||||
}
|
||||
|
||||
_, err = ex.Exec(ctx, sql, args...)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "executing query")
|
||||
}
|
||||
|
||||
u.Google = &googleID
|
||||
u.GoogleUsername = &googleUsername
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (u *User) UnlinkGoogle(ctx context.Context, ex Execer) error {
|
||||
sql, args, err := sq.Update("users").
|
||||
Set("google", nil).
|
||||
Set("google_username", nil).
|
||||
Where("id = ?", u.ID).
|
||||
ToSql()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "building sql")
|
||||
}
|
||||
|
||||
_, err = ex.Exec(ctx, sql, args...)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "executing query")
|
||||
}
|
||||
|
||||
u.Google = nil
|
||||
u.GoogleUsername = nil
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// User gets a user by ID.
|
||||
func (db *DB) User(ctx context.Context, id xid.ID) (u User, err error) {
|
||||
sql, args, err := sq.Select("*", "(SELECT instance FROM fediverse_apps WHERE id = users.fediverse_app_id) AS fediverse_instance").
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue