veza/veza-backend-api/internal/api/routes_marketplace.go

82 lines
3.1 KiB
Go

package api
import (
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"veza-backend-api/internal/core/marketplace"
"veza-backend-api/internal/handlers"
"veza-backend-api/internal/services"
"veza-backend-api/internal/services/hyperswitch"
)
// setupMarketplaceRoutes configure les routes de la marketplace
func (r *APIRouter) setupMarketplaceRoutes(router *gin.RouterGroup) {
uploadDir := r.config.UploadDir
if uploadDir == "" {
uploadDir = "uploads/tracks"
}
storageService := services.NewTrackStorageService(uploadDir, false, r.logger)
opts := []marketplace.ServiceOption{}
if r.config.HyperswitchEnabled && r.config.HyperswitchAPIKey != "" && r.config.HyperswitchURL != "" {
hsClient := hyperswitch.NewClient(r.config.HyperswitchURL, r.config.HyperswitchAPIKey)
hsProvider := hyperswitch.NewProvider(hsClient)
opts = append(opts,
marketplace.WithPaymentProvider(hsProvider),
marketplace.WithHyperswitchConfig(true, r.config.CheckoutSuccessURL),
)
}
marketService := marketplace.NewService(r.db.GormDB, r.logger, storageService, opts...)
marketHandler := handlers.NewMarketplaceHandler(marketService, r.logger)
group := router.Group("/marketplace")
group.GET("/products", marketHandler.ListProducts)
if r.config.AuthMiddleware != nil {
protected := group.Group("")
protected.Use(r.config.AuthMiddleware.RequireAuth())
r.applyCSRFProtection(protected)
createGroup := protected.Group("")
createGroup.Use(r.config.AuthMiddleware.RequireContentCreatorRole())
createGroup.POST("/products", marketHandler.CreateProduct)
productOwnerResolver := func(c *gin.Context) (uuid.UUID, error) {
productIDStr := c.Param("id")
productID, err := uuid.Parse(productIDStr)
if err != nil {
return uuid.Nil, err
}
product, err := marketService.GetProduct(c.Request.Context(), productID)
if err != nil {
return uuid.Nil, err
}
return product.SellerID, nil
}
protected.PUT("/products/:id", r.config.AuthMiddleware.RequireOwnershipOrAdmin("product", productOwnerResolver), marketHandler.UpdateProduct)
protected.GET("/orders", marketHandler.ListOrders)
protected.GET("/orders/:id", marketHandler.GetOrder)
protected.POST("/orders", marketHandler.CreateOrder)
protected.GET("/download/:product_id", marketHandler.GetDownloadURL)
marketplaceExtHandler := handlers.NewMarketplaceExtHandler(marketService, r.logger)
protected.GET("/wishlist", marketplaceExtHandler.GetWishlist)
protected.POST("/wishlist", marketplaceExtHandler.AddToWishlist)
protected.DELETE("/wishlist/:productId", marketplaceExtHandler.RemoveFromWishlist)
}
commerce := router.Group("/commerce")
if r.config.AuthMiddleware != nil {
cartProtected := commerce.Group("")
cartProtected.Use(r.config.AuthMiddleware.RequireAuth())
r.applyCSRFProtection(cartProtected)
marketplaceExtHandler := handlers.NewMarketplaceExtHandler(marketService, r.logger)
cartProtected.GET("/cart", marketplaceExtHandler.GetCart)
cartProtected.POST("/cart/items", marketplaceExtHandler.AddToCart)
cartProtected.DELETE("/cart/items/:id", marketplaceExtHandler.RemoveFromCart)
cartProtected.POST("/cart/checkout", marketplaceExtHandler.Checkout)
}
}