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 }