package admin_table import ( "maps" "reflect" "fmt" "github.com/gofiber/fiber/v2" "MY/webapp/data" . "MY/webapp/common" ) func GetApiTableIndex(c *fiber.Ctx) error { _, err := AuthCheck(c, true) if err != nil { return c.Redirect("/") } var tables []string for k := range maps.Keys(data.Models()) { tables = append(tables, k) } return c.JSON(tables) } func GetApiSelectAll(c *fiber.Ctx) error { _, err := AuthCheck(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") if table == "" { return c.Redirect("/admin/table/") } page := c.QueryInt("page", 0) if page < 0 { page = 0 } search := c.Query("search", "") var result []any if search == "" { result, err = SelectTable(table, 20, uint64(page)); if err != nil { return IfErrNil(err, c) } } else { // NOTE: need a 404 here when there's no result? or empty list? result, err = SearchTable(search, table, 20, uint64(page)); if err != nil { return IfErrNil(err, c) } } return c.JSON(result) } func GetApiSelectOne(c *fiber.Ctx) error { _, err := AuthCheck(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") id, err := c.ParamsInt("id", -1) if err != nil || id < 0 { return IfErrNil(err, c) } result, err := Get(table, int64(id)) if err != nil { return IfErrNil(err, c) } return c.JSON(result.Interface()) } func PostApiUpdate(c *fiber.Ctx) error { _, err := AuthCheck(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") typeOf := data.Models()[table] obj, err := ReflectOnPost(typeOf, c) if err != nil { return IfErrNil(err, c) } err = Update(table, obj.Elem()) if err != nil { return IfErrNil(err, c) } return c.RedirectBack("/admin/table/", 303) } func GetApiInsert(c *fiber.Ctx) error { _, err := AuthCheck(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") typeOf := data.Models()[table] result := reflect.New(typeOf) return c.JSON(result.Interface()) } func PostApiInsert(c *fiber.Ctx) error { _, err := AuthCheck(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") typeOf := data.Models()[table] obj, err := ReflectOnPost(typeOf, c) if err != nil { return IfErrNil(err, c) } id, _, err := Insert(table, obj.Elem()) if err != nil { return IfErrNil(err, c) } return c.Redirect(fmt.Sprintf("/admin/table/%s/%d/", table, id), 303) } func DeleteApi(c *fiber.Ctx) error { _, err := AuthCheck(c, true) if err != nil { return c.Redirect("/") } table := c.Params("table") id, err := c.ParamsInt("id", -1) if err != nil || id < 0 { return IfErrNil(err, c) } err = Delete(table, int64(id)) if err != nil { return IfErrNil(err, c) } return c.JSON(fiber.Map{}) } func SetupApi(app *fiber.App) { app.Get("/api/admin/table", GetApiTableIndex) app.Get("/api/admin/table/:table", GetApiSelectAll) app.Get("/api/admin/table/new/:table", GetApiInsert) app.Post("/api/admin/table/new/:table", PostApiInsert) app.Get("/api/admin/table/:table/:id", GetApiSelectOne) app.Post("/api/admin/table/:table/:id", PostApiUpdate) app.Delete("/api/admin/table/:table/:id", DeleteApi) }