package main import ( "fmt" "html/template" "log" "net/http" "net/url" "strconv" "github.com/gorilla/mux" ) type Page struct { NewTree bool X, Y, W float64 } func overviewHandler(w http.ResponseWriter, r *http.Request) { t := template.Must(template.ParseFiles( "tmpl/overview.html", "tmpl/header.html", "tmpl/nav.html", "tmpl/javascript.html", )) templateExecuteError := t.ExecuteTemplate(w, "overview", &Page{}) if templateExecuteError != nil { log.Println(templateExecuteError) } } func newtreeHandler(w http.ResponseWriter, r *http.Request) { log.Println("the new tree handler was accessed") // if the method used to get the page is GET, simply respond with the tree-creation form if r.Method == "GET" { log.Println("using a GET method") t := template.Must(template.ParseFiles( "tmpl/newtree.html", "tmpl/header.html", "tmpl/nav.html", "tmpl/javascript.html", )) templateExecuteError := t.ExecuteTemplate(w, "newtree", &Page{}) if templateExecuteError != nil { log.Println(templateExecuteError) } } else { log.Println("using a POST method") // get the values from the form err := r.ParseForm() log.Println(err) log.Println("parsed the form") x, _ := strconv.ParseFloat(r.Form["x"][0], 64) // x position of the midpoint of the tree y, _ := strconv.ParseFloat(r.Form["y"][0], 64) // y position of the midpoint of the tree width, _ := strconv.ParseFloat(r.Form["w"][0], 64) // width the the tree dbip := r.Form["db-ip"][0] // ip address of the database log.Println("parsed the form arguments") // parse the template files t := template.Must(template.ParseFiles( "tmpl/newtree.html", "tmpl/header.html", "tmpl/nav.html", "tmpl/javascript.html", )) log.Println("parsed the template file") // execute the template templateExecuteError := t.ExecuteTemplate(w, "newtree", &Page{NewTree: true, X: x, Y: y, W: width}) log.Println("executed the template") // handle potential errors if templateExecuteError != nil { log.Println(templateExecuteError) } log.Println("handled potential errors") // create the new tree by accessing the api endpoint of the database postUrl := fmt.Sprintf("http://%s/new", dbip) log.Printf("the postURL: %s", postUrl) log.Println("created the url for the post request") // define the data that should be posted formData := url.Values{ "x": r.Form["x"], "y": r.Form["y"], "w": r.Form["w"], } log.Println("created the form to be sent in the post request") // make the http Post request resp, err := http.PostForm(postUrl, formData) log.Println("sent the post request") // some debug messages log.Printf("[ ] POST response: %v", resp) log.Printf("[ ] POST err: %v", err) } } func addstarsHandler(w http.ResponseWriter, r *http.Request) { // if the method used to get the page is GET, simply respond with the add-stars form if r.Method == "GET" { log.Println("/addstars was accessed using a GET method") t := template.Must(template.ParseFiles( "tmpl/addstars.html", "tmpl/header.html", "tmpl/nav.html", "tmpl/javascript.html", )) templateExecuteError := t.ExecuteTemplate(w, "addstars", &Page{}) if templateExecuteError != nil { log.Println(templateExecuteError) } } else { log.Println("/addstars was accessed using a POST method") // get the values from the form _ = r.ParseForm() log.Println("parsed the form") // extract some information from the form dbip := r.Form["dbip"][0] // ip address of the database treeindex, _ := strconv.ParseInt(r.Form["tree"][0], 10, 64) // index of the tree log.Println(dbip) log.Println(treeindex) log.Println("parsed the form arguments") t := template.Must(template.ParseFiles( "tmpl/addstars.html", "tmpl/header.html", "tmpl/nav.html", "tmpl/javascript.html", )) log.Println("parsed the template file") templateExecuteError := t.ExecuteTemplate(w, "addstars", &Page{}) if templateExecuteError != nil { log.Println(templateExecuteError) } log.Println("executed the template") // create the new tree by accessing the api endpoint of the database postUrl := fmt.Sprintf("http://%s/insert/%d", dbip, treeindex) log.Printf("the postURL: %s", postUrl) log.Println("created the url for the post request") // define the data that should be posted formData := url.Values{ "x": r.Form["x"], "y": r.Form["y"], "vx": r.Form["vx"], "vy": r.Form["vy"], "m": r.Form["mass"], } log.Println("created the form to be sent in the post request") // make the http Post request resp, err := http.PostForm(postUrl, formData) log.Println("sent the post request") // some debug messages log.Printf("[ ] POST response: %v", resp) log.Printf("[ ] POST err: %v", err) } } func drawtreeHandler(w http.ResponseWriter, r *http.Request) { } func main() { router := mux.NewRouter() router.HandleFunc("/", overviewHandler).Methods("GET") router.HandleFunc("/newtree", newtreeHandler).Methods("GET", "POST") router.HandleFunc("/addstars", addstarsHandler).Methods("GET", "POST") router.HandleFunc("/drawtree", drawtreeHandler).Methods("GET") log.Fatal(http.ListenAndServe(":8429", router)) }