From 0c47f0220173a93ddd614049b072cf4aea334db3 Mon Sep 17 00:00:00 2001
From: "Zed A. Shaw" <zed.shaw@gmail.com>
Date: Tue, 24 Jun 2025 23:55:38 -0400
Subject: [PATCH] Abit of refactoring into a more classic layout for an MVC
 style app.

---
 data/crud.go | 33 ++++++++++++++++------
 go.mod       |  2 --
 go.sum       |  2 --
 main.go      | 80 +++++-----------------------------------------------
 util/util.go | 13 +++++++++
 5 files changed, 44 insertions(+), 86 deletions(-)
 create mode 100644 util/util.go

diff --git a/data/crud.go b/data/crud.go
index ba5e0cb..a0adb5d 100644
--- a/data/crud.go
+++ b/data/crud.go
@@ -1,16 +1,33 @@
 package data
 
 import (
+  "log"
   "github.com/gofiber/fiber/v2"
    _ "github.com/mattn/go-sqlite3"
    "github.com/jmoiron/sqlx"
+   "zedshaw.games/webapp/util"
  )
 
-func SelectJson[T any](db *sqlx.DB, c *fiber.Ctx, err error, sql string, args ...interface{}) error {
+var DB *sqlx.DB
+
+func Setup(driver string, url string) {
+  var err error
+
+  DB, err = sqlx.Connect(driver, url)
+  if err != nil {
+      log.Fatalln(err)
+  }
+}
+
+func Shutdown() {
+  DB.Close()
+}
+
+func SelectJson[T any](c *fiber.Ctx, err error, sql string, args ...interface{}) error {
   var result []T
   if err != nil { goto fail }
 
-  err = db.Select(&result, sql, args...)
+  err = DB.Select(&result, sql, args...)
   if err != nil { goto fail }
 
   return c.JSON(&result)
@@ -18,11 +35,11 @@ func SelectJson[T any](db *sqlx.DB, c *fiber.Ctx, err error, sql string, args ..
 fail: return err
 }
 
-func GetJson[T any](db *sqlx.DB, c *fiber.Ctx, err error, sql string, args ...interface{}) error {
+func GetJson[T any](c *fiber.Ctx, err error, sql string, args ...interface{}) error {
   var result T
   if err != nil { goto fail }
 
-  err = db.Get(&result, sql, args...)
+  err = DB.Get(&result, sql, args...)
   if err != nil { goto fail }
 
   return c.JSON(&result)
@@ -30,11 +47,9 @@ func GetJson[T any](db *sqlx.DB, c *fiber.Ctx, err error, sql string, args ...in
 fail: return err
 }
 
-func Insert(db *sqlx.DB, err error, sql_query string, args ...interface{}) error {
+func Insert(err error, sql_query string, args ...interface{}) (error) {
+  defer util.HandlePanic("Insert")
   if err != nil { return err }
-
-  db.MustExec(sql_query, args...)
+  DB.MustExec(sql_query, args...)
   return err
 }
-
-
diff --git a/go.mod b/go.mod
index 3dc5c6c..7dd815a 100644
--- a/go.mod
+++ b/go.mod
@@ -88,7 +88,6 @@ require (
 	github.com/tursodatabase/libsql-client-go v0.0.0-20240902231107-85af5b9d094d // indirect
 	github.com/valyala/bytebufferpool v1.0.0 // indirect
 	github.com/valyala/fasthttp v1.62.0 // indirect
-	github.com/valyala/quicktemplate v1.8.0 // indirect
 	github.com/vertica/vertica-sql-go v1.3.3 // indirect
 	github.com/ydb-platform/ydb-go-genproto v0.0.0-20241112172322-ea1f63298f77 // indirect
 	github.com/ydb-platform/ydb-go-sdk/v3 v3.108.1 // indirect
@@ -120,7 +119,6 @@ require (
 tool (
 	github.com/air-verse/air
 	github.com/pressly/goose/v3/cmd/goose
-	github.com/valyala/quicktemplate/qtc
 	golang.org/x/pkgsite/cmd/pkgsite
 	golang.org/x/tools/cmd/goimports
 )
diff --git a/go.sum b/go.sum
index 70e444b..34a84c6 100644
--- a/go.sum
+++ b/go.sum
@@ -386,8 +386,6 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 github.com/valyala/fasthttp v1.62.0 h1:8dKRBX/y2rCzyc6903Zu1+3qN0H/d2MsxPPmVNamiH0=
 github.com/valyala/fasthttp v1.62.0/go.mod h1:FCINgr4GKdKqV8Q0xv8b+UxPV+H/O5nNFo3D+r54Htg=
-github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k=
-github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM=
 github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw=
 github.com/vertica/vertica-sql-go v1.3.3/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4=
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
diff --git a/main.go b/main.go
index 363a60e..0bea608 100644
--- a/main.go
+++ b/main.go
@@ -5,29 +5,20 @@ import (
   "os"
   "os/signal"
   "syscall"
-  "zedshaw.games/webapp/api"
-  "zedshaw.games/webapp/data"
   "github.com/gofiber/fiber/v2"
   "github.com/gofiber/fiber/v2/middleware/logger"
   "github.com/gofiber/template/html/v2"
 
    _ "github.com/mattn/go-sqlite3"
-   "github.com/jmoiron/sqlx"
-   sq "github.com/Masterminds/squirrel"
    recov "github.com/gofiber/fiber/v2/middleware/recover"
-   "github.com/gofiber/fiber/v2/middleware/session"
+
+  "zedshaw.games/webapp/api"
+  "zedshaw.games/webapp/data"
 )
 
 func main() {
   log.SetFlags(log.LstdFlags | log.Lshortfile)
 
-  db, err := sqlx.Connect("sqlite3", "db.sqlite3")
-  if err != nil {
-      log.Fatalln(err)
-  }
-
-  store := session.New()
-
   engine := html.New("./views", ".html")
 
   app := fiber.New(fiber.Config{
@@ -38,68 +29,11 @@ func main() {
   app.Use(logger.New())
   app.Use(recov.New())
 
-  // handler that returns one json from a sql database
-  app.Get("/api/stream/", func (c *fiber.Ctx) error {
-    sess, err := store.Get(c)
-    sess.Set("fuck", "off")
-
-    sql, args, err := sq.Select("*").From("stream").ToSql()
-    err = data.SelectJson[data.Stream](db, c, err, sql, args...)
-
-	return api.IfErrNil(err, c)
-  })
-
-  app.Get("/api/stream/:id", func (c *fiber.Ctx) error {
-    sql, args, err := sq.Select("*").From("stream").Where("id", c.Params("id")).ToSql()
-
-	err = data.GetJson[data.Stream](db, c, err, sql, args...)
-	return api.IfErrNil(err, c)
-  })
-
-  app.Get("/api/stream/:id/links", func (c *fiber.Ctx) error {
-    sql, args, err := sq.Select("*").From("stream_link").Where("stream_id", c.Params("id")).ToSql()
-
-    err = data.SelectJson[data.Link](db, c, err, sql, args...)
-
-	return api.IfErrNil(err, c)
-  })
-
-  app.Post("/api/login", func (c *fiber.Ctx) error {
-	  login, err := api.ReceivePost[data.Login](c)
-	  if(err != nil) { goto fail }
-
-	  log.Printf("username: %s; password: %s", login.Username, login.Password);
-
-      return c.Redirect("/")
-
-	fail:
-	  return api.IfErrNil(err, c)
-  })
-
-  app.Post("/api/link", func (c *fiber.Ctx) error {
-	var sql string
-	var args []interface{}
-
-    link, err := api.ReceivePost[data.Link](c)
-	if err != nil { goto fail }
-
-    sql, args, err = sq.Insert("stream_link").Columns("stream_id", "url", "description").Values(link.StreamId, link.Url, link.Description).ToSql()
-
-    err = data.Insert(db, err, sql, args...)
-	return c.Redirect("/live/")
-
-	fail:
-	   return api.IfErrNil(err, c)
-  })
+  api.Setup(app)
+  data.Setup("sqlite3", "db.sqlite3")
 
   app.Static("/", "./public")
 
-  app.Get("/test/:name/", func (c *fiber.Ctx) error {
-    return c.Render(c.Params("name"), fiber.Map{
-      "Title": "Hello, World!",
-    })
-  })
-
   go func() {
 	  if err := app.Listen(":5001"); err != nil {
 		  log.Panic(err)
@@ -113,8 +47,8 @@ func main() {
   log.Println("Shutdown now...")
   _ = app.Shutdown()
 
-  log.Println("Running cleanup...")
-  db.Close()
+  api.Shutdown()
+  data.Shutdown()
 
   log.Println("Done.")
 }
diff --git a/util/util.go b/util/util.go
new file mode 100644
index 0000000..245747b
--- /dev/null
+++ b/util/util.go
@@ -0,0 +1,13 @@
+package util
+
+import (
+  "log"
+)
+
+func HandlePanic(message string) func() {
+  return func() {
+    if r := recover(); r != nil {
+      log.Println(message, r)
+    }
+  }
+}