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