package routes import ( "bugulma/backend/internal/handler" "bugulma/backend/internal/middleware" "bugulma/backend/internal/service" "github.com/gin-gonic/gin" ) // RegisterAdminRoutes registers all admin routes func RegisterAdminRoutes( protected *gin.RouterGroup, userHandler *handler.UserHandler, orgAdminHandler *handler.OrganizationAdminHandler, i18nHandler *handler.I18nHandler, contentHandler *handler.ContentHandler, adminHandler *handler.AdminHandler, authService *service.AuthService, ) { // All admin routes require authentication and admin role admin := protected.Group("/admin") // Apply AuthMiddleware first to set user_role in context admin.Use(middleware.AuthMiddleware(authService)) // Then check for admin role admin.Use(middleware.RequireRole("admin")) // User Management users := admin.Group("/users") { users.GET("", userHandler.ListUsers) users.GET("/stats", userHandler.GetUserStats) users.GET("/:id", userHandler.GetUser) users.POST("", userHandler.CreateUser) users.PUT("/:id", userHandler.UpdateUser) users.PATCH("/:id/role", userHandler.UpdateRole) users.PATCH("/:id/permissions", userHandler.UpdatePermissions) users.DELETE("/:id", userHandler.DeactivateUser) users.GET("/:id/activity", userHandler.GetUserActivity) } // Organization Management (Admin) organizations := admin.Group("/organizations") { organizations.GET("/verification-queue", orgAdminHandler.GetVerificationQueue) organizations.POST("/:id/verify", orgAdminHandler.VerifyOrganization) organizations.POST("/:id/reject", orgAdminHandler.RejectVerification) organizations.POST("/bulk-verify", orgAdminHandler.BulkVerify) organizations.GET("/stats", orgAdminHandler.GetOrganizationStats) } // Localization Management (Admin) i18n := admin.Group("/i18n") { // UI Translations ui := i18n.Group("/ui") { ui.PUT("/:locale/:key", i18nHandler.UpdateUITranslation) ui.POST("/bulk-update", i18nHandler.BulkUpdateUITranslations) ui.POST("/auto-translate", i18nHandler.AutoTranslateMissing) ui.GET("/:locale/keys", i18nHandler.GetTranslationKeys) } // Data Translations data := i18n.Group("/data") { data.PUT("/:entityType/:entityID/:field/:locale", i18nHandler.UpdateDataTranslation) data.POST("/bulk-translate", i18nHandler.BulkTranslateData) data.GET("/:entityType/missing", i18nHandler.GetMissingTranslations) } } // Content Management content := admin.Group("/content") { // Static Pages pages := content.Group("/pages") { pages.GET("", contentHandler.ListPages) pages.GET("/:id", contentHandler.GetPage) pages.POST("", contentHandler.CreatePage) pages.PUT("/:id", contentHandler.UpdatePage) pages.DELETE("/:id", contentHandler.DeletePage) pages.POST("/:id/publish", contentHandler.PublishPage) } // Announcements announcements := content.Group("/announcements") { announcements.GET("", contentHandler.ListAnnouncements) announcements.GET("/:id", contentHandler.GetAnnouncement) announcements.POST("", contentHandler.CreateAnnouncement) announcements.PUT("/:id", contentHandler.UpdateAnnouncement) announcements.DELETE("/:id", contentHandler.DeleteAnnouncement) } // Media Assets media := content.Group("/media") { media.GET("", contentHandler.ListMediaAssets) media.GET("/:id", contentHandler.GetMediaAsset) media.POST("", contentHandler.CreateMediaAsset) media.PUT("/:id", contentHandler.UpdateMediaAsset) media.DELETE("/:id", contentHandler.DeleteMediaAsset) } } // Dashboard & Analytics dashboard := admin.Group("/dashboard") { dashboard.GET("/stats", adminHandler.GetDashboardStats) dashboard.GET("/activity", adminHandler.GetRecentActivity) } analytics := admin.Group("/analytics") { analytics.GET("/organizations", adminHandler.GetOrganizationStats) analytics.GET("/users", adminHandler.GetUserActivityStats) analytics.GET("/matching", adminHandler.GetMatchingStats) } system := admin.Group("/system") { system.GET("/health", adminHandler.GetSystemHealth) } }