Files
2025-09-13 06:48:55 +03:00

143 lines
4.6 KiB
Go

package routes
import (
"github.com/gin-gonic/gin"
"customer-support-system/internal/auth"
"customer-support-system/internal/handlers"
)
// SetupRoutes configures all the routes for the application
func SetupRoutes() *gin.Engine {
// Create a new Gin engine
r := gin.Default()
// Add CORS middleware
r.Use(CORSMiddleware())
// Create handlers
userHandler := handlers.NewUserHandler()
conversationHandler := handlers.NewConversationHandler()
knowledgeHandler := handlers.NewKnowledgeHandler()
aiHandler := handlers.NewAIHandler()
// Health check endpoint
r.GET("/health", func(c *gin.Context) {
c.JSON(200, gin.H{
"status": "ok",
})
})
// API version 1 group
v1 := r.Group("/api/v1")
{
// Public routes (no authentication required)
public := v1.Group("/public")
{
// User authentication routes
public.POST("/register", userHandler.Register)
public.POST("/login", userHandler.Login)
}
// Protected routes (authentication required)
protected := v1.Group("")
protected.Use(auth.AuthMiddleware())
{
// User routes
user := protected.Group("/user")
{
user.GET("/profile", userHandler.GetProfile)
user.PUT("/profile", userHandler.UpdateProfile)
user.PUT("/change-password", userHandler.ChangePassword)
}
// Conversation routes
conversations := protected.Group("/conversations")
{
conversations.GET("", conversationHandler.ListConversations)
conversations.POST("", conversationHandler.CreateConversation)
conversations.GET("/:id", conversationHandler.GetConversation)
conversations.PUT("/:id", conversationHandler.UpdateConversation)
conversations.DELETE("/:id", conversationHandler.DeleteConversation)
conversations.GET("/:id/stats", conversationHandler.GetConversationStats)
// Message routes
conversations.POST("/:id/messages", conversationHandler.CreateMessage)
conversations.GET("/:id/messages", conversationHandler.GetMessages)
conversations.PUT("/:id/messages/:messageId", conversationHandler.UpdateMessage)
conversations.DELETE("/:id/messages/:messageId", conversationHandler.DeleteMessage)
// AI interaction routes
conversations.POST("/:id/ai", conversationHandler.SendMessageWithAI)
}
// Knowledge base routes
knowledge := protected.Group("/knowledge")
{
knowledge.GET("", knowledgeHandler.ListKnowledgeEntries)
knowledge.GET("/search", knowledgeHandler.SearchKnowledge)
knowledge.GET("/categories", knowledgeHandler.GetCategories)
knowledge.GET("/tags", knowledgeHandler.GetTags)
knowledge.GET("/popular", knowledgeHandler.GetPopularKnowledge)
knowledge.GET("/recent", knowledgeHandler.GetRecentKnowledge)
knowledge.GET("/best-match", knowledgeHandler.FindBestMatch)
knowledge.GET("/stats", knowledgeHandler.GetKnowledgeStats)
knowledge.GET("/:id", knowledgeHandler.GetKnowledgeEntry)
knowledge.POST("/:id/rate", knowledgeHandler.RateKnowledgeEntry)
}
// AI routes
ai := protected.Group("/ai")
{
ai.POST("/query", aiHandler.QueryAI)
ai.POST("/analyze-complexity", aiHandler.AnalyzeComplexity)
ai.GET("/models", aiHandler.GetAvailableModels)
ai.POST("/openai", aiHandler.QueryOpenAI)
ai.POST("/ollama", aiHandler.QueryOllama)
}
// Admin routes (admin role required)
admin := protected.Group("/admin")
admin.Use(auth.RoleMiddleware("admin"))
{
// User management
admin.GET("/users", userHandler.AdminGetUsers)
admin.GET("/users/:id", userHandler.AdminGetUser)
admin.PUT("/users/:id", userHandler.AdminUpdateUser)
admin.DELETE("/users/:id", userHandler.AdminDeleteUser)
// Knowledge base management
admin.POST("/knowledge", knowledgeHandler.CreateKnowledgeEntry)
admin.PUT("/knowledge/:id", knowledgeHandler.UpdateKnowledgeEntry)
admin.DELETE("/knowledge/:id", knowledgeHandler.DeleteKnowledgeEntry)
}
// Agent routes (agent or admin role required)
agent := protected.Group("/agent")
agent.Use(auth.RoleMiddleware("agent", "admin"))
{
// Additional agent-only endpoints can be added here
}
}
}
return r
}
// CORSMiddleware adds CORS headers to the response
func CORSMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With")
c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE")
if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(204)
return
}
c.Next()
}
}