-
Notifications
You must be signed in to change notification settings - Fork 2
/
referrals.go
112 lines (95 loc) · 3.7 KB
/
referrals.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
package routes
import (
"encoding/json"
"fmt"
"io"
"net/http"
"github.com/btcsuite/btcd/btcec"
"github.com/deso-smart/deso-core/v2/lib"
)
type GetReferralInfoForUserRequest struct {
PublicKeyBase58Check string `safeForLogging:"true"`
JWT string
}
type GetReferralInfoForUserResponse struct {
ReferralInfoResponses []ReferralInfoResponse `safeForLogging:"true"`
}
func (fes *APIServer) GetReferralInfoForUser(ww http.ResponseWriter, req *http.Request) {
decoder := json.NewDecoder(io.LimitReader(req.Body, MaxRequestBodySizeBytes))
requestData := GetReferralInfoForUserRequest{}
if err := decoder.Decode(&requestData); err != nil {
_AddBadRequestError(ww, fmt.Sprintf(
"GetReferralInfoForUser: Problem parsing request body: %v", err))
return
}
// Validate the JWT is legit.
isValid, err := fes.ValidateJWT(requestData.PublicKeyBase58Check, requestData.JWT)
if err != nil {
_AddBadRequestError(ww, fmt.Sprintf("GetReferralInfoForUser: Error validating JWT: %v", err))
return
}
if !isValid {
_AddBadRequestError(ww, fmt.Sprintf("GetReferralInfoForUser: Invalid token: %v", err))
return
}
// Decode the user public key, if provided.
publicKeyBytes, _, err := lib.Base58CheckDecode(requestData.PublicKeyBase58Check)
if err != nil || len(publicKeyBytes) != btcec.PubKeyBytesLenCompressed {
_AddBadRequestError(ww, fmt.Sprintf(
"GetReferralInfoForUser: Problem decoding updater public key %s: %v",
requestData.PublicKeyBase58Check, err))
return
}
// Get the referral link info structs.
referralInfoResponses, err := fes.getReferralInfoResponsesForPubKey(publicKeyBytes, false /*includeReferredUsers*/)
if err != nil {
_AddBadRequestError(ww, fmt.Sprintf("GetReferralInfoForUser: Problem putting new referral hash and info: %v", err))
return
}
// If we made it this far we were successful, return without error.
res := GetReferralInfoForUserResponse{
ReferralInfoResponses: referralInfoResponses,
}
if err = json.NewEncoder(ww).Encode(res); err != nil {
_AddBadRequestError(ww, fmt.Sprintf("GetReferralInfoForUser: Problem encoding response as JSON: %v", err))
return
}
}
type GetReferralInfoForReferralHashRequest struct {
ReferralHash string
}
type GetReferralInfoForReferralHashResponse struct {
ReferralInfoResponse *SimpleReferralInfoResponse
CountrySignUpBonus CountryLevelSignUpBonus
}
func (fes *APIServer) GetReferralInfoForReferralHash(ww http.ResponseWriter, req *http.Request) {
decoder := json.NewDecoder(io.LimitReader(req.Body, MaxRequestBodySizeBytes))
requestData := GetReferralInfoForReferralHashRequest{}
if err := decoder.Decode(&requestData); err != nil {
_AddBadRequestError(ww, fmt.Sprintf(
"GetReferralInfoForReferralHash: Problem parsing request body: %v", err))
return
}
referralInfo, err := fes.getInfoForReferralHashBase58(requestData.ReferralHash)
if err != nil {
_AddBadRequestError(ww, fmt.Sprintf("GetReferralInfoForReferralHash: Error getting referral info for referral hash: %v", err))
return
}
simpleReferralInfo := SimpleReferralInfo{
ReferralHashBase58: referralInfo.ReferralHashBase58,
RefereeAmountUSDCents: referralInfo.RefereeAmountUSDCents,
MaxReferrals: referralInfo.MaxReferrals,
TotalReferrals: referralInfo.TotalReferrals,
}
res := GetReferralInfoForReferralHashResponse{
ReferralInfoResponse: &SimpleReferralInfoResponse{
Info: simpleReferralInfo,
IsActive: fes.getReferralHashStatus(referralInfo.ReferrerPKID, referralInfo.ReferralHashBase58),
},
CountrySignUpBonus: fes.GetCountryLevelSignUpBonusFromHeader(req),
}
if err = json.NewEncoder(ww).Encode(res); err != nil {
_AddBadRequestError(ww, fmt.Sprintf("GetReferralInfoForUser: Problem encoding response as JSON: %v", err))
return
}
}