Files
qrank/src/main.go

100 lines
2.2 KiB
Go

package main
import (
"html/template"
"log"
"os"
"time"
"github.com/gin-gonic/gin"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
// ===================== Globals =====================
var (
db *gorm.DB
baseURL string
cookieDomain string
)
const (
PORT = "18765"
)
// ===================== Templates =====================
var tpl = template.Must(template.New("").Funcs(template.FuncMap{
"fmtTime": func(t time.Time) string { return t.Local().Format("1000-01-01 10:10") },
}).ParseGlob("templates/*.html"))
// ===================== Main =====================
func main() {
log.SetFlags(log.LstdFlags | log.Lshortfile)
baseURL = os.Getenv("APP_BASE_URL")
if baseURL == "" {
baseURL = "http://localhost:" + PORT
}
cookieDomain = os.Getenv("APP_COOKIE_DOMAIN")
// DB connect
var err error
dsn := os.Getenv("DATABASE_URL")
if dsn != "" {
db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal("postgres connect:", err)
}
log.Println("using Postgres")
} else {
db, err = gorm.Open(sqlite.Open("qrank.db"), &gorm.Config{})
if err != nil {
log.Fatal("sqlite connect:", err)
}
log.Println("using SQLite qrank.db")
}
if err := db.AutoMigrate(&User{}, &Session{}, &LoginToken{}, &Table{}, &Game{}, &GamePlayer{}); err != nil {
log.Fatal("migrate:", err)
}
r := gin.Default()
// 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)
// Authenticated routes
r.GET("/enter", requireAuth(), getEnter)
r.POST("/enter", requireAuth(), postEnter)
// QR-prepped table routes
r.GET("/t/:tslug/enter", requireAuth(), getEnter)
r.POST("/t/:tslug/enter", requireAuth(), postEnter)
r.GET("/history", requireAuth(), getHistory)
r.GET("/leaderboard", requireAuth(), getLeaderboard)
r.GET("/u/:slug", requireAuth(), getUserView)
r.GET("/me", requireAuth(), getMe)
r.POST("/me", requireAuth(), postMe)
bind := os.Getenv("APP_BIND")
if bind == "" {
bind = ":" + PORT
}
log.Println("listening on", bind, "base:", baseURL)
if err := r.Run(bind); err != nil {
log.Fatal(err)
}
}