package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
|
|
"github.com/fatih/color"
|
|
|
|
"gopkg.in/mgo.v2/bson"
|
|
)
|
|
|
|
func upTree(address string, network NetworkModel) NetworkModel {
|
|
var upNetwork NetworkModel
|
|
|
|
//add address node to network
|
|
node := NodeModel{}
|
|
err := nodeCollection.Find(bson.M{"id": address}).One(&node)
|
|
check(err)
|
|
if nodeInNodes(network.Nodes, node) == false {
|
|
network.Nodes = append(network.Nodes, node)
|
|
}
|
|
|
|
//get edges before the address
|
|
edges := []EdgeModel{}
|
|
err = edgeCollection.Find(bson.M{"to": address}).All(&edges)
|
|
check(err)
|
|
for _, e := range edges {
|
|
if edgeInEdges(network.Edges, e) == false {
|
|
network.Edges = append(network.Edges, e)
|
|
}
|
|
//get the nodes involved in edges
|
|
/*
|
|
nodes := []NodeModel{}
|
|
err := nodeCollection.Find(bson.M{"id": }).All(&edges)
|
|
check(err)
|
|
*/
|
|
endBranch := false
|
|
edgeUpCheck := EdgeModel{}
|
|
err := edgeCollection.Find(bson.M{"to": e.From}).One(&edgeUpCheck)
|
|
if err != nil {
|
|
log.Println(err)
|
|
color.Blue("not found")
|
|
endBranch = true
|
|
}
|
|
|
|
//need to be fixed when there is a bucle between the addresses (A-->B, B-->C, C-->A)
|
|
fmt.Println(e.From + " - " + e.To)
|
|
if edgeInEdges(network.Edges, edgeUpCheck) == false && endBranch == false && edgeUpCheck.BlockHeight <= e.BlockHeight && e.To != edgeUpCheck.From {
|
|
upNetwork = upTree(e.From, network)
|
|
for _, upN := range upNetwork.Nodes {
|
|
if nodeInNodes(network.Nodes, upN) == false {
|
|
network.Nodes = append(network.Nodes, upN)
|
|
}
|
|
}
|
|
for _, upE := range upNetwork.Edges {
|
|
if edgeInEdges(network.Edges, upE) == false {
|
|
network.Edges = append(network.Edges, upE)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return network
|
|
}
|
|
func addressTree(address string) NetworkModel {
|
|
var network NetworkModel
|
|
|
|
network = upTree(address, network)
|
|
return network
|
|
|
|
}
|