package main import ( "log" "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" ) 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{ Views: engine, }) 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) }) app.Static("/", "./public") app.Get("/test/", func (c *fiber.Ctx) error { return c.Render("index", fiber.Map{ "Title": "Hello, World!", }) }) go func() { if err := app.Listen(":5001"); err != nil { log.Panic(err) } }() c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) _ = <-c log.Println("Shutdown now...") _ = app.Shutdown() log.Println("Running cleanup...") db.Close() log.Println("Done.") }