package main import ( "log" "os" "github.com/gin-gonic/gin" "github.com/joho/godotenv" ) func main() { // Load .env file if present if err := godotenv.Load(); err != nil { log.Printf("Warning: could not load .env file: %v", err) } // Get port from environment port := os.Getenv("PORT") if port == "" { port = "8080" } // Initialize router r := gin.Default() // CORS middleware r.Use(func(c *gin.Context) { c.Header("Access-Control-Allow-Origin", "*") c.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") c.Header("Access-Control-Allow-Headers", "Content-Type, Authorization") if c.Request.Method == "OPTIONS" { c.AbortWithStatus(204) return } c.Next() }) // Health check r.GET("/health", func(c *gin.Context) { c.JSON(200, gin.H{"status": "ok"}) }) // API routes api := r.Group("/api/v1") { // Auth routes api.POST("/auth/register", handleRegister) api.POST("/auth/login", handleLogin) // Protected routes protected := api.Group("") protected.Use(authMiddleware()) { // Chats protected.GET("/chats", handleListChats) protected.POST("/chats", handleCreateChat) protected.GET("/chats/:id", handleGetChat) protected.PUT("/chats/:id", handleUpdateChat) protected.DELETE("/chats/:id", handleDeleteChat) // Messages protected.GET("/chats/:id/messages", handleGetMessages) protected.POST("/chats/:id/messages", handleCreateMessage) // Settings protected.GET("/settings", handleGetSettings) protected.PUT("/settings", handleUpdateSettings) // API Configs protected.GET("/api-configs", handleListAPIConfigs) protected.POST("/api-configs", handleCreateAPIConfig) protected.DELETE("/api-configs/:id", handleDeleteAPIConfig) // Models (proxy to configured API) protected.GET("/models", handleListModels) } } log.Printf("🔀 Chat Switchboard API starting on port %s", port) if err := r.Run(":" + port); err != nil { log.Fatalf("Failed to start server: %v", err) } } // Placeholder handlers - implement in handlers/ package func handleRegister(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleLogin(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleListChats(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleCreateChat(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleGetChat(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleUpdateChat(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleDeleteChat(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleGetMessages(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleCreateMessage(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleGetSettings(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleUpdateSettings(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleListAPIConfigs(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleCreateAPIConfig(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleDeleteAPIConfig(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func handleListModels(c *gin.Context) { c.JSON(501, gin.H{"error": "not implemented"}) } func authMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // TODO: Implement JWT validation c.Next() } }