package routes import ( "lost-and-found/internal/controllers" "lost-and-found/internal/middleware" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // SetupRoutes configures all application routes func SetupRoutes(router *gin.Engine, db *gorm.DB) { // Initialize controllers authController := controllers.NewAuthController(db) userController := controllers.NewUserController(db) itemController := controllers.NewItemController(db) lostItemController := controllers.NewLostItemController(db) claimController := controllers.NewClaimController(db) matchController := controllers.NewMatchController(db) categoryController := controllers.NewCategoryController(db) archiveController := controllers.NewArchiveController(db) adminController := controllers.NewAdminController(db) reportController := controllers.NewReportController(db) // API group api := router.Group("/api") { // Public routes (no authentication required) api.POST("/register", authController.Register) api.POST("/login", authController.Login) api.POST("/refresh-token", authController.RefreshToken) // Public categories api.GET("/categories", categoryController.GetAllCategories) api.GET("/categories/:id", categoryController.GetCategoryByID) // Public items (read-only, limited info) api.GET("/items", itemController.GetAllItems) api.GET("/items/:id", itemController.GetItemByID) // Authenticated routes (all users) authenticated := api.Group("") authenticated.Use(middleware.JWTMiddleware(db)) authenticated.Use(middleware.RequireUser()) { // User profile authenticated.GET("/me", authController.GetMe) authenticated.GET("/user/profile", userController.GetProfile) authenticated.PUT("/user/profile", userController.UpdateProfile) authenticated.POST("/user/change-password", userController.ChangePassword) authenticated.GET("/user/stats", userController.GetStats) // User items authenticated.GET("/user/items", itemController.GetItemsByReporter) authenticated.POST("/items", itemController.CreateItem) // User lost items authenticated.GET("/user/lost-items", lostItemController.GetLostItemsByUser) authenticated.GET("/lost-items", lostItemController.GetAllLostItems) authenticated.GET("/lost-items/:id", lostItemController.GetLostItemByID) authenticated.POST("/lost-items", lostItemController.CreateLostItem) authenticated.PUT("/lost-items/:id", lostItemController.UpdateLostItem) authenticated.PATCH("/lost-items/:id/status", lostItemController.UpdateLostItemStatus) authenticated.DELETE("/lost-items/:id", lostItemController.DeleteLostItem) // User claims authenticated.GET("/user/claims", claimController.GetClaimsByUser) authenticated.GET("/claims", claimController.GetAllClaims) authenticated.GET("/claims/:id", claimController.GetClaimByID) authenticated.POST("/claims", claimController.CreateClaim) authenticated.DELETE("/claims/:id", claimController.DeleteClaim) // Matches (for lost items) authenticated.GET("/lost-items/:id/matches", matchController.GetMatchesForLostItem) authenticated.POST("/lost-items/:id/find-similar", matchController.FindSimilarItems) } // Manager routes (manager and admin) manager := api.Group("") manager.Use(middleware.JWTMiddleware(db)) manager.Use(middleware.RequireManager()) { // Item management manager.PUT("/items/:id", itemController.UpdateItem) manager.PATCH("/items/:id/status", itemController.UpdateItemStatus) manager.DELETE("/items/:id", itemController.DeleteItem) manager.GET("/items/:id/revisions", itemController.GetItemRevisionHistory) manager.GET("/items/:id/matches", matchController.GetMatchesForItem) // Claim verification manager.POST("/claims/:id/verify", claimController.VerifyClaim) manager.GET("/claims/:id/verification", claimController.GetClaimVerification) manager.POST("/claims/:id/close", claimController.CloseClaim) // Archives manager.GET("/archives", archiveController.GetAllArchives) manager.GET("/archives/:id", archiveController.GetArchiveByID) manager.GET("/archives/stats", archiveController.GetArchiveStats) // Dashboard manager.GET("/manager/dashboard", adminController.GetDashboardStats) } // Admin routes (admin only) admin := api.Group("/admin") admin.Use(middleware.JWTMiddleware(db)) admin.Use(middleware.RequireAdmin()) { // User management admin.GET("/users", userController.GetAllUsers) admin.GET("/users/:id", userController.GetUserByID) admin.PATCH("/users/:id/role", userController.UpdateUserRole) admin.POST("/users/:id/block", userController.BlockUser) admin.POST("/users/:id/unblock", userController.UnblockUser) admin.DELETE("/users/:id", userController.DeleteUser) // Category management admin.POST("/categories", categoryController.CreateCategory) admin.PUT("/categories/:id", categoryController.UpdateCategory) admin.DELETE("/categories/:id", categoryController.DeleteCategory) // Dashboard & Reports admin.GET("/dashboard", adminController.GetDashboardStats) admin.GET("/audit-logs", adminController.GetAuditLogs) admin.POST("/reports/export", reportController.ExportReport) } } }