Now can do all CRUD and just need search and pagination.

main
Zed A. Shaw 3 days ago
parent b0ba0c7e16
commit e178ca6733
  1. 11
      admin/db.go
  2. 25
      admin/handlers.go
  3. 2
      tests/admin_test.go
  4. 3
      views/admin/table/contents.html
  5. 31
      views/admin/table/new.html

@ -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 {

@ -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)

@ -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)
}

@ -7,12 +7,13 @@
<h1>Admin Tables</h1>
<block x-data="Tables">
<button type="button"><a href="/admin/new/table/{{ .Table }}/">New</a></button>
<table>
<template x-for="item in theData">
<tr>
<td>
<a x-bind:href="'/admin/table/{{ .Table }}/' + item.id + '/'">
^
#
</a>
</td>
<template x-for="(value, key) in item">

@ -0,0 +1,31 @@
<script>
let Data = new GetJson("/api/admin/new/table/{{ .Table }}/");
</script>
<blockstart>
<h1>Admin Tables</h1>
<block x-init="item = await Data.oneThing()" x-data="{item: {}}">
<form method="POST" action="/api/admin/new/table/{{ .Table }}/">
<card>
<top><h2>{{ .Table }} : New</h2></top>
<middle>
<template x-for="(value, key) in item">
<div>
<label x-text="key" x-bind:for="key"></label>
<input x-bind:name="key" x-text="value" x-model="item[key]" x-bind:id="key" />
</div>
</template>
</middle>
<bottom>
<button-group>
<button type="button"><a href="/admin/table/{{ .Table }}/">Back</a></button>
<button type="submit">Insert</button>
<button type="button">Clear</button>
</button-group>
</bottom>
</card>
</form>
</block>
</blockstart>
Loading…
Cancel
Save