package main import ( "log" "os" "strconv" "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" "gorm.io/driver/sqlite" "gorm.io/gorm" ) // ===================== Globals ===================== var ( db *gorm.DB baseURL string cookieDomain string // Global logger for this package lg = log.Default() ) const ( // Default port if APP_PORT is not set defaultPort = 18765 ) // ===================== Main ===================== func main() { log.SetFlags(log.LstdFlags | log.Lshortfile) // Get the listening port port := os.Getenv("APP_PORT") port = strconv.Itoa(defaultPort) // Set the base URL baseURL = os.Getenv("APP_BASE_URL") if baseURL == "" { baseURL = "http://localhost:" + port } // Open connection to SQLite var err error db, err = gorm.Open(sqlite.Open("qrank.db"), &gorm.Config{}) if err != nil { lg.Fatal("sqlite connect:", err) } lg.Println("using SQLite qrank.db") 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") // Routes r.GET("/", getIndex) r.GET("/login", getLogin) r.POST("/login", postLogin) r.GET("/magic", getMagic) authorized := r.Group("/") authorized.Use(RequireAuthMiddleware()) { // Authenticated routes authorized.GET("/enter", getEnter) authorized.POST("/enter", postEnter) // QR-prepped table routes authorized.GET("/table/:tableSlug", getEnter) authorized.POST("/table/:tableSlug", postEnter) 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 lg.Println("listening on", bind, "base:", baseURL) if err := r.Run(bind); err != nil { lg.Fatal(err) } }