Initial stab at a JSON error handling system that's easy to use.

master
Zed A. Shaw 3 days ago
parent dc8987e407
commit 3063525493
  1. 10
      common/errors.go
  2. 8
      features/admin/api.go
  3. 2
      features/admin/views.go
  4. 11
      static/js/jzed.js
  5. 30
      views/admin/table/new.html

@ -3,6 +3,7 @@ package common
import (
"log"
"fmt"
"github.com/gofiber/fiber/v2"
)
func Fail(err error, format string, v ...any) error {
@ -10,3 +11,12 @@ func Fail(err error, format string, v ...any) error {
log.Printf(err_format, v...)
return err
}
func ApiError(c *fiber.Ctx, format string, args ...any) error {
c.Status(500)
return c.JSON(fiber.Map{
"error": fmt.Sprintf(format, args...),
})
}

@ -81,7 +81,13 @@ func GetApiInsert(c *fiber.Ctx) error {
if err != nil { return c.Redirect("/") }
table := c.Params("table")
typeOf := data.Models()[table]
// check that this table exists in the model
typeOf, ok := data.Models()[table]
if !ok {
return ApiError(c, "admin table %s does not exist", table)
}
result := reflect.New(typeOf)
return c.JSON(result.Interface())

@ -38,6 +38,6 @@ func SetupPages(app *fiber.App) {
AddAuthedPage(app, true, "admin/table/new/:table/", "admin/table/new")
AddPage(app, "admin/", "admin/index")
app.Get("/admin/table/:table/", GetPageContent)
app.Get("admin/table/:table/", GetPageContent)
app.Get("/admin/table/:table/:id/", GetPageSelectOne)
}

@ -249,3 +249,14 @@ const $switch = (template_id, data) => {
return null;
}
const $no_error = (data, err) => {
if(err === null) {
return true;
} else {
const target = $id('error');
const templ = $id('error-template');
$replace_with(target, $render(templ, data));
return false;
}
}

@ -1,19 +1,37 @@
<script>
$boot(async () => {
let item = await GetJson('/api/admin/table/new/{{ .table }}');
let data = [];
const GetJsonErr = async (url) => {
const resp = await fetch(url);
for(let key of Object.keys(item)) {
data.push({key, value: item[key]});
if(resp.status == 200) {
return [await resp.json(), null];
} else {
return [await resp.json(), resp.status];
}
}
$boot(async () => {
let [resp, err] = await GetJsonErr('/api/admin/table/new/{{ .table }}');
if($no_error(resp, err)) {
let data = [];
$render_data('data-template', 'data-form', data);
for(let key of Object.keys(resp)) {
data.push({key, value: resp[key]});
}
$render_data('data-template', 'data-form', data);
}
});
</script>
<h1><a href="/admin/table/{{ .table }}/">&laquo;</a>Admin {{ .table }}</h1>
<block>
<div id='error'></div>
<template id="error-template">
<aside id='error'><mark class="alert">${ error }</mark></aside>
</template>
<form method="POST" action="/api/admin/table/new/{{ .table }}">
<card>
<top><h2>New {{ .table }}</h2></top>

Loading…
Cancel
Save