felt/admin/admin.go

72 lines
1.7 KiB
Go
Raw Normal View History

2022-12-22 04:45:15 +00:00
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<Slug>\S+)`, Validate(apiGetTableData(renderer.JSON("tableData"), udb)))
return router.ServeHTTP
}