From 43746485d4225fc64bcac421270a116f2f515139 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Mon, 13 Jul 2020 04:24:48 -0600 Subject: [PATCH] Can display but have not yet fetched one --- init.sh | 5 +++ main.go | 6 ++++ public/index.html | 88 +++++++++++++++++++++++++++++++++++++++++++++++ view/html.go | 45 ++++++++++++++++++++++++ view/html_test.go | 63 +++++++++++++++++++++++++++++++++ 5 files changed, 207 insertions(+) create mode 100644 public/index.html create mode 100644 view/html.go create mode 100644 view/html_test.go 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) +}