upload map image and displaying on connect works (still need to send broadcast on the socket when upload happens)
This commit is contained in:
parent
51f50d679d
commit
16d58eb281
5 changed files with 71 additions and 15 deletions
|
@ -2,7 +2,7 @@ package admin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
_ "fmt"
|
"fmt"
|
||||||
"hacklab.nilfm.cc/felt/admin/util"
|
"hacklab.nilfm.cc/felt/admin/util"
|
||||||
"hacklab.nilfm.cc/felt/models"
|
"hacklab.nilfm.cc/felt/models"
|
||||||
"hacklab.nilfm.cc/felt/mongodb"
|
"hacklab.nilfm.cc/felt/mongodb"
|
||||||
|
@ -152,12 +152,19 @@ func apiDestroyTable(next http.Handler, udb auth.UserStore, dbAdapter mongodb.Db
|
||||||
func apiUploadMapImg(next http.Handler, udb auth.UserStore, dbAdapter mongodb.DbAdapter, uploads, uploadType string, uploadMax int) http.Handler {
|
func apiUploadMapImg(next http.Handler, udb auth.UserStore, dbAdapter mongodb.DbAdapter, uploads, uploadType string, uploadMax int) http.Handler {
|
||||||
handlerFunc := func(w http.ResponseWriter, req *http.Request) {
|
handlerFunc := func(w http.ResponseWriter, req *http.Request) {
|
||||||
// get table from request body
|
// get table from request body
|
||||||
tableKey := models.TableKey{}
|
r, err := req.MultipartReader()
|
||||||
err := json.NewDecoder(req.Body).Decode(&tableKey)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(400)
|
fmt.Println(err.Error())
|
||||||
next.ServeHTTP(w, req)
|
}
|
||||||
return
|
|
||||||
|
f, err := r.ReadForm(int64(uploadMax << 20))
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
tableKey := models.TableKey{
|
||||||
|
Name: f.Value["name"][0],
|
||||||
|
Passcode: f.Value["passcode"][0],
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if this table exists
|
// check if this table exists
|
||||||
|
@ -170,20 +177,25 @@ func apiUploadMapImg(next http.Handler, udb auth.UserStore, dbAdapter mongodb.Db
|
||||||
// ensure data storage dir exists
|
// ensure data storage dir exists
|
||||||
info, err := os.Stat(uploads)
|
info, err := os.Stat(uploads)
|
||||||
if !info.IsDir() {
|
if !info.IsDir() {
|
||||||
|
fmt.Println("uploads dir aint no dir")
|
||||||
w.WriteHeader(500)
|
w.WriteHeader(500)
|
||||||
next.ServeHTTP(w, req)
|
next.ServeHTTP(w, req)
|
||||||
|
return
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
err = os.MkdirAll(filepath.Join(uploads, tableKey.Name, uploadType), 0755)
|
err = os.MkdirAll(uploads, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fmt.Println(err.Error())
|
||||||
w.WriteHeader(500)
|
w.WriteHeader(500)
|
||||||
next.ServeHTTP(w, req)
|
next.ServeHTTP(w, req)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
err = os.MkdirAll(filepath.Join(uploads, tableKey.Name, uploadType), 0755)
|
||||||
// check for filename; call create to overwrite regardless
|
// check for filename; call create to overwrite regardless
|
||||||
// get file data from multipart form
|
// get file data from multipart form
|
||||||
req.ParseMultipartForm(int64(uploadMax << 20))
|
header := f.File["file"][0]
|
||||||
file, header, err := req.FormFile("file")
|
file, err := header.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fmt.Println(err.Error())
|
||||||
w.WriteHeader(500)
|
w.WriteHeader(500)
|
||||||
next.ServeHTTP(w, req)
|
next.ServeHTTP(w, req)
|
||||||
}
|
}
|
||||||
|
@ -194,15 +206,21 @@ func apiUploadMapImg(next http.Handler, udb auth.UserStore, dbAdapter mongodb.Db
|
||||||
}
|
}
|
||||||
// write to file
|
// write to file
|
||||||
destPath := filepath.Join(uploads, tableKey.Name, uploadType, header.Filename)
|
destPath := filepath.Join(uploads, tableKey.Name, uploadType, header.Filename)
|
||||||
|
fmt.Println(destPath)
|
||||||
dest, err := os.Create(destPath)
|
dest, err := os.Create(destPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fmt.Println(err.Error())
|
||||||
w.WriteHeader(500)
|
w.WriteHeader(500)
|
||||||
next.ServeHTTP(w, req)
|
next.ServeHTTP(w, req)
|
||||||
}
|
}
|
||||||
dest.Write(fileData)
|
dest.Write(fileData)
|
||||||
dest.Close()
|
dest.Close()
|
||||||
|
|
||||||
|
err = dbAdapter.SetMapImageUrl(tableKey, "/uploads/"+tableKey.Name+"/"+uploadType+"/"+header.Filename)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err.Error())
|
||||||
|
}
|
||||||
// respond with URL so UI can update
|
// respond with URL so UI can update
|
||||||
w.WriteHeader(201)
|
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
AddContextValue(req, "location", "/uploads/"+tableKey.Name+"/"+uploadType+"/"+header.Filename)
|
AddContextValue(req, "location", "/uploads/"+tableKey.Name+"/"+uploadType+"/"+header.Filename)
|
||||||
next.ServeHTTP(w, req)
|
next.ServeHTTP(w, req)
|
||||||
|
|
|
@ -45,6 +45,7 @@ func New(adapter mongodb.DbAdapter, udb auth.UserStore, uploads string, uploadMa
|
||||||
dbAdapter: adapter,
|
dbAdapter: adapter,
|
||||||
}
|
}
|
||||||
srvr.serveMux.Handle("/table/", http.StripPrefix("/table/", renderer.Subtree("./static")))
|
srvr.serveMux.Handle("/table/", http.StripPrefix("/table/", renderer.Subtree("./static")))
|
||||||
|
srvr.serveMux.Handle("/uploads/", http.StripPrefix("/uploads/", renderer.Subtree(uploads)))
|
||||||
srvr.serveMux.Handle("/admin/", http.StripPrefix("/admin", admin.CreateAdminInterface(udb, adapter, uploads, uploadMaxMB)))
|
srvr.serveMux.Handle("/admin/", http.StripPrefix("/admin", admin.CreateAdminInterface(udb, adapter, uploads, uploadMaxMB)))
|
||||||
srvr.serveMux.HandleFunc("/subscribe", srvr.subscribeHandler)
|
srvr.serveMux.HandleFunc("/subscribe", srvr.subscribeHandler)
|
||||||
srvr.serveMux.HandleFunc("/publish", srvr.publishHandler)
|
srvr.serveMux.HandleFunc("/publish", srvr.publishHandler)
|
||||||
|
|
|
@ -213,7 +213,7 @@ func (self *DbEngine) SetMapImageUrl(table models.TableKey, url string) error {
|
||||||
{"passcode", table.Passcode},
|
{"passcode", table.Passcode},
|
||||||
},
|
},
|
||||||
bson.D{
|
bson.D{
|
||||||
{"mapImageUrl", url},
|
{"$set", bson.D{{"mapImageUrl", url}}},
|
||||||
},
|
},
|
||||||
).Decode(&result)
|
).Decode(&result)
|
||||||
|
|
||||||
|
@ -254,7 +254,7 @@ func (self *DbEngine) SetAuxMessage(table models.TableKey, message string) error
|
||||||
{"passcode", table.Passcode},
|
{"passcode", table.Passcode},
|
||||||
},
|
},
|
||||||
bson.D{
|
bson.D{
|
||||||
{"auxMessage", message},
|
{"$set", bson.D{{"auxMessage", message}}},
|
||||||
},
|
},
|
||||||
).Decode(&result)
|
).Decode(&result)
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,8 @@ async function getTable(name, pass) {
|
||||||
infoHtml = "<a href='#' onclick='getTables()'>← table list</a><br><pre>";
|
infoHtml = "<a href='#' onclick='getTables()'>← table list</a><br><pre>";
|
||||||
infoHtml += await res.text();
|
infoHtml += await res.text();
|
||||||
infoHtml += "</pre>"
|
infoHtml += "</pre>"
|
||||||
infoHtml += `<button onclick='destroyTable()'>Destroy</button>`
|
infoHtml += "<input id='map_img_upload' type='file'>Map Image</input><button onclick='uploadMapImg()'>Upload</button>"
|
||||||
|
infoHtml += "<button onclick='destroyTable()'>Destroy</button>"
|
||||||
adminZone.innerHTML = infoHtml;
|
adminZone.innerHTML = infoHtml;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -32,6 +33,30 @@ async function getTable(name, pass) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function uploadMapImg() {
|
||||||
|
try {
|
||||||
|
var input = document.getElementById("map_img_upload");
|
||||||
|
var data = new FormData();
|
||||||
|
data.append('file', input.files[0]);
|
||||||
|
data.append('name', tableKey.name);
|
||||||
|
data.append('passcode', tableKey.passcode);
|
||||||
|
const headers = new Headers();
|
||||||
|
headers.set('Authorization', 'Bearer ' + adminToken.access_token);
|
||||||
|
res = await fetch(`/admin/api/upload/${tableKey.name}/map/`, {
|
||||||
|
headers: headers,
|
||||||
|
method: "POST",
|
||||||
|
body: data,
|
||||||
|
});
|
||||||
|
if (res.ok) {
|
||||||
|
getTable(tableKey.name, tableKey.passcode);
|
||||||
|
} else {
|
||||||
|
throw new Error("Something went wrong uploading the map BG...");
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
setErr(`${err.name}: ${err.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function destroyTable() {
|
async function destroyTable() {
|
||||||
try {
|
try {
|
||||||
const headers = new Headers();
|
const headers = new Headers();
|
||||||
|
|
|
@ -40,11 +40,20 @@ function logDice(dice, many) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function makeUpToDate(table) {
|
function makeUpToDate(table) {
|
||||||
if (table && table.diceRolls) {
|
if (table) {
|
||||||
logDice(table.diceRolls, true);
|
if (table.diceRolls) {
|
||||||
|
logDice(table.diceRolls, true);
|
||||||
|
}
|
||||||
|
if (table.mapImageUrl) {
|
||||||
|
setMapImg(table.mapImageUrl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setMapImg(url) {
|
||||||
|
document.getElementById("map").innerHTML = `<img src="${url}"/>`
|
||||||
|
}
|
||||||
|
|
||||||
function dial() {
|
function dial() {
|
||||||
// get tableKey from UI
|
// get tableKey from UI
|
||||||
const tblNameInput = document.getElementById("input_table_name");
|
const tblNameInput = document.getElementById("input_table_name");
|
||||||
|
@ -95,6 +104,9 @@ function dial() {
|
||||||
if (data.diceRoll) {
|
if (data.diceRoll) {
|
||||||
logDice(data.diceRoll);
|
logDice(data.diceRoll);
|
||||||
}
|
}
|
||||||
|
if (data.mapImageUrl) {
|
||||||
|
setMapImg(data.mapImageUrl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
console.log(data);
|
console.log(data);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue