veza/veza-backend-api/internal/api/routes_moderation.go
senke 025c7aae45 feat(v0.11.2): F411-F420 moderation handler and routes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 17:49:51 +01:00

58 lines
2 KiB
Go

package api
import (
"veza-backend-api/internal/core/moderation"
"veza-backend-api/internal/services"
"github.com/gin-gonic/gin"
)
// setupModerationRoutes registers advanced moderation routes (v0.11.2 F411-F420)
func (r *APIRouter) setupModerationRoutes(router *gin.RouterGroup) {
moderationService := services.NewModerationService(r.db.GormDB, r.logger)
moderationHandler := moderation.NewModerationHandler(moderationService, r.logger)
// Admin moderation routes (require auth + admin)
admin := router.Group("/admin/moderation")
{
if r.config.AuthMiddleware != nil {
admin.Use(r.config.AuthMiddleware.RequireAuth())
admin.Use(r.config.AuthMiddleware.RequireAdmin())
}
// F411: Moderation queue
admin.GET("/queue", moderationHandler.GetModerationQueue)
admin.POST("/reports/:id/process", moderationHandler.ProcessReport)
admin.POST("/reports/:id/assign", moderationHandler.AssignReport)
// F413: Spam detections
admin.GET("/spam", moderationHandler.GetSpamDetections)
// F414: Audio fingerprints
admin.GET("/fingerprints", moderationHandler.GetPendingFingerprints)
admin.POST("/fingerprints/:trackId/review", moderationHandler.ReviewFingerprint)
// F415: Strikes & appeals (admin view)
admin.GET("/users/:userId/strikes", moderationHandler.GetUserStrikes)
admin.GET("/appeals", moderationHandler.GetPendingAppeals)
admin.POST("/appeals/:strikeId/resolve", moderationHandler.ResolveAppeal)
// Stats
admin.GET("/stats", moderationHandler.GetModerationStats)
}
// User-facing routes (require auth only)
protected := router.Group("")
{
if r.config.AuthMiddleware != nil {
protected.Use(r.config.AuthMiddleware.RequireAuth())
}
// F412: Enhanced reporting (any authenticated user)
protected.POST("/reports", moderationHandler.CreateEnhancedReport)
// F415: User's own strikes and appeals
protected.GET("/me/strikes", moderationHandler.GetMyStrikes)
protected.POST("/strikes/:strikeId/appeal", moderationHandler.AppealStrike)
}
}