-
Notifications
You must be signed in to change notification settings - Fork 0
/
user.go
77 lines (69 loc) · 2.16 KB
/
user.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package sqlite
import (
"context"
"database/sql"
"encoding/base64"
"errors"
"fmt"
"github.com/jmoiron/sqlx"
"github.com/mattn/go-sqlite3"
"github.com/xopoww/wishes/internal/models"
"github.com/xopoww/wishes/internal/service"
)
func (r *handle) CheckUsername(ctx context.Context, username string) (id int64, err error) {
err = sqlx.GetContext(ctx, r.tracer(), &id, `SELECT id FROM Users WHERE user_name = $1`, username)
if errors.Is(err, sql.ErrNoRows) {
err = service.ErrNotFound
}
return id, err
}
func (r *handle) GetUser(ctx context.Context, id int64) (*models.User, error) {
row := r.tracer().QueryRowxContext(ctx, `SELECT user_name, fname, lname, pwd_hash FROM Users WHERE id = $1`, id)
user := &models.User{ID: id}
var b64 string
err := row.Scan(&user.Name, &user.Fname, &user.Lname, &b64)
if errors.Is(err, sql.ErrNoRows) {
err = fmt.Errorf("user_id %d: %w", id, service.ErrNotFound)
}
if err != nil {
return nil, err
}
user.PassHash, err = base64.RawStdEncoding.DecodeString(b64)
if err != nil {
return nil, fmt.Errorf("base64: %w", err)
}
return user, nil
}
func (r *handle) AddUser(ctx context.Context, user *models.User) (*models.User, error) {
b64 := base64.RawStdEncoding.EncodeToString(user.PassHash)
res, err := r.tracer().ExecContext(ctx, `INSERT INTO Users (user_name, pwd_hash) VALUES ($1, $2)`, user.Name, b64)
var serr sqlite3.Error
if errors.As(err, &serr) && serr.ExtendedCode == sqlite3.ErrConstraintUnique {
err = fmt.Errorf("user_name %q: %w", user.Name, service.ErrConflict)
}
if err != nil {
return nil, fmt.Errorf("insert: %w", err)
}
user.ID, err = res.LastInsertId()
if err != nil {
return nil, fmt.Errorf("last insert id: %w", err)
}
return user, nil
}
func (r *handle) EditUser(ctx context.Context, user *models.User) error {
res, err := r.tracer().ExecContext(ctx,
`UPDATE Users SET fname = $1, lname = $2 WHERE id = $3`,
user.Fname, user.Lname, user.ID,
)
if err != nil {
return fmt.Errorf("update: %w", err)
}
ra, err := res.RowsAffected()
if err != nil {
return fmt.Errorf("rows affected: %w", err)
}
if ra == 0 {
return fmt.Errorf("user_id %d: %w", user.ID, service.ErrNotFound)
}
return nil
}