/
user.go
76 lines (64 loc) · 1.43 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
package repository
import (
"github.com/flaiers/flallet/internal/entity"
"github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"gorm.io/gorm"
)
type UserRepository struct {
db *gorm.DB
}
func NewUserRepository(db *gorm.DB) *UserRepository {
return &UserRepository{
db: db,
}
}
func (r *UserRepository) Transaction(
fn func(*gorm.DB) error, tx ...*gorm.DB,
) error {
return r.txDefault(tx...).Transaction(fn)
}
func (r *UserRepository) txDefault(tx ...*gorm.DB) *gorm.DB {
if len(tx) < 1 {
return r.db
}
return tx[0]
}
func (r *UserRepository) FindOneOrCreate(
userID uuid.UUID, tx ...*gorm.DB,
) (*entity.User, error) {
user := &entity.User{}
err := r.txDefault(tx...).Where(entity.User{
ID: userID,
}).FirstOrCreate(user).Error
if err != nil {
return nil, err
}
return user, nil
}
func (r *UserRepository) AccrueUserBalance(
user *entity.User, amount uint, tx ...*gorm.DB,
) (*entity.User, error) {
user.Balance += amount
err := r.txDefault(tx...).Save(user).Error
if err != nil {
return nil, err
}
return user, nil
}
func (r *UserRepository) WithdrawUserBalance(
user *entity.User, amount uint, tx ...*gorm.DB,
) (*entity.User, error) {
if user.Balance < amount || user.Balance == 0 {
return nil, fiber.NewError(
fiber.StatusPaymentRequired,
"user balance is not enough",
)
}
user.Balance -= amount
err := r.txDefault(tx...).Save(user).Error
if err != nil {
return nil, err
}
return user, nil
}