Made the elo system work. Colorized the leaderboard. Better data structure. Improved the HTML. Custom form system. Added Sessions

This commit is contained in:
Jonas Hahn
2025-08-25 14:56:59 +02:00
parent 4b4377a24e
commit f5e5d5632d
20 changed files with 492 additions and 289 deletions

View File

@@ -6,6 +6,8 @@ import (
"strconv"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
@@ -50,13 +52,20 @@ func main() {
}
lg.Println("using SQLite qrank.db")
if err := db.AutoMigrate(&User{}, &Session{}, &LoginToken{}, &Table{}, &Game{}, &GamePlayer{}); err != nil {
if err := db.AutoMigrate(&User{}, &Session{}, &LoginToken{}, &Table{}, &Game{}, &GameUser{}); err != nil {
lg.Fatal("migrate:", err)
}
if err := db.SetupJoinTable(&User{}, "Games", &GameUser{}); err != nil {
lg.Fatal("setup jointable:", err)
}
// Create engine
r := gin.Default()
store := cookie.NewStore([]byte("secret"))
r.Use(sessions.Sessions("mysession", store))
r.Use(SessionHandlerMiddleware())
// Serve static files from the current directory
r.Static("/assets", "./assets")
@@ -66,20 +75,25 @@ func main() {
r.POST("/login", postLogin)
r.GET("/magic", getMagic)
// Authenticated routes
r.GET("/enter", requireAuth(), getEnter)
r.POST("/enter", requireAuth(), postEnter)
authorized := r.Group("/")
authorized.Use(RequireAuthMiddleware())
{
// QR-prepped table routes
r.GET("/t/:tslug/enter", requireAuth(), getEnter)
r.POST("/t/:tslug/enter", requireAuth(), postEnter)
// Authenticated routes
authorized.GET("/enter", getEnter)
authorized.POST("/enter", postEnter)
r.GET("/history", requireAuth(), getHistory)
r.GET("/leaderboard", requireAuth(), getLeaderboard)
// QR-prepped table routes
authorized.GET("/table/:tableSlug", getEnter)
authorized.POST("/table/:tableSlug", postEnter)
r.GET("/u/:slug", requireAuth(), getUserView)
r.GET("/me", requireAuth(), getMe)
r.POST("/me", requireAuth(), postMe)
authorized.GET("/history", getHistory)
authorized.GET("/leaderboard", getLeaderboard)
authorized.GET("/user/:userSlug", getUserView)
authorized.GET("/me", getMe)
authorized.POST("/me", postMe)
}
// Start application with port
bind := ":" + port