all repos — felt @ 75eb4762329eaae6d9dbb27f60e7c5934c8eb8ea

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

admin: flesh out apiGetTableData and add table creation
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmOny6sACgkQO3+8IhRO
Y5gbNxAAmATrBmeHrF/n2WgYgJsqdcr5PxyEFLl6Wi9JdUVKNU8Jsbg5v73f9mDB
aG7kp0PeLmJ3xXKol9Df7gyvkQVaOeBwElx3a7T922xsE1XEkeOjgiRFSia09D0L
Ubj/O7jqeVS7vdW7VkINSvqfu9LeBDGmV1qgHq1/okdxxNcabHW60JW3mb7ISZpm
QHYXhSo4rkn7e18p+RCCvagreMWsPRdrSCoEyRBatpGm8P3FZ5IDJA1pZagftGyZ
Awj6ady6CV7tet4ZqshuJ/0y4jW0AwALhXpoNNtBZnp41y4+yTK340XuR4kBp68w
v3/iYIODh1tyWj+MIfCZWXz5F+egTDiCx5evqLiXi1H6ZYsd9PrvMVtuCOdOsEdl
Yb2LUZVnH4e91rN5k3E3YwKMcPsA+kDXCzA29r82bTcnaDEDzgcW8Y/EQB9Juka0
1CsjuB0emJTlHAIRsWnT9zPoZPhRdqpmmxCz/GqRU2jnH9+a5qtV7scFZm3Wx7U/
FE5YBcKSwu2jtB5kOsCKe55z2BU/bCtk+GSj/WRTauwy34L8hTpECTwE5FK3w/18
yP+PeIBtIIhOBiwmhn10fiHliRIKZlrGjdC/P3ga4wYru6T48k/itFMuLFipApPU
+lUPeH0iIrpSA0tZKMyPkOhRZNer6Ynywrx9tzXz4DT9T21V9Ho=
=xKzl
-----END PGP SIGNATURE-----
commit

75eb4762329eaae6d9dbb27f60e7c5934c8eb8ea

parent

882e7b14c3da5ab47c77c8011d8148cb88521f59

4 files changed, 126 insertions(+), 39 deletions(-)

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

@@ -1,69 +1,121 @@

package admin import ( - "context" "net/http" + "nilfm.cc/git/felt/admin/util" "nilfm.cc/git/felt/models" "nilfm.cc/git/felt/mongodb" - "nilfm.cc/git/felt/admin/util" "nilfm.cc/git/quartzgun/auth" . "nilfm.cc/git/quartzgun/middleware" "nilfm.cc/git/quartzgun/renderer" "nilfm.cc/git/quartzgun/router" - "strings" + . "nilfm.cc/git/quartzgun/util" ) func apiGetTableList(next http.Handler, udb auth.UserStore) http.Handler { handlerFunc := func(w http.ResponseWriter, req *http.Request) { - // get username from - user := util.GetUserFromToken(req) - - rawTableData, err := udb.GetData(user, "tables") + user := util.GetUserFromToken(req) + self, err := util.GetTablesByUser(user, udb) if err != nil { - // handle error - return 404 or 500? + w.WriteHeader(404) + } else { + AddContextValue(req, "tableList", self) + } + next.ServeHTTP(w, req) + } + + return http.HandlerFunc(handlerFunc) +} + +func apiGetTableData(next http.Handler, udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.Handler { + handlerFunc := func(w http.ResponseWriter, req *http.Request) { + + tableName := req.Context().Value("Slug") + tablePass := req.Form["passcode"][0] + + tableKey := models.TableKey{ + Name: tableName.(string), + Passcode: tablePass, } - // split rawTableData - tableName,passCode;tableName,passCode; - tables := strings.Split(rawTableData.(string), ";") - self := []models.TableKey{} - for _, t := range tables { - parts := strings.Split(t, ",") - if len(parts) == 2 { - self = append(self, models.TableKey{ - Name: parts[0], - Passcode: parts[1], - }) - } + if dbAdapter.CheckTable(tableKey) { + mapUrl, _ := dbAdapter.GetMapImageUrl(tableKey) + auxMessage, _ := dbAdapter.GetAuxMessage(tableKey) + availableTokens, _ := dbAdapter.GetTokens(tableKey, true) + activeTokens, _ := dbAdapter.GetTokens(tableKey, false) + + AddContextValue(req, "tableData", models.Table{ + Name: tableName.(string), + Passcode: tablePass, + MapImageUrl: mapUrl, + Tokens: activeTokens, + AvailableTokens: availableTokens, + AuxMessage: auxMessage, + }) + } else { + w.WriteHeader(404) } - *req = *req.WithContext(context.WithValue(req.Context(), "tableList", self)) next.ServeHTTP(w, req) } return http.HandlerFunc(handlerFunc) } -func apiGetTableData(next http.Handler, udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.Handler { - handlerFunc := func(w http.ResponseWriter, req *http.Request) { - - // tableName := req.Context().Value("Slug") - // get table entities from mongodb and store the data object in the context - next.ServeHTTP(w, req) - } - - return http.HandlerFunc(handlerFunc) +func apiCreateTable(next http.Handler, udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.Handler { + handlerFunc := func(w http.ResponseWriter, req *http.Request) { + tableName := req.Context().Value("Slug") + tablePass := req.Form["passcode"][0] + + tableKey := models.TableKey{ + Name: tableName.(string), + Passcode: tablePass, + } + + // table name is primary key so w edon't need to check + err := dbAdapter.CreateTable(tableKey) + + if err != nil { + AddContextValue(req, "result", err.Error()) + // TODO: parse error and change the status + w.WriteHeader(500) + } else { + user := util.GetUserFromToken(req) + tables, err := util.GetTablesByUser(user, udb) + tables = append(tables, tableKey) + err = util.SetTablesForUser(user, tables, udb) + if err != nil { + w.WriteHeader(500) + } else { + w.WriteHeader(201) + } + } + next.ServeHTTP(w, req) + } + + return http.HandlerFunc(handlerFunc) +} + +func apiDestroyTable(next http.Handler, udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.Handler { + handlerFunc := func(w http.ResponseWriter, req *http.Request) { + // check table actually belongs to this user + // if it does, try to destroy it + } + + return http.HandlerFunc(handlerFunc) } func CreateAdminInterface(udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.Handler { // create quartzgun router rtr := &router.Router{} - + scopes := map[string]string{} - rtr.Post("api/auth", Provision(udb, 84)) - rtr.Get(`api/table/`, Validate(apiGetTableList(renderer.JSON("tableList"), udb), udb, scopes)) - rtr.Get(`api/table/(?P<Slug>\S+)`, Validate(apiGetTableData(renderer.JSON("tableData"), udb, dbAdapter), udb, scopes)) + rtr.Post("/api/auth/", Provision(udb, 84)) + rtr.Get("/api/table/", Validate(apiGetTableList(renderer.JSON("tableList"), udb), udb, scopes)) + rtr.Get(`/api/table/(?P<Slug>\S+)`, Validate(apiGetTableData(renderer.JSON("tableData"), udb, dbAdapter), udb, scopes)) + rtr.Post("/api/table/", Validate(apiCreateTable(renderer.JSON("result"), udb, dbAdapter), udb, scopes)) return http.HandlerFunc(rtr.ServeHTTP) }
M admin/util/util.goadmin/util/util.go

@@ -1,9 +1,11 @@

package util import ( - "encoding/base64" - "net/http" - "strings" + "encoding/base64" + "net/http" + "nilfm.cc/git/felt/models" + "nilfm.cc/git/quartzgun/auth" + "strings" ) func GetUserFromToken(req *http.Request) string {

@@ -20,3 +22,36 @@ }

} return "" } + +func GetTablesByUser(user string, udb auth.UserStore) ([]models.TableKey, error) { + + rawTableData, err := udb.GetData(user, "tables") + if err != nil { + return []models.TableKey{}, err + } + + // split rawTableData - tableName,passCode;tableName,passCode; + tables := strings.Split(rawTableData.(string), ";") + self := []models.TableKey{} + for _, t := range tables { + parts := strings.Split(t, ",") + if len(parts) == 2 { + self = append(self, models.TableKey{ + Name: parts[0], + Passcode: parts[1], + }) + } + } + + return self, nil +} + +func SetTablesForUser(user string, tables []models.TableKey, udb auth.UserStore) error { + rawTableData := "" + + for _, t := range tables { + rawTableData += t.Name + "," + t.Passcode + ";" + } + rawTableData = strings.TrimSuffix(rawTableData, ";") + return udb.SetData(user, "tables", rawTableData) +}
M gametable/server.gogametable/server.go

@@ -11,8 +11,8 @@ "nhooyr.io/websocket"

"nilfm.cc/git/felt/admin" "nilfm.cc/git/felt/models" "nilfm.cc/git/felt/mongodb" - "nilfm.cc/git/quartzgun/cookie" "nilfm.cc/git/quartzgun/auth" + "nilfm.cc/git/quartzgun/cookie" "sync" "time" )
M main.gomain.go

@@ -32,8 +32,8 @@ if err != nil {

return err } - udb := indentalUserDB.CreateIndentalUserDB( - "./user.db") + udb := indentalUserDB.CreateIndentalUserDB( + "./user.db") gt := gametable.New(dbEngine, udb) s := &http.Server{