package services import ( "context" "fmt" "time" "go.uber.org/zap" "gorm.io/gorm" "veza-backend-api/internal/models" ) // FeatureFlagService handles feature flags (v0.803 ADM1-05) type FeatureFlagService struct { db *gorm.DB logger *zap.Logger } // NewFeatureFlagService creates a new FeatureFlagService func NewFeatureFlagService(db *gorm.DB, logger *zap.Logger) *FeatureFlagService { return &FeatureFlagService{db: db, logger: logger} } // List returns all feature flags func (s *FeatureFlagService) List(ctx context.Context) ([]models.FeatureFlag, error) { var list []models.FeatureFlag if err := s.db.WithContext(ctx).Order("name ASC").Find(&list).Error; err != nil { return nil, fmt.Errorf("failed to list feature flags: %w", err) } return list, nil } // Toggle enables or disables a feature flag by name func (s *FeatureFlagService) Toggle(ctx context.Context, name string, enabled bool) (*models.FeatureFlag, error) { var flag models.FeatureFlag if err := s.db.WithContext(ctx).Where("name = ?", name).First(&flag).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, fmt.Errorf("feature flag not found: %s", name) } return nil, fmt.Errorf("failed to get feature flag: %w", err) } flag.Enabled = enabled flag.UpdatedAt = time.Now() if err := s.db.WithContext(ctx).Save(&flag).Error; err != nil { return nil, fmt.Errorf("failed to update feature flag: %w", err) } return &flag, nil }