package api import ( "log" "time" "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" . "zedshaw.games/webapp/common" ) var STORE *session.Store func GetApiLogout(c *fiber.Ctx) error { err := LogoutUser(c) if err != nil { return IfErrNil(err, c) } return c.Redirect("/") } func GetApiFeed(c *fiber.Ctx) error { page := c.QueryInt("page", 0) if page < 0 { page = 0 } sql, args, err := sq.Select("*"). Limit(2). Offset(uint64(2 * page)). From("message"). Where(sq.Eq{"user_id": c.Params("user_id")}).ToSql() if err != nil { return IfErrNil(err, c) } err = data.SelectJson[data.Message](c, err, sql, args...) return IfErrNil(err, c) } func GetApiMessage(c *fiber.Ctx) error { sql, args, err := sq.Select("*").From("message"). Where(sq.Eq{"id": c.Params("id")}).ToSql() if err != nil { return IfErrNil(err, c) } err = data.GetJson[data.Message](c, err, sql, args...) return IfErrNil(err, c) } func PostApiMessage(c *fiber.Ctx) error { message, err := ReceivePost[data.Message](c) if err != nil { return IfErrNil(err, c) } sql, args, err := sq.Insert("message"). Columns("text", "user_id"). Values(message.Text, 1).ToSql() err = data.Exec(err, sql, args...) if err != nil { return IfErrNil(err, c) } return c.Redirect("/feed/") } func GetApiReplies(c *fiber.Ctx) error { message_id := c.Params("message_id") sql, args, err := sq.Select("*").From("message"). Where(sq.Eq{"replying_to": message_id}).ToSql() log.Println("SQL", sql, args); if err != nil { return IfErrNil(err, c) } err = data.SelectJson[data.Message](c, err, sql, args...) return IfErrNil(err, c) } func PostApiRegister(c *fiber.Ctx) error { user, err := ReceivePost[data.User](c) if err != nil { return IfErrNil(err, c) } err = SetUserPassword(user) if err != nil { return IfErrNil(err, c) } sql, args, err := sq.Insert("user"). Columns("username", "email", "password"). Values(user.Username, user.Email, user.Password).ToSql() err = data.Exec(err, sql, args...) if err != nil { return IfErrNil(err, c) } return c.Redirect("/login/") } func PostApiLogin(c *fiber.Ctx) error { var user data.User login, err := ReceivePost[data.Login](c) if(err != nil) { return IfErrNil(err, c) } pass_good, err := LoginUser(&user, login) if err != nil { return IfErrNil(err, c) } if pass_good { sess, err := STORE.Get(c) if err != nil { return IfErrNil(err, c) } // BUG: THIS IS A BIG NO NO, just for getting going sess.Set("authenticated", true) sess.Set("admin", IsAdmin(&user)) err = sess.Save() if err != nil { return IfErrNil(err, c) } return c.Redirect("/") } else { return c.Redirect("/login/") } } func Setup(app *fiber.App) { STORE = session.New() app.Static("/", "./public", fiber.Static{ Compress: false, CacheDuration: 1 * time.Nanosecond, }) app.Get("/api/logout", GetApiLogout) app.Post("/api/login", PostApiLogin) app.Post("/api/register", PostApiRegister) app.Get("/api/feed/:user_id", GetApiFeed) app.Get("/api/message/:id", GetApiMessage) app.Post("/api/message/new", PostApiMessage) app.Get("/api/replies/:message_id", GetApiReplies) app.Get("/feed/", Page("feed")) app.Get("/post/view/:id/", Page("post/view")) app.Get("/post/new/", Page("post/new")) app.Get("/settings/", Page("settings")) app.Get("/u/:user_id", Page("profile")) } func Shutdown() { log.Println("Shutting down controllers...") }