all repos — felt @ 51f50d679de76b17ee0445bf8718d5d894162b75

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

admin: add upload handlers
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmQC0bUACgkQO3+8IhRO
Y5go2w/9HRlbKvBvgU7k6hjfn2OxkJjTNKy39qP4hYogrjKb1DwbNk7Da+F+vTMY
Prc05btPT1Xx5dZqV2kcLukU4FZVLBnvBqhzY/C9f1NlYCvhgYUcR+rpdqDMpyVc
7mUmnQuVj8WPVUoQzE6jx8lIu06JKp+18j3Jd9/BLxgjCR21SmAH1fwPrriHWHcE
7WZYBshAChU0VV2zumPDzf+ieb5lhwfHTSfQGVVpgKKf9C9qPHtwNZ62Y2uoDHWX
/5qdUVZLulXBnwLVdaoPt65Z+svrvTMs2JxS813FPTPuNR7aIs+qIzAq357EmqBH
s4XJNmmIygfQETaBdOyipI8z9F7gaF/qSObh+m54qFxQgFhEWMCCUKfLvmW98qBR
OlXESGMCFpcqlq0VtV2e6Ild/QL01rozC6OJrjWnStr2imQZlSkAJWDA/+BpnkKM
2yPsSkHj2jAr+dJxGIHJxeTWKw4/Klum4g9dPs+RCJ+5lbOTS6r8ePqd+YEFfsO1
YQ/V9IZvm6t0Xf4ZXp++DfT9FUv9wQl/xZXy4Wk8b0PWT7/GSw5Kvv14C5qJtdeE
AGo2gmzDUYm8yN4YmIWToVpfYCqbaMNocJ32nYBUfB0B3XpDZYnc7XdHstQzlDW4
GbdwTewfRL1RG8GuCohPP6d3iM4AF+cM3eQ4EbBgoqv4vKbiU0I=
=Nf/u
-----END PGP SIGNATURE-----
commit

51f50d679de76b17ee0445bf8718d5d894162b75

parent

c6c68aa443563e4d02adc1eb929f88c323192f43

1 files changed, 58 insertions(+), 4 deletions(-)

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

@@ -12,7 +12,10 @@ "hacklab.nilfm.cc/quartzgun/renderer"

"hacklab.nilfm.cc/quartzgun/router" . "hacklab.nilfm.cc/quartzgun/util" "html/template" + "io/ioutil" "net/http" + "os" + "path/filepath" ) func apiGetTableList(next http.Handler, udb auth.UserStore) http.Handler {

@@ -135,6 +138,7 @@ w.WriteHeader(204)

} else { w.WriteHeader(404) } + next.ServeHTTP(w, req) } else { w.WriteHeader(500)

@@ -145,13 +149,63 @@

return http.HandlerFunc(handlerFunc) } -func apiUploadMapImg(next http.Handler, udb auth.UserStore, dbAdapter mongodb.DbAdapter) 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) { + // get table from request body + tableKey := models.TableKey{} + err := json.NewDecoder(req.Body).Decode(&tableKey) + if err != nil { + w.WriteHeader(400) + next.ServeHTTP(w, req) + return + } + + // check if this table exists + if !dbAdapter.CheckTable(tableKey) { + w.WriteHeader(401) + next.ServeHTTP(w, req) + return + } + // ensure data storage dir exists + info, err := os.Stat(uploads) + if !info.IsDir() { + w.WriteHeader(500) + next.ServeHTTP(w, req) + } else if err != nil { + err = os.MkdirAll(filepath.Join(uploads, tableKey.Name, uploadType), 0755) + if err != nil { + w.WriteHeader(500) + next.ServeHTTP(w, req) + } + } // check for filename; call create to overwrite regardless // get file data from multipart form + req.ParseMultipartForm(int64(uploadMax << 20)) + file, header, err := req.FormFile("file") + if err != nil { + w.WriteHeader(500) + next.ServeHTTP(w, req) + } + fileData, err := ioutil.ReadAll(file) + if err != nil { + w.WriteHeader(500) + next.ServeHTTP(w, req) + } // write to file - // respond with URL? + destPath := filepath.Join(uploads, tableKey.Name, uploadType, header.Filename) + dest, err := os.Create(destPath) + if err != nil { + w.WriteHeader(500) + next.ServeHTTP(w, req) + } + dest.Write(fileData) + dest.Close() + // respond with URL so UI can update + w.WriteHeader(201) + w.Header().Set("Content-Type", "application/json") + AddContextValue(req, "location", "/uploads/"+tableKey.Name+"/"+uploadType+"/"+header.Filename) + next.ServeHTTP(w, req) } return http.HandlerFunc(handlerFunc)

@@ -172,9 +226,9 @@ rtr.Post("/api/table/", Validate(apiCreateTable(renderer.JSON("result"), udb, dbAdapter), udb, scopes))

rtr.Delete(`/api/table/(?P<Slug>\S+)`, Validate(apiDestroyTable(renderer.JSON("result"), udb, dbAdapter), udb, scopes)) // asset management - // POST /api/upload/<table>/map/ + rtr.Post(`/api/upload/(?P<Slug>\S+)/map/`, Validate(apiUploadMapImg(renderer.JSON("location"), udb, dbAdapter, uploads, "map", uploadMaxMB), udb, scopes)) // DELETE /api/upload/<table>/map/<map> - // POST /api/upload/<table>/token/ + rtr.Post(`/api/upload/(?P<Slug>\S+)/token/`, Validate(apiUploadMapImg(renderer.JSON("location"), udb, dbAdapter, uploads, "token", uploadMaxMB), udb, scopes)) // DELETE /api/upload/<table>/token/<token> return http.HandlerFunc(rtr.ServeHTTP)