Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion azureappconfiguration/azureappconfiguration.go
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,11 @@ func (azappcfg *AzureAppConfiguration) loadFeatureFlags(ctx context.Context, set

dedupFeatureFlags := make(map[string]any, len(settingsResponse.settings))
for _, setting := range settingsResponse.settings {
// Skip non-feature flag settings
if setting.ContentType == nil || *setting.ContentType != featureFlagContentType {
continue
}

if setting.Key != nil {
var v map[string]any
if err := json.Unmarshal([]byte(*setting.Value), &v); err != nil {
Expand Down Expand Up @@ -725,7 +730,9 @@ func deduplicateSelectors(selectors []Selector) []Selector {

func getFeatureFlagSelectors(selectors []Selector) []Selector {
for i := range selectors {
selectors[i].KeyFilter = featureFlagKeyPrefix + selectors[i].KeyFilter
if selectors[i].SnapshotName == "" {
selectors[i].KeyFilter = featureFlagKeyPrefix + selectors[i].KeyFilter
}
}

return selectors
Expand Down
6 changes: 6 additions & 0 deletions azureappconfiguration/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,12 @@ type Selector struct {
// Empty string or omitted value will use the default no-label filter.
// Note: Wildcards are not supported in label filters.
LabelFilter string

// Snapshot is a set of key-values selected from the App Configuration store based on the composition type and filters.
// Once created, it is stored as an immutable entity that can be referenced by name.
// SnapshotName specifies the name of the snapshot to retrieve.
// If SnapshotName is used in a selector, no key and label filter should be used for it. Otherwise, an error will be returned.
SnapshotName string
}

// KeyValueRefreshOptions contains optional parameters to configure the behavior of key-value settings refresh
Expand Down
50 changes: 36 additions & 14 deletions azureappconfiguration/settings_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package azureappconfiguration
import (
"context"
"errors"
"fmt"
"log"

"github.com/Azure/AppConfiguration-GoProvider/azureappconfiguration/internal/tracing"
Expand Down Expand Up @@ -62,25 +63,46 @@ func (s *selectorSettingsClient) getSettings(ctx context.Context) (*settingsResp
settings := make([]azappconfig.Setting, 0)
pageETags := make(map[Selector][]*azcore.ETag)
for _, filter := range s.selectors {
selector := azappconfig.SettingSelector{
KeyFilter: to.Ptr(filter.KeyFilter),
LabelFilter: to.Ptr(filter.LabelFilter),
Fields: azappconfig.AllSettingFields(),
}
if filter.SnapshotName == "" {
selector := azappconfig.SettingSelector{
KeyFilter: to.Ptr(filter.KeyFilter),
LabelFilter: to.Ptr(filter.LabelFilter),
Fields: azappconfig.AllSettingFields(),
}

pager := s.client.NewListSettingsPager(selector, nil)
eTags := make([]*azcore.ETag, 0)
for pager.More() {
page, err := pager.NextPage(ctx)
pager := s.client.NewListSettingsPager(selector, nil)
eTags := make([]*azcore.ETag, 0)
for pager.More() {
page, err := pager.NextPage(ctx)
if err != nil {
return nil, err
} else if page.Settings != nil {
settings = append(settings, page.Settings...)
eTags = append(eTags, page.ETag)
}
}

pageETags[filter] = eTags
} else {
snapshot, err := s.client.GetSnapshot(ctx, filter.SnapshotName, nil)
if err != nil {
return nil, err
} else if page.Settings != nil {
settings = append(settings, page.Settings...)
eTags = append(eTags, page.ETag)
}
}

pageETags[filter] = eTags
if snapshot.CompositionType == nil || *snapshot.CompositionType != azappconfig.CompositionTypeKey {
return nil, fmt.Errorf("composition type for the selected snapshot '%s' must be 'key'", filter.SnapshotName)
Comment on lines +92 to +93
Copy link

Copilot AI Aug 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error message should specify what composition types are supported or provide more context about why only 'key' type is allowed.

Suggested change
if snapshot.CompositionType == nil || *snapshot.CompositionType != azappconfig.CompositionTypeKey {
return nil, fmt.Errorf("composition type for the selected snapshot '%s' must be 'key'", filter.SnapshotName)
return nil, fmt.Errorf(
"unsupported composition type '%v' for snapshot '%s': only 'key' is supported by this client. "+
"Other composition types (e.g., 'set') are not supported.",
snapshot.CompositionType, filter.SnapshotName)

Copilot uses AI. Check for mistakes.
}

pager := s.client.NewListSettingsForSnapshotPager(filter.SnapshotName, nil)
for pager.More() {
page, err := pager.NextPage(ctx)
if err != nil {
return nil, err
} else if page.Settings != nil {
settings = append(settings, page.Settings...)
}
}
}
}

return &settingsResponse{
Expand Down
Loading
Loading