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}