package config import ( "veza-backend-api/internal/repositories" "veza-backend-api/internal/services" ) // InitServicesForTest initializes services for integration/E2E tests. // Exported for use by internal/integration and tests packages. func (c *Config) InitServicesForTest() error { return c.initServices() } // initServices initialise tous les services func (c *Config) initServices() error { // Service de session c.SessionService = services.NewSessionService(c.Database, c.Logger) // Service d'audit c.AuditService = services.NewAuditService(c.Database, c.Logger) // Service TOTP c.TOTPService = services.NewTOTPService(c.Database, c.Logger) // Validateur d'upload uploadConfig := services.DefaultUploadConfig() // Lire ENABLE_CLAMAV depuis l'environnement (défaut: true pour sécurité en production) // En développement, peut être désactivé si ClamAV n'est pas disponible clamAVEnabled := getEnvBool("ENABLE_CLAMAV", true) uploadConfig.ClamAVEnabled = clamAVEnabled if !clamAVEnabled { c.Logger.Warn("ENABLE_CLAMAV=false - ClamAV virus scanning is disabled. This should only be used in development environments.") } // MOD-P1-002: Lire CLAMAV_REQUIRED depuis l'environnement (défaut: true pour sécurité) clamAVRequired := getEnvBool("CLAMAV_REQUIRED", true) uploadConfig.ClamAVRequired = clamAVRequired if !clamAVRequired { c.Logger.Warn("CLAMAV_REQUIRED=false - Uploads will be accepted even if ClamAV is unavailable (degraded mode). This should only be used in development or with alternative security measures.") } // Chemin vers clamdscan (exec) - remplace go-clamd abandonné if p := getEnv("CLAMAV_CLAMD_PATH", ""); p != "" { uploadConfig.ClamAVClamdPath = p } // Adresse ClamAV pour connexion TCP (ex: clamav:3310 en Docker) if addr := getEnv("CLAMAV_ADDRESS", ""); addr != "" { uploadConfig.ClamAVAddress = addr } var err error c.UploadValidator, err = services.NewUploadValidator(uploadConfig, c.Logger) if err != nil { return err } // Service de cache (only when Redis is available; nil client causes panics) if c.RedisClient != nil { c.CacheService = services.NewCacheService(c.RedisClient, c.Logger) c.TokenBlacklist = services.NewTokenBlacklist(c.RedisClient) // VEZA-SEC-006 } // Service de playlist c.PlaylistService = services.NewPlaylistServiceWithDB(c.Database.GormDB, c.Logger) // Service de permissions c.PermissionService = services.NewPermissionService(c.Database.GormDB) // JWT Service (v0.9.1: RS256 prefer, HS256 dev fallback) c.JWTService, err = services.NewJWTService(c.JWTPrivateKeyPath, c.JWTPublicKeyPath, c.JWTSecret, c.JWTIssuer, c.JWTAudience) if err != nil { return err } // User Service userRepo := repositories.NewGormUserRepository(c.Database.GormDB) c.UserService = services.NewUserServiceWithDB(userRepo, c.Database.GormDB) // BE-SVC-001: Set cache service for UserService if c.CacheService != nil { c.UserService.SetCacheService(c.CacheService) } // BE-SVC-001: Set cache service for PlaylistService if c.CacheService != nil && c.PlaylistService != nil { c.PlaylistService.SetCacheService(c.CacheService) } // API Key Service (v0.102 Lot C - developer portal) c.APIKeyService = services.NewAPIKeyService(c.Database.GormDB, c.Logger) // Presence Service (v0.301 Lot P1 - user presence for chat/social) c.PresenceService = services.NewPresenceService(c.Database.GormDB, c.Logger) return nil }