package routes import ( accountHandlers "gobeyhan/app/account/handlers" accountServices "gobeyhan/app/account/services" blogHandlers "gobeyhan/app/blog/handlers" blogServices "gobeyhan/app/blog/services" "gobeyhan/app/middlewares" settingsHandlers "gobeyhan/app/settings/handlers" settingsServices "gobeyhan/app/settings/services" adminPkg "gobeyhan/internal/handler/admin" "github.com/gin-gonic/gin" ) // SetupRoutes initializes all application routes func SetupRoutes(r *gin.Engine) { // ============================================ // BLOG APP - Services & Handlers // ============================================ categoryService := blogServices.NewCategoryService() tagService := blogServices.NewTagService() postService := blogServices.NewPostService() commentService := blogServices.NewCommentService() categoryViewService := blogServices.NewCategoryViewService() categoryHandler := blogHandlers.NewCategoryHandler(categoryService) tagHandler := blogHandlers.NewTagHandler(tagService) postHandler := blogHandlers.NewPostHandler(postService) commentHandler := blogHandlers.NewCommentHandler(commentService) categoryViewHandler := blogHandlers.NewCategoryViewHandler(categoryViewService) // ============================================ // ACCOUNT APP - Services & Handlers // ============================================ // ============================================ // ACCOUNT APP - Services & Handlers // ============================================ userService := accountServices.NewUserService() socialAccountService := accountServices.NewSocialAccountService() roleService := accountServices.NewRoleService() permissionService := accountServices.NewPermissionService() // Settings & Utils settingsService := settingsServices.NewSettingsService() jwtService := settingsServices.NewJWTService() // Handlers userHandler := accountHandlers.NewUserHandler(userService) authHandler := accountHandlers.NewAuthHandler(userService, jwtService) oauthHandler := accountHandlers.NewOAuthHandler(userService, socialAccountService, jwtService) // socialAccountHandler := accountHandlers.NewSocialAccountHandler(socialAccountService) roleHandler := accountHandlers.NewRoleHandler(roleService) permissionHandler := accountHandlers.NewPermissionHandler(permissionService) // ============================================ // SETTINGS APP - Services & Handlers // ============================================ settingsHandler := settingsHandlers.NewSettingsHandler(settingsService) // ============================================ // ADMIN UI ROUTES // ============================================ adminHandler := adminPkg.NewHandler() r.GET("/admin/login", adminHandler.LoginPage) r.POST("/admin/login", adminHandler.LoginPost) r.GET("/admin", func(c *gin.Context) { c.Redirect(301, "/admin/dashboard") }) r.GET("/admin/dashboard", adminHandler.Dashboard) // User CRUD adminUserHandler := adminPkg.NewUserHandler() r.GET("/admin/users", adminUserHandler.List) r.GET("/admin/users/new", adminUserHandler.New) r.POST("/admin/users", adminUserHandler.Create) r.GET("/admin/users/:id/edit", adminUserHandler.Edit) r.POST("/admin/users/:id", adminUserHandler.Update) r.POST("/admin/users/:id/delete", adminUserHandler.Delete) // ======================================== // SETTINGS UI ROUTES // ======================================== adminSettingsHandler := adminPkg.NewSettingsHandler() // Whitelist r.GET("/admin/settings/whitelist", adminSettingsHandler.ListWhitelist) r.GET("/admin/settings/whitelist/new", adminSettingsHandler.NewWhitelist) r.POST("/admin/settings/whitelist", adminSettingsHandler.CreateWhitelist) r.GET("/admin/settings/whitelist/:id/edit", adminSettingsHandler.EditWhitelist) r.POST("/admin/settings/whitelist/:id", adminSettingsHandler.UpdateWhitelist) r.POST("/admin/settings/whitelist/:id/delete", adminSettingsHandler.DeleteWhitelist) // Blacklist r.GET("/admin/settings/blacklist", adminSettingsHandler.ListBlacklist) r.GET("/admin/settings/blacklist/new", adminSettingsHandler.NewBlacklist) r.POST("/admin/settings/blacklist", adminSettingsHandler.CreateBlacklist) r.GET("/admin/settings/blacklist/:id/edit", adminSettingsHandler.EditBlacklist) r.POST("/admin/settings/blacklist/:id", adminSettingsHandler.UpdateBlacklist) r.POST("/admin/settings/blacklist/:id/delete", adminSettingsHandler.DeleteBlacklist) // Rate Limits r.GET("/admin/settings/rate-limits", adminSettingsHandler.ListRateLimits) r.GET("/admin/settings/rate-limits/:id/edit", adminSettingsHandler.EditRateLimit) r.POST("/admin/settings/rate-limits/:id", adminSettingsHandler.UpdateRateLimit) r.POST("/admin/settings/rate-limits/:id/delete", adminSettingsHandler.DeleteRateLimit) // ======================================== // BLOG UI ROUTES // ======================================== adminBlogHandler := adminPkg.NewBlogHandler() r.GET("/admin/blog", adminBlogHandler.List) r.GET("/admin/blog/new", adminBlogHandler.New) r.POST("/admin/blog", adminBlogHandler.Create) r.GET("/admin/blog/:id/edit", adminBlogHandler.Edit) r.POST("/admin/blog/:id", adminBlogHandler.Update) r.POST("/admin/blog/:id/delete", adminBlogHandler.Delete) // Categories r.GET("/admin/blog/categories", adminBlogHandler.ListCategories) r.GET("/admin/blog/categories/new", adminBlogHandler.NewCategory) r.POST("/admin/blog/categories", adminBlogHandler.CreateCategory) r.GET("/admin/blog/categories/:id/edit", adminBlogHandler.EditCategory) r.POST("/admin/blog/categories/:id", adminBlogHandler.UpdateCategory) r.POST("/admin/blog/categories/:id/delete", adminBlogHandler.DeleteCategory) // Tags r.GET("/admin/blog/tags", adminBlogHandler.ListTags) r.GET("/admin/blog/tags/new", adminBlogHandler.NewTag) r.POST("/admin/blog/tags", adminBlogHandler.CreateTag) r.GET("/admin/blog/tags/:id/edit", adminBlogHandler.EditTag) r.POST("/admin/blog/tags/:id", adminBlogHandler.UpdateTag) r.POST("/admin/blog/tags/:id/delete", adminBlogHandler.DeleteTag) // Comments r.GET("/admin/blog/comments", adminBlogHandler.ListComments) r.GET("/admin/blog/comments/:id/edit", adminBlogHandler.EditComment) r.POST("/admin/blog/comments/:id", adminBlogHandler.UpdateComment) r.POST("/admin/blog/comments/:id/delete", adminBlogHandler.DeleteComment) // Static files sharing r.Static("/uploads", "./uploads") // ============================================ // API v1 Group // ============================================ api := r.Group("/api/v1") api.Use(middlewares.DynamicCorsMiddleware(settingsService)) { // ======================================== // AUTH ENDPOINTS // ======================================== auth := api.Group("/auth") { // Basic Auth auth.POST("/register", authHandler.Register) auth.POST("/login", authHandler.Login) auth.POST("/refresh", authHandler.RefreshToken) auth.POST("/logout", authHandler.Logout) // OAuth auth.GET("/google", oauthHandler.GoogleLogin) auth.GET("/google/callback", oauthHandler.GoogleCallback) auth.GET("/github", oauthHandler.GithubLogin) auth.GET("/github/callback", oauthHandler.GithubCallback) // Protected auth.GET("/me", middlewares.AuthMiddleware(jwtService), authHandler.GetCurrentUser) } // ======================================== // PUBLIC ENDPOINTS (Read-only) // ======================================== // Blog - Categories api.GET("/categories", categoryHandler.GetAllCategories) api.GET("/categories/:slug", categoryHandler.GetCategoryBySlug) api.POST("/categories/:id/view", categoryViewHandler.TrackCategoryView) // Blog - Tags api.GET("/tags", tagHandler.GetAllTags) api.GET("/tags/:slug", tagHandler.GetTagBySlug) // Blog - Posts api.GET("/posts", postHandler.GetAllPosts) api.GET("/posts/:slug", postHandler.GetPostBySlug) // Blog - Comments (separate route to avoid wildcard conflict) api.GET("/comments/post/:postId", commentHandler.GetPostComments) // ======================================== // AUTHENTICATED USER ENDPOINTS // ======================================== // NOTE: These routes require AuthMiddleware() // Uncomment when authentication middleware is ready // user := api.Group("/user") // user.Use(AuthMiddleware()) // { // // Blog - Comments (authenticated users can comment) // user.POST("/comments/post/:postId", commentHandler.CreatePostComment) // // // Account - Social Accounts // user.GET("/social-accounts", socialAccountHandler.GetUserSocialAccounts) // user.DELETE("/social-accounts/:id", socialAccountHandler.DeleteSocialAccount) // } // ======================================== // ADMIN ENDPOINTS (Protected) // ======================================== // NOTE: These routes require AuthMiddleware() + AdminMiddleware() admin := api.Group("/admin") admin.Use(middlewares.AuthMiddleware(jwtService), middlewares.AdminMiddleware()) { // ======================================== // BLOG APP - Admin Routes // ======================================== // Categories admin.GET("/categories", categoryHandler.AdminGetAllCategories) admin.GET("/categories/:id", categoryHandler.GetCategoryByID) admin.POST("/categories", categoryHandler.CreateCategory) admin.PUT("/categories/:id", categoryHandler.UpdateCategory) admin.DELETE("/categories/:id", categoryHandler.DeleteCategory) admin.GET("/categories/:id/views", categoryViewHandler.GetCategoryViewStats) // Tags admin.GET("/tags", tagHandler.AdminGetAllTags) admin.GET("/tags/:id", tagHandler.GetTagByID) admin.POST("/tags", tagHandler.CreateTag) admin.PUT("/tags/:id", tagHandler.UpdateTag) admin.DELETE("/tags/:id", tagHandler.DeleteTag) // Posts admin.GET("/posts", postHandler.AdminGetAllPosts) admin.GET("/posts/:id", postHandler.GetPostByID) admin.POST("/posts", postHandler.CreatePost) admin.PUT("/posts/:id", postHandler.UpdatePost) admin.DELETE("/posts/:id", postHandler.DeletePost) // Comments admin.GET("/comments", commentHandler.AdminGetAllComments) admin.GET("/comments/:id", commentHandler.AdminGetCommentByID) admin.PUT("/comments/:id", commentHandler.AdminUpdateComment) admin.DELETE("/comments/:id", commentHandler.AdminDeleteComment) // Category Views admin.GET("/category-views", categoryViewHandler.AdminGetAllCategoryViews) // ======================================== // ACCOUNT APP - Admin Routes // ======================================== // Users admin.GET("/users", userHandler.AdminGetAllUsers) admin.GET("/users/:id", userHandler.AdminGetUserByID) admin.POST("/users", userHandler.AdminCreateUser) admin.PUT("/users/:id", userHandler.AdminUpdateUser) admin.DELETE("/users/:id", userHandler.AdminDeleteUser) admin.POST("/users/:id/restore", userHandler.AdminRestoreUser) admin.POST("/users/:id/roles", userHandler.AdminAssignRole) admin.DELETE("/users/:id/roles/:role_id", userHandler.AdminRemoveRole) // Roles admin.GET("/roles", roleHandler.AdminGetAllRoles) admin.GET("/roles/:id", roleHandler.AdminGetRoleByID) admin.POST("/roles", roleHandler.AdminCreateRole) admin.PUT("/roles/:id", roleHandler.AdminUpdateRole) admin.DELETE("/roles/:id", roleHandler.AdminDeleteRole) // Permissions admin.GET("/permissions", permissionHandler.AdminGetAllPermissions) admin.POST("/permissions", permissionHandler.AdminCreatePermission) // ======================================== // SETTINGS APP - Admin Routes // ======================================== // CORS Whitelist admin.GET("/cors/whitelist", settingsHandler.GetAllWhitelist) admin.POST("/cors/whitelist", settingsHandler.CreateWhitelist) admin.PUT("/cors/whitelist/:id", settingsHandler.UpdateWhitelist) admin.DELETE("/cors/whitelist/:id", settingsHandler.DeleteWhitelist) // CORS Blacklist admin.GET("/cors/blacklist", settingsHandler.GetAllBlacklist) admin.POST("/cors/blacklist", settingsHandler.CreateBlacklist) admin.PUT("/cors/blacklist/:id", settingsHandler.UpdateBlacklist) admin.DELETE("/cors/blacklist/:id", settingsHandler.DeleteBlacklist) // CORS Cache admin.POST("/cors/cache/invalidate", settingsHandler.InvalidateCorsCache) // Rate Limits admin.GET("/rate-limits", settingsHandler.GetAllRateLimits) admin.PUT("/rate-limits/:id", settingsHandler.UpdateRateLimit) } } }