all repos — felt @ 4ea3e656d687f901f5d30c56d9196e9b99077dcb

virtual tabletop for dungeons and dragons (and similar) using Go, MongoDB, and websockets

implement table deletion, get ready for map upload
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmP68YoACgkQO3+8IhRO
Y5jh5Q/9EH5sWHOOs0sitez96MQnK8UDMt1iggHID54s3kgxf5/8dRROgtsJMKy5
6dRaYphd7aQuo9DMDgGJlgJ7lvDDceqNQZS7RuF5bDGYd8vHIGphXu9j4AbqiRhc
nMzTouo96Prlgfyt92Nw6xyYZ5MOCHttJXIDP8P8ACSxjT31OzVPEbJGT+OnqdQh
fS7pkQ33wCoDZArgBLtGK3cKd5VPv1ISvJJux8abFqUXD3jV85WBffsVLUzn9Beg
T7pD5BQBGIcPL8mJ7bfRKhPiXZCMXTklzTU4iJGPQ7ngV0vswFQhoCwA7p4RRogb
DVbLFGT99zkHxJZ7/lRdEMf4R6RUsK1EspYTD/c4PC0tJGoVn/c4NB8NWQk3j9Ct
EH78c9SrzftUYj0n2Sk7eX1be1cNMt8+JwjzeuKEvLl7dcMbBn/rbcsr9g5WC3Xs
/QpgeLRJ2aKGBQSQ82mtA3t8sSsY+fl2h2yjIIBdWKViSergnz6EtTyd9DOhll2c
b4pzdUC5MX6eSuh5ELOLZbZLVanFXhX0DehHeftJLOAWLW4XaGiUaMENqiFxrLuC
MUQe8UEkqJ/fm+yGi0EVjGnmNZp3KJnKbEcwrSQ0ib42sVETAv6oA7pQ9rVgQVYv
0i4xHNGSnlalReEbssYDFORrsupH9oXBh/jKThHXWvnlVx7cqbQ=
=/Gbc
-----END PGP SIGNATURE-----
commit

4ea3e656d687f901f5d30c56d9196e9b99077dcb

parent

4f9ca53e1bfb24febbe981c746405c50194f9303

3 files changed, 40 insertions(+), 9 deletions(-)

jump to
M admin/admin.goadmin/admin.go

@@ -112,12 +112,10 @@

destroy := false i := 0 - tableName := req.Context().Value("Slug") - tablePass := req.Form["passcode"][0] - - table := models.TableKey{ - Name: tableName.(string), - Passcode: tablePass, + table := models.TableKey{} + err = json.NewDecoder(req.Body).Decode(&table) + if err != nil { + w.WriteHeader(400) } for j, t := range tables {

@@ -145,6 +143,18 @@ next.ServeHTTP(w, req)

} return http.HandlerFunc(handlerFunc) +} + +func apiUploadMapImg(next http.Handler, udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.Handler { + handlerFunc := func(w http.ResponseWriter, req *http.Request) { + // ensure data storage dir exists + // check for filename; call create to overwrite regardless + // get file data from multipart form + // write to file + // respond with URL? + } + + return handlerFunc } func CreateAdminInterface(udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.Handler {
M static/admin.jsstatic/admin.js

@@ -21,13 +21,34 @@ dial();

infoHtml = "<a href='#' onclick='getTables()'>&larr; table list</a><br><pre>"; infoHtml += await res.text(); infoHtml += "</pre>" + infoHtml += `<button onclick='destroyTable()'>Destroy</button>` adminZone.innerHTML = infoHtml; } else { console.log(res.status); } } catch (err) { - console.dir(err) + setErr(`${err.name}: ${err.message}`); + } +} + +async function destroyTable() { + try { + const headers = new Headers(); + headers.set('Authorization', 'Bearer ' + adminToken.access_token); + const res = await fetch(`/admin/api/table/${tableKey.name}`, { + method: 'DELETE', + headers: headers, + body: JSON.stringify(tableKey) + }); + if (res.ok) { + conn.close(1000); + getTables(); + } else { + setErr(await res.json()); + } + } catch (err) { + setErr(`${err.name}: ${err.message}`); } }
M static/socket.jsstatic/socket.js

@@ -78,8 +78,8 @@ tabletop.style.display = "block";

} }); conn.addEventListener("error", e => { - setErr(JSON.stringify(e)); - conn.close(1002); + setErr(`${e.name}: ${e.message}`); + conn.close(3000); }) conn.addEventListener("message", e => {