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		"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}