veza/veza-backend-api/internal/services/feature_flag_service.go

49 lines
1.4 KiB
Go

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
}