about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--main.go183
-rw-r--r--tmpl/addstars.html84
-rw-r--r--tmpl/header.html11
-rw-r--r--tmpl/index.html24
-rw-r--r--tmpl/javascript.html5
-rw-r--r--tmpl/nav.html20
-rw-r--r--tmpl/newtree.html60
-rw-r--r--tmpl/overview.html49
-rw-r--r--web/index.html41
9 files changed, 473 insertions, 4 deletions
diff --git a/main.go b/main.go
index 4088fb1..fbf524a 100644
--- a/main.go
+++ b/main.go
@@ -2,19 +2,194 @@ package main
 
 import (
 	"fmt"
+	"html/template"
 	"log"
 	"net/http"
+	"net/url"
+	"strconv"
 
 	"github.com/gorilla/mux"
 )
 
-func indexHandler(w http.ResponseWriter, r *http.Request) {
-	_, _ = fmt.Fprintln(w, "Hello World\nThis is the manager managing all the processes")
+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("/", indexHandler).Methods("GET")
-	log.Fatal(http.ListenAndServe(":80", router))
+	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))
 }
diff --git a/tmpl/addstars.html b/tmpl/addstars.html
new file mode 100644
index 0000000..cffc31e
--- /dev/null
+++ b/tmpl/addstars.html
@@ -0,0 +1,84 @@
+{{define "addstars"}}
+    <head>
+        {{template "header"}}
+        <style>
+            .jumbotron{
+                margin: 10px;
+            }
+        </style>
+    </head>
+    <body>
+    {{template "nav"}}
+
+    <div class="container">
+        <div class="tab-content" id="nav-tabContent">
+            <div class="tab-pane fade" id="nav-overview" role="tabpanel" aria-labelledby="nav-overview-tab">There will be an overview here!</div>
+            <div class="tab-pane fade" id="nav-new-tree" role="tabpanel" aria-labelledby="nav-new-tree-tab">add tree</div>
+            <div class="tab-pane fade" id="nav-add-stars" role="tabpanel" aria-labelledby="nav-add-stars-tab">Add some stars!</div>
+            <div class="tab-pane fade" id="nav-draw-tree" role="tabpanel" aria-labelledby="nav-draw-tree-tab">Draw one of the galaxies!</div>
+        </div>
+    </div>
+
+    <div class="container">
+        <div class="jumbotron">
+            <h1 class="display-4">Add Stars</h1>
+            <p class="lead">This is the "Add your star to a tree" page! Fill out the form below for adding one of your stars into one of the trees!</p>
+            <form action="/addstars" method="post">
+
+                <hr class="my-4">
+                <div class="form-group">
+                    <input type="text" class="form-control" id="dbip" placeholder="db-ip" name="dbip">
+                </div>
+                <div class="form-group">
+                    <input type="text" class="form-control" id="tree" placeholder="tree index" name="tree">
+                </div>
+                <hr class="my-4">
+
+                <div class="form-group">
+                    <input type="text" class="form-control" id="x" placeholder="x" name="x">
+                </div>
+                <div class="form-group">
+                    <input type="text" class="form-control" id="y" placeholder="y" name="y">
+                </div>
+                <div class="form-group">
+                    <input type="text" class="form-control" id="vx" placeholder="vx" name="vx">
+                </div>
+                <div class="form-group">
+                    <input type="text" class="form-control" id="vy" placeholder="vy" name="vy">
+                </div>
+                <div class="form-group">
+                    <input type="text" class="form-control" id="m" placeholder="mass" name="mass">
+                </div>
+                <button type="submit" class="btn btn-primary">Submit</button>
+            </form>
+        </div>
+    </div>
+
+    <div class="container">
+        <div class="jumbotron">
+            <p class="lead">Optionally: select a .csv:</p>
+            <div class="input-group">
+                <div class="input-group-prepend">
+                    <span class="input-group-text" id="inputGroupFileAddon01">Upload</span>
+                </div>
+                <div class="custom-file">
+                    <input type="file" class="custom-file-input" id="inputGroupFile01" aria-describedby="inputGroupFileAddon01">
+                    <label class="custom-file-label" for="inputGroupFile01">Choose file</label>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="container">
+        <div class="jumbotron">
+            <form enctype="multipart/form-data" action="http://127.0.0.1:9090/upload" method="post">
+                <input type="file" name="uploadfile" />
+                <input type="hidden" name="token" value="{{.}}"/>
+                <input type="submit" value="upload" />
+            </form>
+        </div>
+    </div>
+
+    {{template "javascript"}}
+    </body>
+{{end}}
diff --git a/tmpl/header.html b/tmpl/header.html
new file mode 100644
index 0000000..57e749e
--- /dev/null
+++ b/tmpl/header.html
@@ -0,0 +1,11 @@
+{{define "header"}}
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <title>emile.space</title>
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
+    <style>
+        .nav {
+            margin: 10px;
+        }
+    </style>
+{{end}}
diff --git a/tmpl/index.html b/tmpl/index.html
new file mode 100644
index 0000000..1f22908
--- /dev/null
+++ b/tmpl/index.html
@@ -0,0 +1,24 @@
+{{define "index"}}
+    <head>
+        {{template "header"}}
+        <style>
+            .jumbotron{
+                margin: 10px;
+            }
+        </style>
+    </head>
+    <body>
+    {{template "nav"}}
+
+    <div class="container">
+        <div class="tab-content" id="nav-tabContent">
+            <div class="tab-pane fade" id="nav-overview" role="tabpanel" aria-labelledby="nav-overview-tab">There will be an overview here!</div>
+            <div class="tab-pane fade" id="nav-new-tree" role="tabpanel" aria-labelledby="nav-new-tree-tab">add tree</div>
+            <div class="tab-pane fade" id="nav-add-stars" role="tabpanel" aria-labelledby="nav-add-stars-tab">Add some stars!</div>
+            <div class="tab-pane fade" id="nav-draw-tree" role="tabpanel" aria-labelledby="nav-draw-tree-tab">Draw one of the galaxies!</div>
+        </div>
+    </div>
+
+    {{template "javascript"}}
+    </body>
+{{end}}
diff --git a/tmpl/javascript.html b/tmpl/javascript.html
new file mode 100644
index 0000000..54b2810
--- /dev/null
+++ b/tmpl/javascript.html
@@ -0,0 +1,5 @@
+{{define "javascript"}}
+<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
+<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
+{{end}}
diff --git a/tmpl/nav.html b/tmpl/nav.html
new file mode 100644
index 0000000..9c7a94b
--- /dev/null
+++ b/tmpl/nav.html
@@ -0,0 +1,20 @@
+{{define "nav"}}
+<div class="container">
+    <nav>
+        <ul class="nav nav-tabs">
+            <li class="nav-item">
+                <a class="nav-link" href="/">Overview</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link" href="/newtree">New Tree</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link" href="/addstars">Add Stars</a>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link" href="/drawtree">Draw Tree</a>
+            </li>
+        </ul>
+    </nav>
+</div>
+{{end}}
diff --git a/tmpl/newtree.html b/tmpl/newtree.html
new file mode 100644
index 0000000..974e45c
--- /dev/null
+++ b/tmpl/newtree.html
@@ -0,0 +1,60 @@
+{{define "newtree"}}
+    <head>
+        {{template "header"}}
+        <style>
+            .jumbotron{
+                margin: 10px;
+            }
+        </style>
+    </head>
+    <body>
+    {{template "nav"}}
+
+    <div class="container">
+        <div class="tab-content" id="nav-tabContent">
+            <div class="tab-pane fade" id="nav-overview" role="tabpanel" aria-labelledby="nav-overview-tab">There will be an overview here!</div>
+            <div class="tab-pane fade" id="nav-new-tree" role="tabpanel" aria-labelledby="nav-new-tree-tab">add tree</div>
+            <div class="tab-pane fade" id="nav-add-stars" role="tabpanel" aria-labelledby="nav-add-stars-tab">Add some stars!</div>
+            <div class="tab-pane fade" id="nav-draw-tree" role="tabpanel" aria-labelledby="nav-draw-tree-tab">Draw one of the galaxies!</div>
+        </div>
+    </div>
+
+    <div class="container">
+        <div class="jumbotron">
+            <h1 class="display-4">New Tree</h1>
+            <p class="lead">This is the "Create your own tree" page! Fill out the form below to create a new (quad)tree storing a complete galaxy!</p>
+            <hr class="my-4">
+            <form action="/newtree" method="post">
+                <div class="form-group">
+                    <label for="db-ip">The ip of the database</label>
+                    <input type="text" class="form-control" id="x-pos" placeholder="db-ip" name="db-ip">
+                </div>
+                <div class="form-group">
+                    <label for="x-pos">(Center) X Position</label>
+                    <input type="text" class="form-control" id="x-pos" placeholder="x-pos" name="x">
+                </div>
+                <div class="form-group">
+                    <label for="y-pos">(Center) Y Position</label>
+
+                    <input type="text" class="form-control" id="y-pos" placeholder="y-pos" name="y">
+                </div>
+                <div class="form-group">
+                    <label for="width">Width</label>
+                    <input type="text" class="form-control" id="width" placeholder="width" name="w">
+                </div>
+                <button type="submit" class="btn btn-primary">Submit</button>
+            </form>
+        </div>
+        {{if .NewTree}}
+            <div class="alert alert-success alert-dismissible fade show" role="success">
+                <strong>Successfully created the tree!</strong> (x:{{.X}}, y:{{.Y}}), width: {{.W}}
+                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+        {{end}}
+    </div>
+
+    {{template "javascript"}}
+    </body>
+{{end}}
diff --git a/tmpl/overview.html b/tmpl/overview.html
new file mode 100644
index 0000000..7f20c2c
--- /dev/null
+++ b/tmpl/overview.html
@@ -0,0 +1,49 @@
+{{define "overview"}}
+    <head>
+        {{template "header"}}
+    </head>
+    <body>
+        {{template "nav"}}
+        <div id="wrap">
+            <div class="container">
+                <h3>Existing galaxies</h3>
+                <table cellpadding="0" cellspacing="0" border="0" class="datatable table table-striped table-bordered">
+                    <thead>
+                        <tr>
+                            <th>Index</th>
+                            <th>Boundary</th>
+                            <th>Amounf of stars</th>
+                            <th>Range</th>
+                        </tr>
+                    </thead>
+
+                    <tbody>
+                        <tr class="gradeX">
+                            <td>1</td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                        </tr>
+                        <tr class="gradeX">
+                            <td>2</td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                        </tr>
+                        <tr class="gradeX">
+                            <td>3</td>
+                            <td></td>
+                            <td></td>
+                            <td></td>
+                        </tr>
+                    </tbody>
+
+                    <tfoot>
+                    </tfoot>
+                </table>
+            </div>
+        </div>
+
+        {{template "javascript"}}
+    </body>
+{{end}}
\ No newline at end of file
diff --git a/web/index.html b/web/index.html
new file mode 100644
index 0000000..51627b0
--- /dev/null
+++ b/web/index.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <!-- Required meta tags -->
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+
+    <!-- Bootstrap CSS -->
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
+
+    <title>Hello, world!</title>
+
+    <style>
+        .nav {
+            margin: 10px;
+        }
+    </style>
+</head>
+<body>
+    <nav>
+        <div class="nav nav-tabs" id="nav-tab" role="tablist">
+            <a class="nav-item nav-link active" id="nav-overview-tab" data-toggle="tab" href="#nav-overview" role="tab" aria-controls="nav-overview" aria-selected="true">Overview</a>
+            <a class="nav-item nav-link" id="nav-new-tree-tab" data-toggle="tab" href="#nav-new-tree" role="tab" aria-controls="nav-new-tree" aria-selected="false">New Tree</a>
+            <a class="nav-item nav-link" id="nav-add-stars-tab" data-toggle="tab" href="#nav-add-stars" role="tab" aria-controls="nav-add-stars" aria-selected="false">Add Stars</a>
+            <a class="nav-item nav-link" id="nav-draw-tree-tab" data-toggle="tab" href="#nav-draw-tree" role="tab" aria-controls="nav-contact" aria-selected="false">Draw Tree</a>
+        </div>
+    </nav>
+    <div class="tab-content" id="nav-tabContent">
+        <div class="tab-pane fade show active" id="nav-overview" role="tabpanel" aria-labelledby="nav-overview-tab">This is the main overview page!</div>
+        <div class="tab-pane fade" id="nav-new-tree" role="tabpanel" aria-labelledby="nav-new-tree-tab">Create a new tree!</div>
+        <div class="tab-pane fade" id="nav-add-stars" role="tabpanel" aria-labelledby="nav-add-stars-tab">Add some stars!</div>
+        <div class="tab-pane fade" id="nav-draw-tree" role="tabpanel" aria-labelledby="nav-draw-tree-tab">Draw one of the galaxies!</div>
+    </div>
+
+    <!-- Optional JavaScript -->
+    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
+    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
+</body>
+</html>
\ No newline at end of file