You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							172 lines
						
					
					
						
							4.4 KiB
						
					
					
				
			
		
		
	
	
							172 lines
						
					
					
						
							4.4 KiB
						
					
					
				| package admin
 | |
| 
 | |
| import (
 | |
|   "maps"
 | |
|   "reflect"
 | |
|   "fmt"
 | |
|   "github.com/gofiber/fiber/v2"
 | |
|   "MY/webapp/data"
 | |
|   "MY/webapp/api"
 | |
|   . "MY/webapp/common"
 | |
| )
 | |
| 
 | |
| func GetApiTableIndex(c *fiber.Ctx) error {
 | |
|   _, err := api.CheckAuthed(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 := api.CheckAuthed(c, true)
 | |
|   if err != nil { return c.Redirect("/") }
 | |
| 
 | |
|   table := c.Params("table")
 | |
|   if table == "" { return c.Redirect("/admin/table/") }
 | |
|   type_is := data.Models()[table]
 | |
| 
 | |
|   page := c.QueryInt("page", 0)
 | |
|   if page < 0 { page = 0 }
 | |
| 
 | |
|   search := c.Query("search", "")
 | |
|   var result []any
 | |
| 
 | |
|   if search == "" {
 | |
|     result, err = SelectTable(table, type_is, 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, type_is, 20, uint64(page));
 | |
|     if err != nil { return IfErrNil(err, c) }
 | |
|   }
 | |
| 
 | |
|   return c.JSON(result)
 | |
| }
 | |
| 
 | |
| func GetPageSelectAll(c *fiber.Ctx) error {
 | |
|   _, err := api.CheckAuthed(c, true)
 | |
|   if err != nil { return c.Redirect("/") }
 | |
| 
 | |
|   return c.Render("admin/table/contents", fiber.Map{"Table": c.Params("table")})
 | |
| }
 | |
| 
 | |
| func GetApiSelectOne(c *fiber.Ctx) error {
 | |
|   _, err := api.CheckAuthed(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) }
 | |
| 
 | |
|   type_is := data.Models()[table]
 | |
| 
 | |
|   result, err := Get(table, type_is, int64(id))
 | |
|   if err != nil { return IfErrNil(err, c) }
 | |
| 
 | |
|   return c.JSON(result.Interface())
 | |
| }
 | |
| 
 | |
| func GetPageSelectOne(c *fiber.Ctx) error {
 | |
|   _, err := api.CheckAuthed(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) }
 | |
| 
 | |
|   return c.Render("admin/table/view", fiber.Map{
 | |
|     "Table": table,
 | |
|     "Id": id,
 | |
|   })
 | |
| }
 | |
| 
 | |
| func PostApiUpdate(c *fiber.Ctx) error {
 | |
|   _, err := api.CheckAuthed(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 GetPageInsert(c *fiber.Ctx) error {
 | |
|   _, err := api.CheckAuthed(c, true)
 | |
|   if err != nil { return c.Redirect("/") }
 | |
| 
 | |
|   table := c.Params("table")
 | |
|   return c.Render("admin/table/new", fiber.Map{ "Table": table })
 | |
| }
 | |
| 
 | |
| func GetApiInsert(c *fiber.Ctx) error {
 | |
|   _, err := api.CheckAuthed(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 := api.CheckAuthed(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 := api.CheckAuthed(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 GetPageAdminIndex(c *fiber.Ctx) error {
 | |
|   _, err := api.CheckAuthed(c, true)
 | |
|   if err != nil { return c.Redirect("/") }
 | |
| 
 | |
|   return c.Render("admin/table/index", fiber.Map{})
 | |
| }
 | |
| 
 | |
| func Setup(app *fiber.App) {
 | |
|   app.Get("/admin/table/", GetPageAdminIndex)
 | |
|   app.Get("/admin/table/:table/", GetPageSelectAll)
 | |
|   app.Get("/admin/new/table/:table/", GetPageInsert)
 | |
|   app.Get("/admin/table/:table/:id/", GetPageSelectOne)
 | |
| 
 | |
|   app.Get("/api/admin/table", GetApiTableIndex)
 | |
|   app.Get("/api/admin/table/:table", GetApiSelectAll)
 | |
|   app.Get("/api/admin/new/table/:table", GetApiInsert)
 | |
|   app.Post("/api/admin/new/table/:table", PostApiInsert)
 | |
|   app.Get("/api/admin/table/:table/:id", GetApiSelectOne)
 | |
|   app.Post("/api/admin/table/:table/:id", PostApiUpdate)
 | |
| }
 | |
| 
 |