@@ -8,11 +8,18 @@ import ( | |||
) | |||
type Bonus struct { | |||
gorm.Model | |||
Goal float64 `json:"goal"` | |||
Percent float64 `json:"percent"` | |||
RewardFundID uint `json:"rewardFundID"` | |||
} | |||
type Queue struct { | |||
gorm.Model | |||
Name string `json:"name"` | |||
Funds []RewardFund `json:"funds"` | |||
} | |||
type RewardFund struct { | |||
gorm.Model | |||
Asset string `json:"asset"` | |||
@@ -26,9 +33,13 @@ type RewardFund struct { | |||
Contributions []Contribution `json:"contributions"` | |||
Title string `gorm:"type:varchar(50)" json:"title"` | |||
Description string `gorm:"type:text" json:"description"` | |||
QueueID uint `json:"queueID"` | |||
Bonuses []Bonus `json:"bonuses"` | |||
} | |||
type QueueRewardFund struct { | |||
} | |||
type Contribution struct { | |||
gorm.Model | |||
Wallet string `json:"wallet"` | |||
@@ -70,7 +81,10 @@ func InitializeDatabase() { | |||
viper.GetInt("database.port"), | |||
viper.GetString("database.ssl")) | |||
Db, err = gorm.Open(postgres.Open(dcs), &gorm.Config{}) | |||
err = Db.AutoMigrate(User{}, RewardFund{}, Contribution{}, Bonus{}) | |||
if err != nil { | |||
panic("Could not open database") | |||
} | |||
err = Db.AutoMigrate(User{}, Queue{}, RewardFund{}, Contribution{}, Bonus{}) | |||
if err != nil { | |||
panic("Could not migrate database") | |||
} | |||
@@ -61,7 +61,7 @@ func Contribute(resp http.ResponseWriter, req *http.Request) { | |||
BaseFee: txnbuild.MinBaseFee, | |||
Memo: txnbuild.Memo(txnbuild.MemoText(fund.Memo)), | |||
Preconditions: txnbuild.Preconditions{ | |||
TimeBounds: txnbuild.NewInfiniteTimeout(), | |||
TimeBounds: txnbuild.NewTimeout(15), | |||
}, | |||
}) | |||
if err != nil { | |||
@@ -0,0 +1,45 @@ | |||
package endpoints | |||
import ( | |||
"encoding/json" | |||
. "github.com/imosed/signet/data" | |||
"net/http" | |||
) | |||
type CreateQueueRequest struct { | |||
Name string `json:"name"` | |||
} | |||
type CreateQueueResponse struct { | |||
ID uint `json:"id"` | |||
} | |||
func CreateQueue(w http.ResponseWriter, r *http.Request) { | |||
var req CreateQueueRequest | |||
err := json.NewDecoder(r.Body).Decode(&req) | |||
if err != nil { | |||
panic("Could not decode body") | |||
} | |||
var specificQueue Queue | |||
Db.Table("queues").First(&specificQueue, "name = ?", req.Name) | |||
var resp CreateQueueResponse | |||
if specificQueue.ID != 0 { | |||
resp.ID = specificQueue.ID | |||
} else { | |||
queue := Queue{ | |||
Name: req.Name, | |||
} | |||
Db.Create(&queue) | |||
resp.ID = queue.ID | |||
} | |||
err = json.NewEncoder(w).Encode(resp) | |||
if err != nil { | |||
panic("Could not deliver response") | |||
} | |||
} |
@@ -37,6 +37,7 @@ func CreateRewardFund(resp http.ResponseWriter, req *http.Request) { | |||
Title: fund.Title, | |||
Description: fund.Description, | |||
Contributions: nil, | |||
QueueID: fund.QueueID, | |||
} | |||
offerReq := horizonclient.OfferRequest{ | |||
@@ -0,0 +1,61 @@ | |||
package endpoints | |||
import ( | |||
"encoding/json" | |||
"github.com/stellar/go/clients/horizonclient" | |||
"github.com/stellar/go/keypair" | |||
"github.com/stellar/go/protocols/horizon" | |||
"net/http" | |||
"strconv" | |||
) | |||
type GetBalanceRequest struct { | |||
SecretKey string `json:"secretKey"` | |||
} | |||
type GetBalanceResponse struct { | |||
Balance float64 `json:"balance"` | |||
} | |||
func GetBalance(w http.ResponseWriter, r *http.Request) { | |||
var req GetBalanceRequest | |||
err := json.NewDecoder(r.Body).Decode(&req) | |||
if err != nil { | |||
panic("Could not decode body") | |||
} | |||
var kp keypair.KP | |||
kp, err = keypair.Parse(req.SecretKey) | |||
if err != nil { | |||
w.WriteHeader(404) | |||
return | |||
} | |||
acctReq := horizonclient.AccountRequest{ | |||
AccountID: kp.Address(), | |||
} | |||
var acct horizon.Account | |||
acct, err = client.AccountDetail(acctReq) | |||
if err != nil { | |||
panic("Could not get account data from public key") | |||
} | |||
var blnce = -1.0 | |||
for _, balance := range acct.Balances { | |||
if balance.Asset.Type == "native" { | |||
blnce, err = strconv.ParseFloat(balance.Balance, 64) | |||
} | |||
} | |||
if blnce == -1.0 { | |||
panic("Could not get XLM balance") | |||
} | |||
var resp GetBalanceResponse | |||
resp.Balance = blnce | |||
err = json.NewEncoder(w).Encode(resp) | |||
if err != nil { | |||
panic("Could not deliver response") | |||
} | |||
} |
@@ -0,0 +1,22 @@ | |||
package endpoints | |||
import ( | |||
"encoding/json" | |||
. "github.com/imosed/signet/data" | |||
"net/http" | |||
) | |||
type GetQueuesResponse struct { | |||
Queues []Queue `json:"queues"` | |||
} | |||
func GetQueues(w http.ResponseWriter, r *http.Request) { | |||
var resp GetQueuesResponse | |||
Db.Table("queues").Scan(&resp.Queues) | |||
err := json.NewEncoder(w).Encode(resp) | |||
if err != nil { | |||
panic("Could not deliver response") | |||
} | |||
} |
@@ -17,7 +17,7 @@ var err error | |||
// TODO: beignet.io | |||
func main() { | |||
viper.SetConfigFile("config.production.json") // TODO: change this for deployment | |||
viper.SetConfigFile("config.production.json") | |||
err = viper.ReadInConfig() | |||
if err != nil { | |||
panic("Could not read in Viper config") | |||
@@ -31,9 +31,12 @@ func main() { | |||
router.HandleFunc("/GetRewardFunds", endpoints.GetRewardFunds) | |||
router.HandleFunc("/GetRewardFund", endpoints.GetRewardFund) | |||
router.HandleFunc("/GetContributions", endpoints.GetContributions) | |||
router.HandleFunc("/CreateQueue", endpoints.CreateQueue) | |||
router.HandleFunc("/GetQueues", endpoints.GetQueues) | |||
router.HandleFunc("/CreateRewardFund", endpoints.CreateRewardFund) | |||
router.HandleFunc("/CloseRewardFund", endpoints.CloseRewardFund) | |||
router.HandleFunc("/SubmitFund", endpoints.SubmitFund) | |||
//router.HandleFunc("/SubmitFund", endpoints.SubmitFund) | |||
router.HandleFunc("/GetBalance", endpoints.GetBalance) | |||
router.HandleFunc("/Contribute", endpoints.Contribute) | |||
router.HandleFunc("/ContributorStream", endpoints.ContributorStream) | |||
router.HandleFunc("/Login", endpoints.Login) | |||