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