/
payment.go
127 lines (113 loc) · 4.02 KB
/
payment.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package models
import (
"errors"
"github.com/RTradeLtd/gorm"
)
// Payments is our payment model
type Payments struct {
gorm.Model
Number int64 `gorm:"type:integer"`
DepositAddress string `gorm:"type:varchar(255)"`
TxHash string `gorm:"type:varchar(255);unique"`
USDValue float64 `gorm:"type:float"` // USDValue is also a "Credit" value, since 1 USD -> 1 Credit
ChargeAmount float64 `gorm:"type:float"`
Blockchain string `gorm:"type:varchar(255)"`
Type string `gorm:"type:varchar(255)"` // ETH, RTC, XMR, BTC, LTC
UserName string `gorm:"type:varchar(255)"`
Confirmed bool `gorm:"type:varchar(255)"`
}
// PaymentManager is used to interact with payment information in our database
type PaymentManager struct {
DB *gorm.DB
}
// NewPaymentManager is used to generate our payment manager helper
func NewPaymentManager(db *gorm.DB) *PaymentManager {
return &PaymentManager{DB: db}
}
// FindPaymentByNumber is used to find a payment by its payment number
func (pm *PaymentManager) FindPaymentByNumber(username string, number int64) (*Payments, error) {
p := Payments{}
if check := pm.DB.Where("user_name = ? AND number = ?", username, number).First(&p); check.Error != nil {
return nil, check.Error
}
return &p, nil
}
// GetLatestPaymentNumber is used to get the latest payment number for a user
func (pm *PaymentManager) GetLatestPaymentNumber(username string) (int64, error) {
p := Payments{}
check := pm.DB.Where("user_name = ?", username).Order("number desc").First(&p)
if check.Error != nil && check.Error != gorm.ErrRecordNotFound {
return 0, check.Error
}
if check.Error == gorm.ErrRecordNotFound {
return 0, nil
}
return p.Number + 1, nil
}
// NewPayment is used to create a payment in our database
func (pm *PaymentManager) NewPayment(number int64, depositAddress string, txHash string, usdValue, chargeAmount float64, blockchain string, paymentType string, username string) (*Payments, error) {
p := Payments{}
// check for a payment with the number
check := pm.DB.Where("number = ? AND user_name = ?", number, username).First(&p)
if check.Error != nil && check.Error != gorm.ErrRecordNotFound {
return nil, check.Error
}
if check.Error == nil {
return nil, errors.New("payment with number already exists in database")
}
// check for a payment with the tx hash
check = pm.DB.Where("tx_hash = ?", txHash).First(&p)
if check.Error != nil && check.Error != gorm.ErrRecordNotFound {
return nil, check.Error
}
if check.Error == nil {
return nil, errors.New("paymnet with tx hash already exists in database")
}
p = Payments{
DepositAddress: depositAddress,
TxHash: txHash,
USDValue: usdValue,
Blockchain: blockchain,
Type: paymentType,
UserName: username,
Confirmed: false,
Number: number,
ChargeAmount: chargeAmount,
}
if check := pm.DB.Create(&p); check.Error != nil {
return nil, check.Error
}
return &p, nil
}
// ConfirmPayment is used to mark a payment as confirmed
func (pm *PaymentManager) ConfirmPayment(txHash string) (*Payments, error) {
p, err := pm.FindPaymentByTxHash(txHash)
if err != nil {
return nil, err
}
p.Confirmed = true
if check := pm.DB.Model(p).Update("confirmed", p.Confirmed); check.Error != nil {
return nil, check.Error
}
return p, nil
}
// FindPaymentByTxHash is used to find a payment by its tx hash
func (pm *PaymentManager) FindPaymentByTxHash(txHash string) (*Payments, error) {
p := Payments{}
if check := pm.DB.Where("tx_hash = ?", txHash).First(&p); check.Error != nil {
return nil, check.Error
}
return &p, nil
}
// UpdatePaymentTxHash UpdatePaymentTxHash is used to update the tx hash of a payment
func (pm *PaymentManager) UpdatePaymentTxHash(username, txHash string, number int64) (*Payments, error) {
payment, err := pm.FindPaymentByNumber(username, number)
if err != nil {
return nil, err
}
payment.TxHash = txHash
if check := pm.DB.Model(payment).Update("tx_hash", payment.TxHash); check.Error != nil {
return nil, check.Error
}
return payment, nil
}