143 lines
4.6 KiB
Go
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()
|
|
}
|
|
}
|