package api import ( "log" "github.com/gofiber/fiber/v2" _ "github.com/mattn/go-sqlite3" sq "github.com/Masterminds/squirrel" "github.com/gofiber/fiber/v2/middleware/session" "zedshaw.games/webapp/data" ) var STORE *session.Store func Logout(c *fiber.Ctx) error { sess, err := STORE.Get(c) if err != nil { return IfErrNil(err, c) } sess.Set("authenticated", false) err = sess.Save() if err != nil { return IfErrNil(err, c) } return c.Redirect("/") } func GetApiStream(c *fiber.Ctx) error { sess, err := STORE.Get(c) if err != nil { return IfErrNil(err, c) } if sess.Get("authenticated") != true { // NOTE: need my own error thing return IfErrNil(err, c) } sql, args, err := sq.Select("*").From("stream").ToSql() err = data.SelectJson[data.Stream](c, err, sql, args...) return IfErrNil(err, c) } func GetApiStreamId(c *fiber.Ctx) error { sql, args, err := sq.Select("*"). From("stream").Where("id=?", c.Params("id")).ToSql() err = data.GetJson[data.Stream](c, err, sql, args...) return IfErrNil(err, c) } func GetApiStreamIdLinks(c *fiber.Ctx) error { sql, args, err := sq.Select("*"). From("stream_link"). Where("stream_id=?", c.Params("id")).ToSql() err = data.SelectJson[data.Link](c, err, sql, args...) return IfErrNil(err, c) } func PostApiLogin(c *fiber.Ctx) error { var result data.User login, err := ReceivePost[data.Login](c) if(err != nil) { return IfErrNil(err, c) } sql, args, err := sq.Select("username, password"). From("user").Where("username=?", login.Username).ToSql() if err != nil { return IfErrNil(err, c) } err = data.DB.Get(&result, sql, args...) if err != nil { return IfErrNil(err, c) } if login.Username == result.Username && login.Password == result.Password { sess, err := STORE.Get(c) if err != nil { return IfErrNil(err, c) } sess.Set("authenticated", true) err = sess.Save() if err != nil { return IfErrNil(err, c) } return c.Redirect("/") } else { return c.Redirect("/login/") } } func PostApiLink(c *fiber.Ctx) error { var sql string var args []interface{} link, err := ReceivePost[data.Link](c) if err != nil { goto fail } sql, args, err = sq.Insert("stream_blah"). Columns("stream_id", "url", "description"). Values(link.StreamId, link.Url, link.Description).ToSql() err = data.Insert(err, sql, args...) return c.Redirect("/live/") fail: return IfErrNil(err, c) } func Setup(app *fiber.App) { STORE = session.New() app.Get("/api/stream/", GetApiStream) app.Get("/api/logout/", Logout) app.Get("/api/stream/:id", GetApiStreamId) app.Get("/api/stream/:id/links", GetApiStreamIdLinks) app.Post("/api/login", PostApiLogin) app.Post("/api/link", PostApiLink) app.Get("/test/:name/", func (c *fiber.Ctx) error { return c.Render(c.Params("name"), fiber.Map{ "Title": "Hello, World!", }) }) } func Shutdown() { log.Println("Shutting down controllers...") }