62 lines
1.9 KiB
Go
62 lines
1.9 KiB
Go
package db
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
)
|
|
|
|
func (db *DB) GetUserByID(ctx context.Context, id string) (*User, error) {
|
|
var u User
|
|
err := db.pool.QueryRow(ctx,
|
|
`SELECT id, email, name, avatar_url, created_at FROM users WHERE id = $1`,
|
|
id).Scan(&u.ID, &u.Email, &u.Name, &u.AvatarURL, &u.CreatedAt)
|
|
if err == pgx.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
return &u, err
|
|
}
|
|
|
|
func (db *DB) GetUserByEmail(ctx context.Context, email string) (*User, error) {
|
|
var u User
|
|
err := db.pool.QueryRow(ctx,
|
|
`SELECT id, email, name, avatar_url, created_at FROM users WHERE email = $1`,
|
|
email).Scan(&u.ID, &u.Email, &u.Name, &u.AvatarURL, &u.CreatedAt)
|
|
if err == pgx.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
return &u, err
|
|
}
|
|
|
|
func (db *DB) GetUserByIdentity(ctx context.Context, provider, providerID string) (*User, error) {
|
|
var u User
|
|
err := db.pool.QueryRow(ctx,
|
|
`SELECT u.id, u.email, u.name, u.avatar_url, u.created_at
|
|
FROM users u
|
|
JOIN user_identities i ON i.user_id = u.id
|
|
WHERE i.provider = $1 AND i.provider_id = $2`,
|
|
provider, providerID).Scan(&u.ID, &u.Email, &u.Name, &u.AvatarURL, &u.CreatedAt)
|
|
if err == pgx.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
return &u, err
|
|
}
|
|
|
|
func (db *DB) CreateUser(ctx context.Context, email, name, avatarURL string) (*User, error) {
|
|
var u User
|
|
err := db.pool.QueryRow(ctx,
|
|
`INSERT INTO users (email, name, avatar_url)
|
|
VALUES ($1, $2, $3)
|
|
RETURNING id, email, name, avatar_url, created_at`,
|
|
email, name, avatarURL).Scan(&u.ID, &u.Email, &u.Name, &u.AvatarURL, &u.CreatedAt)
|
|
return &u, err
|
|
}
|
|
|
|
func (db *DB) AddUserIdentity(ctx context.Context, userID, provider, providerID, providerEmail string) error {
|
|
_, err := db.pool.Exec(ctx,
|
|
`INSERT INTO user_identities (user_id, provider, provider_id, provider_email)
|
|
VALUES ($1, $2, $3, $4)
|
|
ON CONFLICT (provider, provider_id) DO NOTHING`,
|
|
userID, provider, providerID, providerEmail)
|
|
return err
|
|
}
|