|
|
@@ -2,6 +2,7 @@ package endpoints |
|
|
|
|
|
|
|
import ( |
|
|
|
"encoding/json" |
|
|
|
"errors" |
|
|
|
"fmt" |
|
|
|
"net/http" |
|
|
|
"strconv" |
|
|
@@ -57,7 +58,7 @@ func CreateRewardFund(resp http.ResponseWriter, req *http.Request) { |
|
|
|
Db.Table("queue_reward_funds").Where("queue_id = ?", fund.QueueID).Scan(&fundsInQueue) |
|
|
|
next := uint16(len(fundsInQueue)) |
|
|
|
|
|
|
|
joinTable := QueueOrder{QueueID: fund.QueueID, RewardFundID: rewardFund.ID, Order: next} |
|
|
|
joinRecord := QueueOrder{QueueID: fund.QueueID, RewardFundID: rewardFund.ID, Order: next} |
|
|
|
|
|
|
|
offerReq := horizonclient.OfferRequest{ |
|
|
|
Seller: rewardFund.SellingWallet, |
|
|
@@ -65,38 +66,76 @@ func CreateRewardFund(resp http.ResponseWriter, req *http.Request) { |
|
|
|
Order: horizonclient.OrderDesc, |
|
|
|
} |
|
|
|
|
|
|
|
url, _ := offerReq.BuildURL() |
|
|
|
fmt.Println(url) |
|
|
|
if err, ok := FindOffer(offerReq, &rewardFund); !ok { |
|
|
|
err = json.NewEncoder(resp).Encode(&SuccessResponse{Success: ok}) |
|
|
|
if err != nil { |
|
|
|
log.Error().Err(err).Msg("Could not deliver response after failing to find issuer offer") |
|
|
|
} |
|
|
|
return |
|
|
|
} |
|
|
|
if err != nil { |
|
|
|
log.Error().Err(err).Msg("Could not find issuer offer") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
op, err := client.Offers(offerReq) |
|
|
|
var claims *auth.Claims |
|
|
|
claims, err = auth.GetUserClaims(req) |
|
|
|
if err != nil { |
|
|
|
log.Error().Err(err).Msg("Could not get offers") |
|
|
|
log.Error().Err(err).Msg("Could not determine if user is authenticated") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
if claims.Privileges <= Admin { |
|
|
|
Db.Create(&rewardFund) |
|
|
|
Db.Create(&joinRecord) |
|
|
|
|
|
|
|
for _, cancel := range cancellations { |
|
|
|
cancel() |
|
|
|
} |
|
|
|
go InitializeContributionStreams() |
|
|
|
|
|
|
|
for _, bonus := range fund.Bonuses { |
|
|
|
bonus.RewardFundID = rewardFund.ID |
|
|
|
bonuses = append(bonuses, bonus) |
|
|
|
} |
|
|
|
Db.Create(&bonuses) |
|
|
|
|
|
|
|
err = json.NewEncoder(resp).Encode(&SuccessResponse{Success: true}) |
|
|
|
if err != nil { |
|
|
|
log.Error().Err(err).Msg("Could not create response for created reward fund") |
|
|
|
} |
|
|
|
} else { |
|
|
|
resp.WriteHeader(403) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func FindOffer(offerReq horizonclient.OfferRequest, rewardFund *RewardFund) (error, bool) { |
|
|
|
op, err := client.Offers(offerReq) |
|
|
|
if err != nil { |
|
|
|
return errors.New("could not get offers"), false |
|
|
|
} |
|
|
|
offers := op.Embedded.Records |
|
|
|
var price float64 |
|
|
|
var amt float64 |
|
|
|
if len(offers) == 1 { |
|
|
|
price, err = strconv.ParseFloat(op.Embedded.Records[0].Price, 64) |
|
|
|
if err != nil { |
|
|
|
log.Error().Err(err).Msg("Could not parse price to float") |
|
|
|
return |
|
|
|
return errors.New("could not parse single offer price to float"), false |
|
|
|
} |
|
|
|
amt, err = strconv.ParseFloat(op.Embedded.Records[0].Amount, 64) |
|
|
|
if err != nil { |
|
|
|
log.Error().Err(err).Msg("Could not parse amount to float") |
|
|
|
return |
|
|
|
return errors.New("could not parse single offer amount to float"), false |
|
|
|
} |
|
|
|
rewardFund.Price = price |
|
|
|
rewardFund.AmountAvailable = amt |
|
|
|
return nil, true |
|
|
|
} else if len(offers) > 1 { |
|
|
|
var maxOffers float64 = 0 |
|
|
|
var correctOffer horizon.Offer |
|
|
|
for _, o := range op.Embedded.Records { |
|
|
|
parsedAmt, err := strconv.ParseFloat(o.Amount, 64) |
|
|
|
if err != nil { |
|
|
|
log.Error().Err(err).Msg("Could not parse amount to float") |
|
|
|
return |
|
|
|
return errors.New("could not parse amount from offer slice to float"), false |
|
|
|
} |
|
|
|
if parsedAmt > maxOffers { |
|
|
|
correctOffer = o |
|
|
@@ -105,48 +144,17 @@ func CreateRewardFund(resp http.ResponseWriter, req *http.Request) { |
|
|
|
} |
|
|
|
price, err = strconv.ParseFloat(correctOffer.Price, 64) |
|
|
|
if err != nil { |
|
|
|
log.Error().Err(err).Msg("Could not parse price to float") |
|
|
|
return |
|
|
|
return errors.New("could not parse correct offer price to float"), false |
|
|
|
} |
|
|
|
rewardFund.Price = price |
|
|
|
|
|
|
|
amt, err = strconv.ParseFloat(correctOffer.Amount, 64) |
|
|
|
if err != nil { |
|
|
|
log.Error().Err(err).Msg("Could not parse amount to float") |
|
|
|
return errors.New("could not parse correct offer amount to float"), false |
|
|
|
} |
|
|
|
rewardFund.AmountAvailable = amt |
|
|
|
return nil, true |
|
|
|
} else { |
|
|
|
err = json.NewEncoder(resp).Encode(&SuccessResponse{Success: false}) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
var claims *auth.Claims |
|
|
|
claims, err = auth.GetUserClaims(req) |
|
|
|
if err != nil { |
|
|
|
log.Error().Err(err).Msg("Could not determine if user is authenticated") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
if claims.Privileges <= Admin { |
|
|
|
Db.Create(&rewardFund) |
|
|
|
Db.Create(&joinTable) |
|
|
|
|
|
|
|
for _, cancel := range cancellations { |
|
|
|
cancel() |
|
|
|
} |
|
|
|
go InitializeContributionStreams() |
|
|
|
|
|
|
|
for _, bonus := range fund.Bonuses { |
|
|
|
bonus.RewardFundID = rewardFund.ID |
|
|
|
bonuses = append(bonuses, bonus) |
|
|
|
} |
|
|
|
Db.Create(&bonuses) |
|
|
|
|
|
|
|
err = json.NewEncoder(resp).Encode(&SuccessResponse{Success: true}) |
|
|
|
if err != nil { |
|
|
|
log.Error().Err(err).Msg("Could not create response for created reward fund") |
|
|
|
} |
|
|
|
} else { |
|
|
|
resp.WriteHeader(403) |
|
|
|
return nil, false // no offers shouldn't error |
|
|
|
} |
|
|
|
} |