package main import ( "encoding/json" "fmt" "net/http" "sort" "gopkg.in/mgo.v2/bson" "github.com/gorilla/mux" ) type Routes []Route var routes = Routes{ Route{ "Index", "GET", "/", Index, }, Route{ "AllAddresses", "Get", "/alladdresses", AllAddresses, }, Route{ "GetLastAddr", "Get", "/lastaddr", GetLastAddr, }, Route{ "GetLastTx", "Get", "/lasttx", GetLastTx, }, Route{ "AddressNetwork", "GET", "/address/network/{address}", AddressNetwork, }, Route{ "AddressSankey", "GET", "/address/sankey/{address}", AddressSankey, }, Route{ "NetworkMap", "Get", "/map", NetworkMap, }, Route{ "GetHourAnalysis", "Get", "/houranalysis", GetHourAnalysis, }, } //ROUTES func Index(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "ask for recommendations in /r") //http.FileServer(http.Dir("./web")) } /* func NewUser(w http.ResponseWriter, r *http.Request) { ipFilter(w, r) decoder := json.NewDecoder(r.Body) var newUser UserModel err := decoder.Decode(&newUser) check(err) defer r.Body.Close() saveUser(userCollection, newUser) fmt.Println(newUser) fmt.Fprintln(w, "new user added: ", newUser.ID) } */ func AllAddresses(w http.ResponseWriter, r *http.Request) { ipFilter(w, r) nodes := []NodeModel{} iter := nodeCollection.Find(bson.M{"type": "address"}).Limit(10000).Iter() err := iter.All(&nodes) //convert []resp struct to json jsonNodes, err := json.Marshal(nodes) check(err) fmt.Fprintln(w, string(jsonNodes)) } func GetLastAddr(w http.ResponseWriter, r *http.Request) { ipFilter(w, r) nodes := []NodeModel{} err := nodeCollection.Find(bson.M{}).Limit(10).Sort("-$natural").All(&nodes) check(err) //convert []resp struct to json jNodes, err := json.Marshal(nodes) check(err) fmt.Fprintln(w, string(jNodes)) } func GetLastTx(w http.ResponseWriter, r *http.Request) { ipFilter(w, r) edges := []EdgeModel{} err := edgeCollection.Find(bson.M{}).Limit(10).Sort("-$natural").All(&edges) check(err) //convert []resp struct to json jsonData, err := json.Marshal(edges) check(err) fmt.Fprintln(w, string(jsonData)) } func AddressNetwork(w http.ResponseWriter, r *http.Request) { ipFilter(w, r) vars := mux.Vars(r) address := vars["address"] if address == "undefined" { fmt.Fprintln(w, "not valid address") } else { network := addressTree(address) //convert []resp struct to json jNetwork, err := json.Marshal(network) check(err) fmt.Fprintln(w, string(jNetwork)) } } func AddressSankey(w http.ResponseWriter, r *http.Request) { ipFilter(w, r) vars := mux.Vars(r) address := vars["address"] if address == "undefined" { fmt.Fprintln(w, "not valid address") } else { network := addressTree(address) var sankey SankeyModel fmt.Println("network generated") mapNodeK := make(map[string]int) for k, n := range network.Nodes { var sankeyNode SankeyNodeModel //sankeyNode.StringNode = n.Id sankeyNode.Node = k sankeyNode.Name = n.Id sankey.Nodes = append(sankey.Nodes, sankeyNode) mapNodeK[n.Id] = k } for _, e := range network.Edges { var sankeyLink SankeyLinkModel //sankeyLink.StringSource = e.From sankeyLink.Source = mapNodeK[e.From] //sankeyLink.StringTarget = e.To sankeyLink.Target = mapNodeK[e.To] sankeyLink.Value = e.Label sankey.Links = append(sankey.Links, sankeyLink) } fmt.Println("Sankey generated") //convert []resp struct to json jsonSankey, err := json.Marshal(sankey) check(err) fmt.Fprintln(w, string(jsonSankey)) } } func NetworkMap(w http.ResponseWriter, r *http.Request) { ipFilter(w, r) nodes, err := getAllNodes() check(err) edges, err := getAllEdges() check(err) var network NetworkModel network.Nodes = nodes network.Edges = edges //convert []resp struct to json jNetwork, err := json.Marshal(network) check(err) fmt.Fprintln(w, string(jNetwork)) } /* func SelectItem(w http.ResponseWriter, r *http.Request) { ipFilter(w, r) vars := mux.Vars(r) userid := vars["userid"] itemid := vars["itemid"] //find item item, err := getItemById(itemid) if err != nil { fmt.Fprintln(w, "item "+itemid+" not found") } //find user user, err := getUserById(userid) if err != nil { fmt.Fprintln(w, "user "+userid+" not found") } //increase TActed in item item.TActed = item.TActed + 1 //save item item, err = updateItem(item) check(err) fmt.Println(item) //add item to []Actions of user user.Actions = append(user.Actions, itemid) //save user user, err = updateUser(user) check(err) fmt.Println(user) fmt.Fprintln(w, "user: "+userid+", selects item: "+itemid) } */ func GetHourAnalysis(w http.ResponseWriter, r *http.Request) { ipFilter(w, r) hourAnalysis := []HourCountModel{} iter := hourCountCollection.Find(bson.M{}).Limit(10000).Iter() err := iter.All(&hourAnalysis) //sort by hour sort.Slice(hourAnalysis, func(i, j int) bool { return hourAnalysis[i].Hour < hourAnalysis[j].Hour }) var resp HourAnalysisResp for _, d := range hourAnalysis { resp.Labels = append(resp.Labels, d.Hour) resp.Data = append(resp.Data, d.Count) } //convert []resp struct to json jsonResp, err := json.Marshal(resp) check(err) fmt.Fprintln(w, string(jsonResp)) }