You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

261 lines
5.1 KiB

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