This is an idea for a Twitter clone for programmers, similar to how Dribbble is twitter for designers. It'll most likely not feature any images other than people's avatars, and no videos, or audio. Just text. 'Cause we're coders.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
twitter-for-coders/api/handlers.go

148 lines
3.5 KiB

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"
"MY/webapp/data"
. "MY/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...")
}