mirror of
https://github.com/Dvorinka/ClubLogos.git
synced 2026-06-03 19:42:58 +00:00
129 lines
2.9 KiB
Go
129 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"log"
|
|
"os"
|
|
|
|
"github.com/gin-contrib/cors"
|
|
"github.com/gin-gonic/gin"
|
|
_ "github.com/mattn/go-sqlite3"
|
|
)
|
|
|
|
var db *sql.DB
|
|
|
|
func main() {
|
|
// Initialize database
|
|
var err error
|
|
db, err = initDB()
|
|
if err != nil {
|
|
log.Fatal("Failed to initialize database:", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
// Create logos directory if it doesn't exist
|
|
if err := os.MkdirAll("./logos", 0755); err != nil {
|
|
log.Fatal("Failed to create logos directory:", err)
|
|
}
|
|
|
|
// Create subdirectories for SVG and PNG
|
|
if err := os.MkdirAll("./logos/svg", 0755); err != nil {
|
|
log.Fatal("Failed to create logos/svg directory:", err)
|
|
}
|
|
if err := os.MkdirAll("./logos/png", 0755); err != nil {
|
|
log.Fatal("Failed to create logos/png directory:", err)
|
|
}
|
|
|
|
// Initialize Gin router with larger request size limit (32MB)
|
|
r := gin.Default()
|
|
r.MaxMultipartMemory = 32 << 20 // 32 MB
|
|
|
|
// CORS middleware - Allow all origins, methods, and headers
|
|
r.Use(cors.New(cors.Config{
|
|
AllowOrigins: []string{"*"},
|
|
AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH", "HEAD"},
|
|
AllowHeaders: []string{"*"},
|
|
ExposeHeaders: []string{"*"},
|
|
AllowCredentials: false, // Must be false when using wildcard origins
|
|
AllowOriginFunc: func(origin string) bool {
|
|
return true // Allow all origins
|
|
},
|
|
}))
|
|
|
|
// Routes
|
|
setupRoutes(r)
|
|
|
|
// Start server
|
|
port := os.Getenv("PORT")
|
|
if port == "" {
|
|
port = "8080"
|
|
}
|
|
|
|
log.Printf("🚀 Server starting on port %s", port)
|
|
log.Printf("📁 Logos directory: ./logos")
|
|
log.Printf("💾 Database: ./data/db.sqlite")
|
|
|
|
if err := r.Run(":" + port); err != nil {
|
|
log.Fatal("Failed to start server:", err)
|
|
}
|
|
}
|
|
|
|
func setupRoutes(r *gin.Engine) {
|
|
// Health check
|
|
r.GET("/health", func(c *gin.Context) {
|
|
c.JSON(200, gin.H{"status": "ok"})
|
|
})
|
|
|
|
// Club routes (proxy to FAČR API)
|
|
clubs := r.Group("/clubs")
|
|
{
|
|
clubs.GET("/search", searchClubs)
|
|
clubs.GET("/:id", getClub)
|
|
}
|
|
|
|
// Logo routes
|
|
logos := r.Group("/logos")
|
|
{
|
|
logos.GET("", listLogos)
|
|
logos.GET("/:id", getLogo)
|
|
logos.GET("/:id/json", getLogoWithMetadata)
|
|
logos.POST("/:id", uploadLogo)
|
|
}
|
|
}
|
|
|
|
func initDB() (*sql.DB, error) {
|
|
// Create data directory if it doesn't exist
|
|
if err := os.MkdirAll("./data", 0755); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
db, err := sql.Open("sqlite3", "./data/db.sqlite")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Create tables
|
|
_, err = db.Exec(`
|
|
CREATE TABLE IF NOT EXISTS logos (
|
|
id TEXT PRIMARY KEY,
|
|
club_name TEXT NOT NULL,
|
|
club_city TEXT,
|
|
club_type TEXT,
|
|
club_website TEXT,
|
|
has_svg INTEGER DEFAULT 0,
|
|
has_png INTEGER DEFAULT 0,
|
|
primary_format TEXT DEFAULT 'png',
|
|
file_size_svg INTEGER,
|
|
file_size_png INTEGER,
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
)
|
|
`)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
log.Println("✓ Database initialized")
|
|
return db, nil
|
|
}
|