From e178ca6733476b9d673548baadeb8b4131d8c005 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Sun, 27 Jul 2025 11:22:33 -0400 Subject: [PATCH] Now can do all CRUD and just need search and pagination. --- admin/db.go | 11 ++++++++--- admin/handlers.go | 25 ++++++++++++++++++++----- tests/admin_test.go | 2 +- views/admin/table/contents.html | 3 ++- views/admin/table/new.html | 31 +++++++++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 views/admin/table/new.html diff --git a/admin/db.go b/admin/db.go index 7f67f20..7c66965 100644 --- a/admin/db.go +++ b/admin/db.go @@ -47,7 +47,7 @@ func Delete(table string, id int64) error { return err } -func Insert(table string, value reflect.Value) error { +func Insert(table string, value reflect.Value) (int64, int64, error) { type_of := value.Type() field_num := value.NumField() var columns []string @@ -64,9 +64,14 @@ func Insert(table string, value reflect.Value) error { builder := sq.Insert(table).Columns(columns...).Values(values...) sql_query, args, err := builder.ToSql() - _, err = data.DB.Exec(sql_query, args...) + result, err := data.DB.Exec(sql_query, args...) + id, err := result.LastInsertId() + if err != nil { return -1, -1, err } - return err + count, err := result.RowsAffected() + if err != nil { return id, -1, err } + + return id, count, err } func Update(table string, value reflect.Value) error { diff --git a/admin/handlers.go b/admin/handlers.go index 9d5b026..b967284 100644 --- a/admin/handlers.go +++ b/admin/handlers.go @@ -3,6 +3,8 @@ package admin import ( "maps" "strconv" + "reflect" + "fmt" "github.com/gofiber/fiber/v2" "zedshaw.games/webapp/data" . "zedshaw.games/webapp/common" @@ -60,7 +62,6 @@ func GetPageSelectOne(c *fiber.Ctx) error { func PostApiUpdate(c *fiber.Ctx) error { table := c.Params("table") - typeOf := data.Models()[table] obj, err := ReflectOnPost(typeOf, c) if err != nil { return IfErrNil(err, c) } @@ -73,14 +74,27 @@ func PostApiUpdate(c *fiber.Ctx) error { func GetPageInsert(c *fiber.Ctx) error { table := c.Params("table") - - // NOTE: need to get a blank json for the table schema and use that to populate the template OR have a simple get that does it. Probably the former. - return c.Render("admin/table/new", fiber.Map{ "Table": table }) } +func GetApiInsert(c *fiber.Ctx) error { + table := c.Params("table") + typeOf := data.Models()[table] + result := reflect.New(typeOf) + return c.JSON(result.Interface()) +} + func PostApiInsert(c *fiber.Ctx) error { - return c.JSON(fiber.Map{}) + 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 { @@ -102,6 +116,7 @@ func Setup(app *fiber.App) { app.Get("/admin/table/:table/", GetPageSelectAll) app.Get("/admin/new/table/:table/", GetPageInsert) + app.Get("/api/admin/new/table/:table/", GetApiInsert) app.Post("/api/admin/new/table/:table/", PostApiInsert) app.Get("/api/admin/table/:table/:id/", GetApiSelectOne) diff --git a/tests/admin_test.go b/tests/admin_test.go index e2d64f7..ee37c9e 100644 --- a/tests/admin_test.go +++ b/tests/admin_test.go @@ -36,7 +36,7 @@ func TestAdminIndexPage(t *testing.T) { _, err = data.DB.Exec(sql_query, args...) assert.NoError(err) - err = admin.Insert(table, val) + id, count, err = admin.Insert(table, val) assert.NoError(err, email) } diff --git a/views/admin/table/contents.html b/views/admin/table/contents.html index d68896d..8e4a873 100644 --- a/views/admin/table/contents.html +++ b/views/admin/table/contents.html @@ -7,12 +7,13 @@

Admin Tables

+