Skip to content

Commit d10502a

Browse files
authored
feat: remove-overrides on dev server (#534)
- Added a remove-overrides subcommand of dev-server - Added the backing REST API and store function and tests - Updated Remove all overrides button in the UI to make the single HTTP call instead of multiple Resolves #533
1 parent 6083e8b commit d10502a

File tree

8 files changed

+270
-28
lines changed

8 files changed

+270
-28
lines changed

cmd/dev_server/dev_server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ func NewDevServerCmd(client resources.Client, analyticsTrackerFn analytics.Track
6262
cmd.AddGroup(&cobra.Group{ID: "overrides", Title: "Override commands:"})
6363
cmd.AddCommand(NewAddOverrideCmd(client))
6464
cmd.AddCommand(NewRemoveOverrideCmd(client))
65+
cmd.AddCommand(NewDeleteOverridesCmd(client))
6566
cmd.AddGroup(&cobra.Group{ID: "server", Title: "Server commands:"})
6667

6768
cmd.AddCommand(NewStartServerCmd(ldClient))

cmd/dev_server/overrides.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,44 @@ func addOverride(client resources.Client) func(*cobra.Command, []string) error {
7373
}
7474
}
7575

76+
func NewDeleteOverridesCmd(client resources.Client) *cobra.Command {
77+
cmd := &cobra.Command{
78+
GroupID: "overrides",
79+
Args: validators.Validate(),
80+
Long: "remove all overrides for a project",
81+
RunE: deleteOverrides(client),
82+
Short: "remove all overrides for a project",
83+
Use: "remove-overrides",
84+
}
85+
86+
cmd.SetUsageTemplate(resourcescmd.SubcommandUsageTemplate())
87+
88+
cmd.Flags().String(cliflags.ProjectFlag, "", "The project key")
89+
_ = cmd.MarkFlagRequired(cliflags.ProjectFlag)
90+
_ = cmd.Flags().SetAnnotation(cliflags.ProjectFlag, "required", []string{"true"})
91+
_ = viper.BindPFlag(cliflags.ProjectFlag, cmd.Flags().Lookup(cliflags.ProjectFlag))
92+
93+
return cmd
94+
}
95+
96+
func deleteOverrides(client resources.Client) func(*cobra.Command, []string) error {
97+
return func(cmd *cobra.Command, args []string) error {
98+
path := fmt.Sprintf("%s/dev/projects/%s/overrides", getDevServerUrl(), viper.GetString(cliflags.ProjectFlag))
99+
res, err := client.MakeUnauthenticatedRequest(
100+
"DELETE",
101+
path,
102+
nil,
103+
)
104+
if err != nil {
105+
return output.NewCmdOutputError(err, viper.GetString(cliflags.OutputFlag))
106+
}
107+
108+
fmt.Fprint(cmd.OutOrStdout(), string(res))
109+
110+
return nil
111+
}
112+
}
113+
76114
func NewRemoveOverrideCmd(client resources.Client) *cobra.Command {
77115
cmd := &cobra.Command{
78116
GroupID: "overrides",

internal/dev_server/api/api.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,17 @@ paths:
113113
$ref: "#/components/responses/ErrorResponse"
114114
409:
115115
$ref: "#/components/responses/ErrorResponse"
116+
/dev/projects/{projectKey}/overrides:
117+
delete:
118+
summary: remove all overrides for the given project
119+
operationId: deleteOverrides
120+
parameters:
121+
- $ref: "#/components/parameters/projectKey"
122+
responses:
123+
204:
124+
description: OK. All overrides were removed
125+
404:
126+
$ref: "#/components/responses/ErrorResponse"
116127
/dev/projects/{projectKey}/overrides/{flagKey}:
117128
put:
118129
summary: override flag value with value provided in the body
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package api
2+
3+
import (
4+
"context"
5+
6+
"github.com/pkg/errors"
7+
8+
"github.com/launchdarkly/ldcli/internal/dev_server/model"
9+
)
10+
11+
func (s server) DeleteOverrides(ctx context.Context, request DeleteOverridesRequestObject) (DeleteOverridesResponseObject, error) {
12+
err := model.DeleteOverrides(ctx, request.ProjectKey)
13+
if err != nil {
14+
if errors.As(err, &model.ErrNotFound{}) {
15+
return DeleteOverrides404Response{}, nil
16+
}
17+
return nil, err
18+
}
19+
return DeleteOverrides204Response{}, nil
20+
}

internal/dev_server/api/server.gen.go

Lines changed: 94 additions & 21 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/dev_server/model/override.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,24 @@ func DeleteOverride(ctx context.Context, projectKey, flagKey string) error {
9191
return err
9292
}
9393

94+
func DeleteOverrides(ctx context.Context, projectKey string) error {
95+
96+
store := StoreFromContext(ctx)
97+
overrides, err := store.GetOverridesForProject(ctx, projectKey)
98+
if err != nil {
99+
return err
100+
}
101+
102+
for _, override := range overrides {
103+
err := DeleteOverride(ctx, projectKey, override.FlagKey)
104+
if err != nil {
105+
return err
106+
}
107+
}
108+
109+
return nil
110+
}
111+
94112
func (o Override) Apply(state FlagState) FlagState {
95113
flagVersion := state.Version + o.Version
96114
flagValue := state.Value

0 commit comments

Comments
 (0)