felt/admin/admin.go

160 lines
4.2 KiB
Go
Raw Normal View History

2022-12-22 04:45:15 +00:00
package admin
import (
"net/http"
"nilfm.cc/git/felt/admin/util"
2022-12-22 04:45:15 +00:00
"nilfm.cc/git/felt/models"
2022-12-22 16:39:39 +00:00
"nilfm.cc/git/felt/mongodb"
2022-12-22 04:45:15 +00:00
"nilfm.cc/git/quartzgun/auth"
. "nilfm.cc/git/quartzgun/middleware"
"nilfm.cc/git/quartzgun/renderer"
"nilfm.cc/git/quartzgun/router"
. "nilfm.cc/git/quartzgun/util"
2022-12-22 04:45:15 +00:00
)
2022-12-22 16:39:39 +00:00
func apiGetTableList(next http.Handler, udb auth.UserStore) http.Handler {
2022-12-22 04:45:15 +00:00
handlerFunc := func(w http.ResponseWriter, req *http.Request) {
user := util.GetUserFromToken(req)
self, err := util.GetTablesByUser(user, udb)
2022-12-22 04:45:15 +00:00
if err != nil {
w.WriteHeader(404)
} else {
AddContextValue(req, "tableList", self)
2022-12-22 04:45:15 +00:00
}
next.ServeHTTP(w, req)
}
2022-12-22 04:45:15 +00:00
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,
}
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)
2022-12-22 04:45:15 +00:00
}
2022-12-22 16:39:39 +00:00
next.ServeHTTP(w, req)
2022-12-22 04:45:15 +00:00
}
2022-12-22 16:39:39 +00:00
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
2023-01-05 04:59:54 +00:00
user := util.GetUserFromToken(req)
tables, err := util.GetTablesByUser(user, udb)
if err == nil {
destroy := false
i := 0
tableName := req.Context().Value("Slug")
tablePass := req.Form["passcode"][0]
table := models.TableKey{
Name: tableName.(string),
Passcode: tablePass,
}
for j, t := range tables {
if t.Name == table.Name && t.Passcode == table.Passcode {
// try to destroy it
destroy = dbAdapter.DestroyTable(table) == nil
i = j
break
}
}
if destroy {
newTables := append(tables[:i], tables[i+1:]...)
util.SetTablesForUser(user, newTables, udb)
w.WriteHeader(204)
} else {
w.WriteHeader(404)
}
} else {
w.WriteHeader(500)
}
next.ServeHTTP(w, req)
}
return http.HandlerFunc(handlerFunc)
2022-12-22 04:45:15 +00:00
}
2022-12-22 16:39:39 +00:00
func CreateAdminInterface(udb auth.UserStore, dbAdapter mongodb.DbAdapter) http.Handler {
2022-12-22 04:45:15 +00:00
// create quartzgun router
rtr := &router.Router{}
2022-12-22 16:39:39 +00:00
scopes := map[string]string{}
2022-12-22 04:45:15 +00:00
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))
2023-01-05 04:59:54 +00:00
rtr.Delete(`/api/table/(?P<Slug>\S+)`, Validate(apiDestroyTable(renderer.JSON("result"), udb, dbAdapter), udb, scopes))
2022-12-22 04:45:15 +00:00
2022-12-22 16:39:39 +00:00
return http.HandlerFunc(rtr.ServeHTTP)
2022-12-22 04:45:15 +00:00
}