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}