admin: flesh out apiGetTableData and add table creation

This commit is contained in:
Iris Lightshard 2022-12-24 21:02:35 -07:00
parent 882e7b14c3
commit 75eb476232
Signed by: Iris Lightshard
GPG key ID: 3B7FBC22144E6398
4 changed files with 128 additions and 41 deletions

View file

@ -1,43 +1,27 @@
package admin package admin
import ( import (
"context"
"net/http" "net/http"
"nilfm.cc/git/felt/admin/util"
"nilfm.cc/git/felt/models" "nilfm.cc/git/felt/models"
"nilfm.cc/git/felt/mongodb" "nilfm.cc/git/felt/mongodb"
"nilfm.cc/git/felt/admin/util"
"nilfm.cc/git/quartzgun/auth" "nilfm.cc/git/quartzgun/auth"
. "nilfm.cc/git/quartzgun/middleware" . "nilfm.cc/git/quartzgun/middleware"
"nilfm.cc/git/quartzgun/renderer" "nilfm.cc/git/quartzgun/renderer"
"nilfm.cc/git/quartzgun/router" "nilfm.cc/git/quartzgun/router"
"strings" . "nilfm.cc/git/quartzgun/util"
) )
func apiGetTableList(next http.Handler, udb auth.UserStore) http.Handler { func apiGetTableList(next http.Handler, udb auth.UserStore) http.Handler {
handlerFunc := func(w http.ResponseWriter, req *http.Request) { handlerFunc := func(w http.ResponseWriter, req *http.Request) {
// get username from user := util.GetUserFromToken(req)
user := util.GetUserFromToken(req) self, err := util.GetTablesByUser(user, udb)
rawTableData, err := udb.GetData(user, "tables")
if err != nil { if err != nil {
// handle error - return 404 or 500? w.WriteHeader(404)
} else {
AddContextValue(req, "tableList", self)
} }
// 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],
})
}
}
*req = *req.WithContext(context.WithValue(req.Context(), "tableList", self))
next.ServeHTTP(w, req) next.ServeHTTP(w, req)
} }
@ -45,14 +29,81 @@ func apiGetTableList(next http.Handler, udb auth.UserStore) http.Handler {
} }
func apiGetTableData(next http.Handler, udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.Handler { func apiGetTableData(next http.Handler, udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.Handler {
handlerFunc := func(w http.ResponseWriter, req *http.Request) { handlerFunc := func(w http.ResponseWriter, req *http.Request) {
// tableName := req.Context().Value("Slug") tableName := req.Context().Value("Slug")
// get table entities from mongodb and store the data object in the context tablePass := req.Form["passcode"][0]
next.ServeHTTP(w, req)
}
return http.HandlerFunc(handlerFunc) tableKey := models.TableKey{
Name: tableName.(string),
Passcode: tablePass,
}
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)
}
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 { func CreateAdminInterface(udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.Handler {
@ -61,9 +112,10 @@ func CreateAdminInterface(udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.
scopes := map[string]string{} scopes := map[string]string{}
rtr.Post("api/auth", Provision(udb, 84)) rtr.Post("/api/auth/", Provision(udb, 84))
rtr.Get(`api/table/`, Validate(apiGetTableList(renderer.JSON("tableList"), udb), udb, scopes)) 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.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) return http.HandlerFunc(rtr.ServeHTTP)
} }

View file

@ -1,9 +1,11 @@
package util package util
import ( import (
"encoding/base64" "encoding/base64"
"net/http" "net/http"
"strings" "nilfm.cc/git/felt/models"
"nilfm.cc/git/quartzgun/auth"
"strings"
) )
func GetUserFromToken(req *http.Request) string { func GetUserFromToken(req *http.Request) string {
@ -20,3 +22,36 @@ func GetUserFromToken(req *http.Request) string {
} }
return "" 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)
}

View file

@ -11,8 +11,8 @@ import (
"nilfm.cc/git/felt/admin" "nilfm.cc/git/felt/admin"
"nilfm.cc/git/felt/models" "nilfm.cc/git/felt/models"
"nilfm.cc/git/felt/mongodb" "nilfm.cc/git/felt/mongodb"
"nilfm.cc/git/quartzgun/cookie"
"nilfm.cc/git/quartzgun/auth" "nilfm.cc/git/quartzgun/auth"
"nilfm.cc/git/quartzgun/cookie"
"sync" "sync"
"time" "time"
) )

View file

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