83 lines
2.0 KiB
Go
83 lines
2.0 KiB
Go
package api
|
|
|
|
import (
|
|
"dejo_node/internal/state"
|
|
"dejo_node/internal/storage"
|
|
"encoding/json"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
var GlobalState *state.State
|
|
var GlobalBlockStore *storage.BlockStore
|
|
|
|
func HandleGetBalance(w http.ResponseWriter, r *http.Request) {
|
|
addr := strings.TrimPrefix(r.URL.Path, "/accounts/")
|
|
if strings.Contains(addr, "/") {
|
|
addr = strings.Split(addr, "/")[0]
|
|
}
|
|
if addr == "" {
|
|
http.Error(w, "endereço inválido", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
balance := GlobalState.GetBalance(addr)
|
|
resp := map[string]interface{}{
|
|
"address": addr,
|
|
"balance": balance,
|
|
}
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(resp)
|
|
}
|
|
|
|
func HandleGetTransactionsByAddress(w http.ResponseWriter, r *http.Request) {
|
|
addr := strings.TrimPrefix(r.URL.Path, "/accounts/")
|
|
addr = strings.TrimSuffix(addr, "/txs")
|
|
if addr == "" {
|
|
http.Error(w, "endereço inválido", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
txs := []map[string]interface{}{}
|
|
blocks, err := GlobalBlockStore.LoadAll()
|
|
if err != nil {
|
|
http.Error(w, "erro ao carregar blocos", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
for _, blk := range blocks {
|
|
for _, tx := range blk.Txns {
|
|
if tx.From == addr || tx.To == addr {
|
|
txs = append(txs, map[string]interface{}{
|
|
"from": tx.From,
|
|
"to": tx.To,
|
|
"value": tx.Value,
|
|
"hash": tx.Hash(),
|
|
"block": blk.Index,
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(txs)
|
|
}
|
|
|
|
func (h *Handler) GetTransactionByHash(w http.ResponseWriter, r *http.Request) {
|
|
hash := strings.TrimPrefix(r.URL.Path, "/transaction/")
|
|
blocks, err := h.Store.LoadAll()
|
|
if err != nil {
|
|
http.Error(w, "erro ao carregar blocos", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
for _, blk := range blocks {
|
|
for _, tx := range blk.Txns {
|
|
if tx.Hash() == hash {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(tx)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
http.Error(w, "transação não encontrada", http.StatusNotFound)
|
|
}
|