Files
dejo-node/internal/api/account_handlers.go
2025-05-23 10:44:32 -03:00

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)
}