You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

57 lines
1.3 KiB

package db
import (
"context"
"database/sql"
"time"
_ "github.com/tursodatabase/libsql-client-go/libsql"
)
type User struct {
ID string
GitHubID int64
GitHubLogin string
AvatarURL string
Email string
CreatedAt time.Time
UpdatedAt time.Time
}
type UserClient struct {
db *sql.DB
}
func NewUserClient(db *sql.DB) *UserClient {
return &UserClient{db: db}
}
func (uc *UserClient) UpsertUser(ctx context.Context, user User) error {
_, err := uc.db.ExecContext(ctx, `
INSERT INTO users (id, github_id, github_login, avatar_url, email)
VALUES (?, ?, ?, ?, ?)
ON CONFLICT(github_id) DO UPDATE SET
github_login = excluded.github_login,
avatar_url = excluded.avatar_url,
email = excluded.email,
updated_at = CURRENT_TIMESTAMP
`, user.ID, user.GitHubID, user.GitHubLogin, user.AvatarURL, user.Email)
return err
}
func (uc *UserClient) GetUserByGitHubID(ctx context.Context, githubID int64) (*User, error) {
row := uc.db.QueryRowContext(ctx, `
SELECT id, github_id, github_login, avatar_url, email, created_at, updated_at
FROM users WHERE github_id = ?
`, githubID)
var user User
err := row.Scan(
&user.ID, &user.GitHubID, &user.GitHubLogin,
&user.AvatarURL, &user.Email, &user.CreatedAt, &user.UpdatedAt,
)
if err == sql.ErrNoRows {
return nil, nil
}
return &user, err
}