package router import ( "sql-platform/internal/handler" "sql-platform/internal/middleware" "github.com/gin-gonic/gin" ) func Setup(r *gin.Engine) { api := r.Group("/api/v1") // Public routes api.POST("/auth/login", handler.Login) // Authenticated routes auth := api.Group("") auth.Use(middleware.AuthMiddleware()) { // Auth auth.GET("/auth/me", handler.GetMe) // Dashboard auth.GET("/dashboard/stats", handler.DashboardStats) auth.GET("/dashboard/my-tickets", handler.MyTickets) // Tickets auth.GET("/tickets/statistics", handler.TicketStatistics) auth.GET("/tickets", handler.ListTickets) auth.GET("/tickets/:id", handler.GetTicket) auth.POST("/tickets", handler.CreateTicket) auth.POST("/tickets/:id/approve", handler.ApproveTicket) auth.POST("/tickets/:id/execute", handler.ExecuteTicket) // Instances auth.GET("/instances", handler.ListInstances) auth.GET("/instances/accessible", handler.AccessibleInstances) auth.GET("/instances/stats", handler.InstanceStats) auth.GET("/instances/:id", handler.GetInstance) auth.GET("/instances/:id/databases", handler.ListDatabases) auth.GET("/instances/:id/databases/:db/tables", handler.ListTables) auth.POST("/instances/:id/test-connection", handler.TestConnection) auth.POST("/instances/test-connection", handler.TestNewConnection) // Instance management (admin/dba only) admin := auth.Group("") admin.Use(middleware.RequireRole("admin", "dba")) { admin.POST("/instances", handler.CreateInstance) admin.PUT("/instances/:id", handler.UpdateInstance) admin.DELETE("/instances/:id", handler.DeleteInstance) } // Instance Groups auth.GET("/instance-groups", handler.ListInstanceGroups) auth.GET("/instance-groups/:id", handler.GetInstanceGroup) auth.GET("/instance-groups/:id/users", handler.ListGroupUsers) auth.POST("/instance-groups/:id/instances", handler.AssignGroupInstances) auth.DELETE("/instance-groups/:id/instances/:instanceId", handler.RemoveGroupInstance) auth.POST("/instance-groups/:id/users", handler.AssignGroupUsers) auth.PUT("/instance-groups/users/:userId/groups", handler.UpdateUserGroups) // Instance Group management (admin/dba only) igAdmin := auth.Group("") igAdmin.Use(middleware.RequireRole("admin", "dba")) { igAdmin.POST("/instance-groups", handler.CreateInstanceGroup) igAdmin.PUT("/instance-groups/:id", handler.UpdateInstanceGroup) igAdmin.DELETE("/instance-groups/:id", handler.DeleteInstanceGroup) } // Users (admin only) userAdmin := auth.Group("") userAdmin.Use(middleware.RequireRole("admin")) { userAdmin.GET("/users", handler.ListUsers) userAdmin.POST("/users", handler.CreateUser) userAdmin.PUT("/users/:id", handler.UpdateUser) userAdmin.DELETE("/users/:id", handler.DeleteUser) } // LDAP config (admin only) ldapAdmin := auth.Group("") ldapAdmin.Use(middleware.RequireRole("admin")) { ldapAdmin.GET("/ldap-config", handler.GetLDAPConfig) ldapAdmin.PUT("/ldap-config", handler.UpdateLDAPConfig) ldapAdmin.POST("/ldap-config/test", handler.TestLDAPConnection) ldapAdmin.POST("/ldap-config/ou-list", handler.ListLDAPOUs) ldapAdmin.POST("/ldap-config/user-list", handler.ListLDAPUsers) ldapAdmin.POST("/ldap-config/create-ou", handler.CreateLDAPOU) ldapAdmin.POST("/ldap-config/create-user", handler.CreateLDAPUser) ldapAdmin.POST("/ldap-config/batch-import-ldap", handler.BatchImportLDAP) } // Settings auth.GET("/settings", handler.ListSettings) auth.PUT("/settings", handler.UpdateSettings) auth.GET("/settings/cleanup/preview", handler.SettingsCleanupPreview) auth.POST("/settings/cleanup/run", handler.SettingsCleanupRun) // gh-ost (admin/dba only) ghostGroup := auth.Group("") ghostGroup.Use(middleware.RequireRole("admin", "dba")) { ghostGroup.POST("/ghost/dry-run", handler.GhOstDryRun) ghostGroup.POST("/ghost/execute", handler.GhOstExecute) ghostGroup.GET("/ghost/status/:taskId", handler.GhOstStatus) ghostGroup.GET("/ghost/tasks", handler.GhOstListTasks) } // Read-only resources auth.GET("/audit-rules", handler.ListAuditRules) auth.GET("/announcements", handler.ListAnnouncements) auth.GET("/query-histories", handler.ListQueryHistories) auth.GET("/notifications/channels", handler.ListNotificationChannels) auth.GET("/notifications/templates", handler.ListNotificationTemplates) auth.GET("/workflows", handler.ListWorkflows) auth.POST("/notifications/test", handler.TestNotification) } }