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 "AddressNetwork",
31 "GET",
32 "/address/network/{address}",
33 AddressNetwork,
34 },
35 Route{
36 "AddressSankey",
37 "GET",
38 "/address/sankey/{address}",
39 AddressSankey,
40 },
41 Route{
42 "NetworkMap",
43 "Get",
44 "/map",
45 NetworkMap,
46 },
47 Route{
48 "GetHourAnalysis",
49 "Get",
50 "/houranalysis",
51 GetHourAnalysis,
52 },
53 /*
54 Route{
55 "SelectItem",
56 "GET",
57 "/selectItem/{userid}/{itemid}",
58 SelectItem,
59 },
60 */
61}
62
63//ROUTES
64
65func Index(w http.ResponseWriter, r *http.Request) {
66 fmt.Fprintln(w, "ask for recommendations in /r")
67 //http.FileServer(http.Dir("./web"))
68}
69
70/*
71func NewUser(w http.ResponseWriter, r *http.Request) {
72 ipFilter(w, r)
73 decoder := json.NewDecoder(r.Body)
74 var newUser UserModel
75 err := decoder.Decode(&newUser)
76 check(err)
77 defer r.Body.Close()
78
79 saveUser(userCollection, newUser)
80
81 fmt.Println(newUser)
82 fmt.Fprintln(w, "new user added: ", newUser.ID)
83}
84*/
85func AllAddresses(w http.ResponseWriter, r *http.Request) {
86 ipFilter(w, r)
87
88 nodes := []NodeModel{}
89 iter := nodeCollection.Find(bson.M{}).Limit(10000).Iter()
90 err := iter.All(&nodes)
91
92 //convert []resp struct to json
93 jsonNodes, err := json.Marshal(nodes)
94 check(err)
95
96 fmt.Fprintln(w, string(jsonNodes))
97}
98func AddressNetwork(w http.ResponseWriter, r *http.Request) {
99 ipFilter(w, r)
100
101 vars := mux.Vars(r)
102 address := vars["address"]
103 if address == "undefined" {
104 fmt.Fprintln(w, "not valid address")
105 } else {
106 network := addressTree(address)
107
108 //convert []resp struct to json
109 jNetwork, err := json.Marshal(network)
110 check(err)
111
112 fmt.Fprintln(w, string(jNetwork))
113 }
114}
115func AddressSankey(w http.ResponseWriter, r *http.Request) {
116 ipFilter(w, r)
117
118 vars := mux.Vars(r)
119 address := vars["address"]
120 if address == "undefined" {
121 fmt.Fprintln(w, "not valid address")
122 } else {
123 network := addressTree(address)
124 var sankey SankeyModel
125
126 fmt.Println("network generated")
127 mapNodeK := make(map[string]int)
128 for k, n := range network.Nodes {
129 var sankeyNode SankeyNodeModel
130 //sankeyNode.StringNode = n.Id
131 sankeyNode.Node = k
132 sankeyNode.Name = n.Id
133 sankey.Nodes = append(sankey.Nodes, sankeyNode)
134 mapNodeK[n.Id] = k
135 }
136 for _, e := range network.Edges {
137 var sankeyLink SankeyLinkModel
138 //sankeyLink.StringSource = e.From
139 sankeyLink.Source = mapNodeK[e.From]
140 //sankeyLink.StringTarget = e.To
141 sankeyLink.Target = mapNodeK[e.To]
142 sankeyLink.Value = e.Label
143 sankey.Links = append(sankey.Links, sankeyLink)
144 }
145 fmt.Println("Sankey generated")
146
147 //convert []resp struct to json
148 jsonSankey, err := json.Marshal(sankey)
149 check(err)
150
151 fmt.Fprintln(w, string(jsonSankey))
152 }
153}
154func NetworkMap(w http.ResponseWriter, r *http.Request) {
155 ipFilter(w, r)
156
157 nodes, err := getAllNodes()
158 check(err)
159 edges, err := getAllEdges()
160 check(err)
161
162 var network NetworkModel
163 network.Nodes = nodes
164 network.Edges = edges
165
166 //convert []resp struct to json
167 jNetwork, err := json.Marshal(network)
168 check(err)
169
170 fmt.Fprintln(w, string(jNetwork))
171}
172
173/*
174func SelectItem(w http.ResponseWriter, r *http.Request) {
175 ipFilter(w, r)
176 vars := mux.Vars(r)
177 userid := vars["userid"]
178 itemid := vars["itemid"]
179 //find item
180 item, err := getItemById(itemid)
181 if err != nil {
182 fmt.Fprintln(w, "item "+itemid+" not found")
183 }
184
185 //find user
186 user, err := getUserById(userid)
187 if err != nil {
188 fmt.Fprintln(w, "user "+userid+" not found")
189 }
190
191 //increase TActed in item
192 item.TActed = item.TActed + 1
193
194 //save item
195 item, err = updateItem(item)
196 check(err)
197 fmt.Println(item)
198
199 //add item to []Actions of user
200 user.Actions = append(user.Actions, itemid)
201
202 //save user
203 user, err = updateUser(user)
204 check(err)
205 fmt.Println(user)
206
207 fmt.Fprintln(w, "user: "+userid+", selects item: "+itemid)
208}
209*/
210func GetHourAnalysis(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}