2025-11-23 22:49:46 +07:00

129 lines
5.1 KiB
Go

// internal/routes/routes.go
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)
}
}
}