arnaucube
arnaucube/goBlockchainDataAnalysisPublic Self-hosted repository
goBlockchainDataAnalysis/serverRoutes.go
serverRoutes.goRaw
  1package main
  2
  3import (
  4	"encoding/json"
  5	"fmt"
  6	"net/http"
  7	"sort"
  8
  9	"gopkg.in/mgo.v2/bson"
 10
 11	"github.com/gorilla/mux"
 12)
 13
 14type Routes []Route
 15
 16var routes = Routes{
 17	Route{
 18		"Index",
 19		"GET",
 20		"/",
 21		Index,
 22	},
 23	Route{
 24		"AllAddresses",
 25		"Get",
 26		"/alladdresses",
 27		AllAddresses,
 28	},
 29	Route{
 30		"GetLastTx",
 31		"Get",
 32		"/lasttx",
 33		GetLastTx,
 34	},
 35	Route{
 36		"AddressNetwork",
 37		"GET",
 38		"/address/network/{address}",
 39		AddressNetwork,
 40	},
 41	Route{
 42		"AddressSankey",
 43		"GET",
 44		"/address/sankey/{address}",
 45		AddressSankey,
 46	},
 47	Route{
 48		"NetworkMap",
 49		"Get",
 50		"/map",
 51		NetworkMap,
 52	},
 53	Route{
 54		"GetHourAnalysis",
 55		"Get",
 56		"/houranalysis",
 57		GetHourAnalysis,
 58	},
 59}
 60
 61//ROUTES
 62
 63func Index(w http.ResponseWriter, r *http.Request) {
 64	fmt.Fprintln(w, "ask for recommendations in /r")
 65	//http.FileServer(http.Dir("./web"))
 66}
 67
 68/*
 69func NewUser(w http.ResponseWriter, r *http.Request) {
 70	ipFilter(w, r)
 71	decoder := json.NewDecoder(r.Body)
 72	var newUser UserModel
 73	err := decoder.Decode(&newUser)
 74	check(err)
 75	defer r.Body.Close()
 76
 77	saveUser(userCollection, newUser)
 78
 79	fmt.Println(newUser)
 80	fmt.Fprintln(w, "new user added: ", newUser.ID)
 81}
 82*/
 83func AllAddresses(w http.ResponseWriter, r *http.Request) {
 84	ipFilter(w, r)
 85
 86	nodes := []NodeModel{}
 87	iter := nodeCollection.Find(bson.M{}).Limit(10000).Iter()
 88	err := iter.All(&nodes)
 89
 90	//convert []resp struct to json
 91	jsonNodes, err := json.Marshal(nodes)
 92	check(err)
 93
 94	fmt.Fprintln(w, string(jsonNodes))
 95}
 96func GetLastTx(w http.ResponseWriter, r *http.Request) {
 97	ipFilter(w, r)
 98
 99	nodes := []NodeModel{}
100	err := nodeCollection.Find(bson.M{}).Limit(10).Sort("-$natural").All(&nodes)
101	check(err)
102
103	//convert []resp struct to json
104	jNodes, err := json.Marshal(nodes)
105	check(err)
106
107	fmt.Fprintln(w, string(jNodes))
108}
109func AddressNetwork(w http.ResponseWriter, r *http.Request) {
110	ipFilter(w, r)
111
112	vars := mux.Vars(r)
113	address := vars["address"]
114	if address == "undefined" {
115		fmt.Fprintln(w, "not valid address")
116	} else {
117		network := addressTree(address)
118
119		//convert []resp struct to json
120		jNetwork, err := json.Marshal(network)
121		check(err)
122
123		fmt.Fprintln(w, string(jNetwork))
124	}
125}
126func AddressSankey(w http.ResponseWriter, r *http.Request) {
127	ipFilter(w, r)
128
129	vars := mux.Vars(r)
130	address := vars["address"]
131	if address == "undefined" {
132		fmt.Fprintln(w, "not valid address")
133	} else {
134		network := addressTree(address)
135		var sankey SankeyModel
136
137		fmt.Println("network generated")
138		mapNodeK := make(map[string]int)
139		for k, n := range network.Nodes {
140			var sankeyNode SankeyNodeModel
141			//sankeyNode.StringNode = n.Id
142			sankeyNode.Node = k
143			sankeyNode.Name = n.Id
144			sankey.Nodes = append(sankey.Nodes, sankeyNode)
145			mapNodeK[n.Id] = k
146		}
147		for _, e := range network.Edges {
148			var sankeyLink SankeyLinkModel
149			//sankeyLink.StringSource = e.From
150			sankeyLink.Source = mapNodeK[e.From]
151			//sankeyLink.StringTarget = e.To
152			sankeyLink.Target = mapNodeK[e.To]
153			sankeyLink.Value = e.Label
154			sankey.Links = append(sankey.Links, sankeyLink)
155		}
156		fmt.Println("Sankey generated")
157
158		//convert []resp struct to json
159		jsonSankey, err := json.Marshal(sankey)
160		check(err)
161
162		fmt.Fprintln(w, string(jsonSankey))
163	}
164}
165func NetworkMap(w http.ResponseWriter, r *http.Request) {
166	ipFilter(w, r)
167
168	nodes, err := getAllNodes()
169	check(err)
170	edges, err := getAllEdges()
171	check(err)
172
173	var network NetworkModel
174	network.Nodes = nodes
175	network.Edges = edges
176
177	//convert []resp struct to json
178	jNetwork, err := json.Marshal(network)
179	check(err)
180
181	fmt.Fprintln(w, string(jNetwork))
182}
183
184/*
185func SelectItem(w http.ResponseWriter, r *http.Request) {
186	ipFilter(w, r)
187	vars := mux.Vars(r)
188	userid := vars["userid"]
189	itemid := vars["itemid"]
190	//find item
191	item, err := getItemById(itemid)
192	if err != nil {
193		fmt.Fprintln(w, "item "+itemid+" not found")
194	}
195
196	//find user
197	user, err := getUserById(userid)
198	if err != nil {
199		fmt.Fprintln(w, "user "+userid+" not found")
200	}
201
202	//increase TActed in item
203	item.TActed = item.TActed + 1
204
205	//save item
206	item, err = updateItem(item)
207	check(err)
208	fmt.Println(item)
209
210	//add item to []Actions of user
211	user.Actions = append(user.Actions, itemid)
212
213	//save user
214	user, err = updateUser(user)
215	check(err)
216	fmt.Println(user)
217
218	fmt.Fprintln(w, "user: "+userid+", selects item: "+itemid)
219}
220*/
221func GetHourAnalysis(w http.ResponseWriter, r *http.Request) {
222	ipFilter(w, r)
223
224	hourAnalysis := []HourCountModel{}
225	iter := hourCountCollection.Find(bson.M{}).Limit(10000).Iter()
226	err := iter.All(&hourAnalysis)
227
228	//sort by hour
229	sort.Slice(hourAnalysis, func(i, j int) bool {
230		return hourAnalysis[i].Hour < hourAnalysis[j].Hour
231	})
232
233	var resp HourAnalysisResp
234	for _, d := range hourAnalysis {
235		resp.Labels = append(resp.Labels, d.Hour)
236		resp.Data = append(resp.Data, d.Count)
237	}
238
239	//convert []resp struct to json
240	jsonResp, err := json.Marshal(resp)
241	check(err)
242	fmt.Fprintln(w, string(jsonResp))
243}