diff --git a/init.sh b/init.sh
index c0017d3..5c13271 100644
--- a/init.sh
+++ b/init.sh
@@ -20,4 +20,9 @@ mshell() {
--eval "$*"
}
+remove() {
+ mshell \
+ 'db.getSiblingDB("db")["col"].remove({})'
+}
+
export DBURI=${DB_URI:-"mongodb://localhost:$port"}
diff --git a/main.go b/main.go
index d00a1ce..94d9a2b 100644
--- a/main.go
+++ b/main.go
@@ -2,10 +2,16 @@ package main
import (
"local/whodunit/config"
+ "local/whodunit/storage"
+ "local/whodunit/view"
"log"
)
func main() {
c := config.New()
log.Println(c)
+ g := storage.NewGraph()
+ if err := view.Html(g); err != nil {
+ panic(err)
+ }
}
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 0000000..8e28c4f
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,88 @@
+
+
+
+ Goodbye World
+
+
+
+
+
+
diff --git a/view/html.go b/view/html.go
new file mode 100644
index 0000000..3d44e55
--- /dev/null
+++ b/view/html.go
@@ -0,0 +1,45 @@
+package view
+
+import (
+ "encoding/json"
+ "fmt"
+ "local/whodunit/config"
+ "local/whodunit/storage"
+ "net/http"
+)
+
+func Html(g storage.Graph) error {
+ err := http.ListenAndServe(fmt.Sprintf(":%d", config.New().Port), foo(g))
+ return err
+}
+
+func foo(g storage.Graph) http.Handler {
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ var err error
+ switch r.URL.Path {
+ case "/who":
+ err = who(g, w, r)
+ default:
+ http.NotFound(w, r)
+ return
+ }
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ }
+ })
+}
+
+func who(g storage.Graph, w http.ResponseWriter, r *http.Request) error {
+ results := make(map[string]storage.One)
+ for _, id := range r.URL.Query()["id"] {
+ ones, err := g.List(r.Context(), id)
+ if err != nil {
+ return err
+ }
+ if len(ones) != 1 {
+ ones = nil
+ }
+ results[id] = ones[0]
+ }
+ return json.NewEncoder(w).Encode(results)
+}
diff --git a/view/html_test.go b/view/html_test.go
new file mode 100644
index 0000000..685a064
--- /dev/null
+++ b/view/html_test.go
@@ -0,0 +1,63 @@
+package view
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "local/whodunit/config"
+ "local/whodunit/storage"
+ "net/http"
+ "os"
+ "testing"
+ "time"
+)
+
+func TestHtml(t *testing.T) {
+ if len(os.Getenv("INTEGRATION")) > 0 {
+ t.Logf("skipping because $INTEGRATION unset")
+ return
+ }
+
+ os.Args = os.Args[:1]
+ g := storage.NewGraph()
+ ones := []storage.One{
+ storage.One{
+ ID: "A",
+ Know: []storage.One{storage.One{}},
+ },
+ storage.One{
+ ID: "B",
+ Know: []storage.One{storage.One{}},
+ },
+ }
+ ones[0].Know[0] = ones[1]
+ ones[0].Know[0].Know = nil
+ ones[0].Know[0].Relation = ":)"
+ ones[1].Know[0] = ones[0]
+ ones[1].Know[0].Know = nil
+ ones[1].Know[0].Relation = ":("
+
+ g.Insert(context.TODO(), ones[0])
+ g.Insert(context.TODO(), ones[1])
+
+ go func() {
+ if err := Html(g); err != nil {
+ t.Fatal(err)
+ }
+ }()
+ time.Sleep(time.Millisecond * 250)
+ resp, err := http.Get(fmt.Sprintf("http://localhost:%d/who?id=A&id=B", config.New().Port))
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer resp.Body.Close()
+ var v interface{}
+ if err := json.NewDecoder(resp.Body).Decode(&v); err != nil {
+ t.Fatal(err)
+ }
+ b, err := json.MarshalIndent(v, "", " ")
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Logf("\n%s\n", b)
+}