12 changed files with 298 additions and 37 deletions
@ -0,0 +1,56 @@
|
||||
package main |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"net/http" |
||||
|
||||
"github.com/bvinc/go-sqlite-lite/sqlite3" |
||||
"github.com/sporestack/settlers" |
||||
) |
||||
|
||||
func deposit(depositOnlyToken string, amount uint64, db *sqlite3.Conn) (userErr, err error) { |
||||
// Add to a regular depositOnlyToken with its deposit only depositOnlyToken.
|
||||
if userErr = settlers.ValidateToken(depositOnlyToken); userErr != nil { |
||||
return |
||||
} |
||||
|
||||
// Check if account is enabled.
|
||||
userErr, err = depositOnlyTokenEnabled(depositOnlyToken, db) |
||||
if userErr != nil || err != nil { |
||||
return |
||||
} |
||||
|
||||
// sqlite3 only supports signed integers
|
||||
var signedAmount int64 |
||||
signedAmount = int64(amount) |
||||
err = db.Exec("UPDATE balances SET balance = balance + ? WHERE combined_deposit_only_token = ?", signedAmount, depositOnlyToken) |
||||
if err != nil { |
||||
return |
||||
} |
||||
|
||||
return |
||||
} |
||||
|
||||
func httpDeposit(w http.ResponseWriter, r *http.Request, db *sqlite3.Conn) { |
||||
defer r.Body.Close() |
||||
|
||||
var request settlers.DepositRequest |
||||
decoder := json.NewDecoder(r.Body) |
||||
decoder.DisallowUnknownFields() |
||||
userErr := decoder.Decode(&request) |
||||
if userErr != nil { |
||||
httpHandle400(w, userErr) |
||||
return |
||||
} |
||||
|
||||
userErr, err := deposit(request.CombinedDepositOnlyToken, request.Amount, db) |
||||
if userErr != nil { |
||||
httpHandle400(w, userErr) |
||||
return |
||||
} |
||||
if err != nil { |
||||
httpHandle500(w, err) |
||||
return |
||||
} |
||||
return |
||||
} |
@ -0,0 +1,46 @@
|
||||
package main |
||||
|
||||
import ( |
||||
"net/http" |
||||
"strings" |
||||
|
||||
"github.com/bvinc/go-sqlite-lite/sqlite3" |
||||
"github.com/sporestack/settlers" |
||||
) |
||||
|
||||
func depositOnlyTokenEnabled(depositOnlyToken string, db *sqlite3.Conn) (userErr, err error) { |
||||
if userErr = settlers.ValidateToken(depositOnlyToken); userErr != nil { |
||||
return |
||||
} |
||||
|
||||
statement, err := db.Prepare("SELECT balance FROM balances WHERE combined_deposit_only_token = ?", depositOnlyToken) |
||||
if err != nil { |
||||
return |
||||
} |
||||
defer statement.Close() |
||||
hasRow, err := statement.Step() |
||||
if err != nil { |
||||
return |
||||
} |
||||
if !hasRow { |
||||
userErr = settlers.ErrorAccountNotEnabled |
||||
return |
||||
} |
||||
return |
||||
} |
||||
|
||||
func httpDepositOnlyTokenEnabled(w http.ResponseWriter, r *http.Request, db *sqlite3.Conn) { |
||||
defer r.Body.Close() |
||||
pathParts := strings.Split(r.URL.Path, "/") |
||||
token := pathParts[len(pathParts)-1] |
||||
userErr, err := depositOnlyTokenEnabled(token, db) |
||||
if err != nil { |
||||
httpHandle500(w, err) |
||||
return |
||||
} |
||||
if userErr != nil { |
||||
httpHandle400(w, userErr) |
||||
return |
||||
} |
||||
return |
||||
} |
Loading…
Reference in new issue