Can display but have not yet fetched one

master
Bel LaPointe 2020-07-13 04:24:48 -06:00
parent 1b051ee1d5
commit 43746485d4
5 changed files with 207 additions and 0 deletions

View File

@ -20,4 +20,9 @@ mshell() {
--eval "$*"
}
remove() {
mshell \
'db.getSiblingDB("db")["col"].remove({})'
}
export DBURI=${DB_URI:-"mongodb://localhost:$port"}

View File

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

88
public/index.html Normal file
View File

@ -0,0 +1,88 @@
<html>
<header>
<meta charset="UTF-8">
<script>
function who(form) {
var items = {}
for (var i=0; i<form.length; i++) {
if (form[i].name)
items[form[i].name] = form[i].value
}
console.log(items)
return false;
}
function draw(one) {
var id = one.id
var meta = one.meta
var know = one.know
var html = "<div>\n"
html += '<h2>' + id + '</h2>\n'
html += '<ul>\n'
for(var k in meta) {
html += '<li>'
html += k + ': '
var lines = meta[k].split("\n")
if (lines.length == 1) {
html += lines[0]
} else {
html += "<ul>"
lines.forEach(function(e) {
html += "<li>" + e + "</li>"
})
html += "</ul>"
}
html += '</li>\n'
}
html += '</ul>\n'
html += '<h3>Knows</h3>\n'
html += '<ul>\n'
for(var k of know) {
html += '<li>\n'
var action = '\'who([{name: "id", value: "' + k.id + '"}])\''
html += "<a href='#' onclick=" + action + ">"
html += k.id + ", <i>" + k.relation + " </i>"
html += "</a>"
html += '</li>\n'
}
html += '</ul>\n'
html += "</div>\n"
document.getElementById("display").innerHTML += html
}
function draw_clear() {
document.getElementById("display").innerHTML = ""
}
</script>
</header>
<body>
<h1>Goodbye World</h1>
<form onsubmit="who(this); return false;">
<input name="id" type="text"/>
<input type="submit"/>
</form>
<div id="display">
</div>
</body>
<footer>
<script>
draw({
id: "id",
meta: {
"20200710": "hello",
"20200711": "world\n!",
},
know: [
{
id: "id0",
relation: ":)",
},
{
id: "id1",
relation: ":(",
},
]
})
</script>
</footer>
</html>

45
view/html.go Normal file
View File

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

63
view/html_test.go Normal file
View File

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