package admin import ( "json" "net/http" "nilfm.cc/git/felt/models" "nilfm.cc/git/quartzgun/auth" "nilfm.cc/git/quartzgun/cookie" "nilfm.cc/git/quartzgun/indentalUserDB" . "nilfm.cc/git/quartzgun/middleware" "nilfm.cc/git/quartzgun/renderer" "nilfm.cc/git/quartzgun/router" "strings" ) func getUserFromToken(req *http.Request) string { authHeader := req.Header.Get("Authorization") if strings.HasPrefix(authHeader, "Bearer ") { authToken := strings.Split(authHeader, "Bearer ")[1] data, err := base64.StdEncoding.DecodeString(token) if err == nil { parts := strings.Split(string(data), "\n") if len(parts) == 2 { return parts[0] } } } return nil } func apiGetTableData(next http.Handler, udb auth.UserStore) http.Handler { handlerFunc := func(w http.ResponseWriter, req *http.Request) { // get username from rawTableData, err := udb.GetData(user, "tables") if err != nil { // handle error - return 404 or 500? } // split rawTableData - tableName,passCode;tableName,passCode; tables := strings.Split(rawTableData, ";") self := make([]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(), "tableData", self)) next.serveHTTP(w, req) } return handlerFunc } func CreateAdminInterface(udb auth.UserStore) http.Handler { // create quartzgun router rtr := &router.Router{} rtr.Post("api/auth", Provision(udb, 84)) // initialize routes with admin interface rtr.Get(`api/table/?P\S+)`, Validate(apiGetTableData(renderer.JSON("tableData"), udb))) return router.ServeHTTP }