diff --git a/endpoints/createrewardfund.go b/endpoints/createrewardfund.go index 5f09373..b709393 100644 --- a/endpoints/createrewardfund.go +++ b/endpoints/createrewardfund.go @@ -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 } }