package endpoints import ( "encoding/json" "net/http" . "github.com/imosed/signet/data" "github.com/rs/zerolog/log" ) func getQualifiedRewardFunds() []RewardFund { var standalone []RewardFund var currentFromQueues []RewardFund var allQueues []RewardFund Db.Table("reward_funds"). Select("reward_funds.id", "reward_funds.created_at", "reward_funds.updated_at", "reward_funds.deleted_at", "reward_funds.asset", "reward_funds.fund_wallet", "reward_funds.selling_wallet", "reward_funds.issuer_wallet", "reward_funds.memo", "reward_funds.price", "reward_funds.amount_available", "reward_funds.min_contribution", "reward_funds.title", "reward_funds.description"). Joins("left outer join queue_orders qo on reward_funds.id = qo.reward_fund_id"). Where("qo.reward_fund_id is null"). Scan(&standalone) tempTable := Db.Table("contributions c"). Select("c.reward_fund_id", "queue_id", "sum(amount) amt"). Joins("inner join queue_orders qo on c.reward_fund_id = qo.reward_fund_id"). Group("c.reward_fund_id"). Group("qo.queue_id") Db.Table("reward_funds"). Select("distinct on (qo.queue_id) reward_funds.id", "reward_funds.created_at", "reward_funds.updated_at", "reward_funds.deleted_at", "reward_funds.asset", "reward_funds.fund_wallet", "reward_funds.selling_wallet", "reward_funds.issuer_wallet", "reward_funds.memo", "reward_funds.price", "reward_funds.amount_available", "reward_funds.min_contribution", "reward_funds.title", "reward_funds.description"). Joins("inner join queue_orders qo on reward_funds.id = qo.reward_fund_id"). Joins("left join contributions c on reward_funds.id = c.reward_fund_id"). Joins("inner join (?) tt on reward_funds.id = tt.reward_fund_id", tempTable, Db.Where("tt.amount < reward_funds.amount_available or tt.amount is null")). Order("qo.queue_id"). Order("qo.order"). Scan(¤tFromQueues) allQueues = append(standalone, currentFromQueues...) return allQueues } func GetRewardFunds(w http.ResponseWriter, r *http.Request) { var req GetRewardFundsRequest err := json.NewDecoder(r.Body).Decode(&req) if err != nil { log.Error().Err(err).Msg("Could not decode body in GetRewardFunds call") return } var resp GetRewardFundsResponse var rewardFunds []RewardFund rewardFunds = getQualifiedRewardFunds() for _, f := range rewardFunds { resp.RewardFunds = append(resp.RewardFunds, FundInfo{ ID: f.ID, CreatedAt: f.CreatedAt, Asset: f.Asset, FundWallet: f.FundWallet, IssuerWallet: f.IssuerWallet, Memo: f.Memo, AmountAvailable: f.AmountAvailable, MinContribution: f.MinContribution, TelegramLink: f.TelegramLink, Bonuses: f.Bonuses, }) } err = json.NewEncoder(w).Encode(resp) if err != nil { log.Error().Err(err).Msg("Could not deliver response in GetRewardFunds call") } } type GetRewardFundsRequest struct { Offset int `json:"offset"` } type GetRewardFundsResponse struct { RewardFunds []FundInfo `json:"rewardFunds"` Total int64 `json:"total"` }