49 lines
1.4 KiB
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
|
|
}
|