Skip to content

Commit 1415e4a

Browse files
authored
feat: Add command to launchDevly to update the project environment and context (#433)
* Add command to launchDevly to update the project Add command to launchDevly to update the project * Update to read response
1 parent d3622a0 commit 1415e4a

File tree

3 files changed

+107
-6
lines changed

3 files changed

+107
-6
lines changed

cmd/dev_server/dev_server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ func NewDevServerCmd(client resources.Client, analyticsTrackerFn analytics.Track
5858
cmd.AddCommand(NewSyncProjectCmd(client))
5959
cmd.AddCommand(NewRemoveProjectCmd(client))
6060
cmd.AddCommand(NewAddProjectCmd(client))
61+
cmd.AddCommand(NewUpdateProjectCmd(client))
6162

6263
cmd.AddGroup(&cobra.Group{ID: "overrides", Title: "Override commands:"})
6364
cmd.AddCommand(NewAddOverrideCmd(client))

cmd/dev_server/flags.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package dev_server
2+
3+
const (
4+
ContextFlag = "context"
5+
SourceEnvironmentFlag = "source"
6+
)

cmd/dev_server/projects.go

Lines changed: 100 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -184,13 +184,13 @@ func NewAddProjectCmd(client resources.Client) *cobra.Command {
184184
_ = cmd.Flags().SetAnnotation(cliflags.ProjectFlag, "required", []string{"true"})
185185
_ = viper.BindPFlag(cliflags.ProjectFlag, cmd.Flags().Lookup(cliflags.ProjectFlag))
186186

187-
cmd.Flags().String("source", "", "environment to copy flag values from")
188-
_ = cmd.MarkFlagRequired("source")
189-
_ = cmd.Flags().SetAnnotation("source", "required", []string{"true"})
190-
_ = viper.BindPFlag("source", cmd.Flags().Lookup("source"))
187+
cmd.Flags().String(SourceEnvironmentFlag, "", "environment to copy flag values from")
188+
_ = cmd.MarkFlagRequired(SourceEnvironmentFlag)
189+
_ = cmd.Flags().SetAnnotation(SourceEnvironmentFlag, "required", []string{"true"})
190+
_ = viper.BindPFlag(SourceEnvironmentFlag, cmd.Flags().Lookup(SourceEnvironmentFlag))
191191

192-
cmd.Flags().String("context", "", `Stringified JSON representation of your context object ex. {"user": { "email": "youremail@gmail.com", "username": "foo", "key": "bar"}}`)
193-
_ = viper.BindPFlag("context", cmd.Flags().Lookup("context"))
192+
cmd.Flags().String(ContextFlag, "", `Stringified JSON representation of your context object ex. {"user": { "email": "youremail@gmail.com", "username": "foo", "key": "bar"}}`)
193+
_ = viper.BindPFlag(ContextFlag, cmd.Flags().Lookup(ContextFlag))
194194

195195
return cmd
196196
}
@@ -227,3 +227,97 @@ func addProject(client resources.Client) func(*cobra.Command, []string) error {
227227
return nil
228228
}
229229
}
230+
231+
func NewUpdateProjectCmd(client resources.Client) *cobra.Command {
232+
cmd := &cobra.Command{
233+
GroupID: "projects",
234+
Args: validators.Validate(),
235+
Long: "update the specified project and its flag configuration with the LaunchDarkly Service",
236+
RunE: updateProject(client),
237+
Short: "update project",
238+
Use: "update-project",
239+
}
240+
241+
cmd.SetUsageTemplate(resourcescmd.SubcommandUsageTemplate())
242+
243+
cmd.Flags().String(cliflags.ProjectFlag, "", "The project key")
244+
_ = cmd.MarkFlagRequired(cliflags.ProjectFlag)
245+
_ = cmd.Flags().SetAnnotation(cliflags.ProjectFlag, "required", []string{"true"})
246+
_ = viper.BindPFlag(cliflags.ProjectFlag, cmd.Flags().Lookup(cliflags.ProjectFlag))
247+
248+
cmd.Flags().String(SourceEnvironmentFlag, "", "environment to copy flag values from")
249+
_ = viper.BindPFlag(SourceEnvironmentFlag, cmd.Flags().Lookup(SourceEnvironmentFlag))
250+
251+
cmd.Flags().String(ContextFlag, "", `Stringified JSON representation of your context object ex. {"user": { "email": "test@gmail.com", "username": "foo", "key": "bar"}}`)
252+
_ = viper.BindPFlag(ContextFlag, cmd.Flags().Lookup(ContextFlag))
253+
254+
return cmd
255+
}
256+
257+
type patchBody struct {
258+
SourceEnvironmentKey string `json:"sourceEnvironmentKey,omitempty"`
259+
Context map[string]interface{} `json:"context,omitempty"`
260+
}
261+
262+
type patchResponse struct {
263+
SourceEnvironmentKey string `json:"sourceEnvironmentKey"`
264+
Context map[string]interface{} `json:"context"`
265+
}
266+
267+
func updateProject(client resources.Client) func(*cobra.Command, []string) error {
268+
return func(cmd *cobra.Command, args []string) error {
269+
body := patchBody{}
270+
if viper.IsSet(ContextFlag) {
271+
contextString := viper.GetString(ContextFlag)
272+
err := json.Unmarshal([]byte(contextString), &body.Context)
273+
if err != nil {
274+
return err
275+
}
276+
}
277+
278+
if viper.IsSet(SourceEnvironmentFlag) {
279+
body.SourceEnvironmentKey = viper.GetString(SourceEnvironmentFlag)
280+
}
281+
282+
jsonData, err := json.Marshal(body)
283+
if err != nil {
284+
return err
285+
}
286+
287+
path := getDevServerUrl() + "/dev/projects/" + viper.GetString(cliflags.ProjectFlag)
288+
res, err := client.MakeUnauthenticatedRequest(
289+
"PATCH",
290+
path,
291+
jsonData,
292+
)
293+
if err != nil {
294+
return output.NewCmdOutputError(err, viper.GetString(cliflags.OutputFlag))
295+
}
296+
297+
var response patchResponse
298+
err = json.Unmarshal(res, &response)
299+
if err != nil {
300+
return err
301+
}
302+
303+
switch true {
304+
case !viper.IsSet(ContextFlag) && !viper.IsSet(SourceEnvironmentFlag):
305+
fmt.Fprint(cmd.OutOrStdout(), "No input given, project synced successfully\n")
306+
case viper.IsSet(SourceEnvironmentFlag):
307+
fmt.Fprintf(cmd.OutOrStdout(), "Source environment updated successfully to '%s'\n", response.SourceEnvironmentKey)
308+
fallthrough
309+
case viper.IsSet(ContextFlag):
310+
// pretty print context
311+
context, err := json.MarshalIndent(response.Context, "", " ")
312+
if err != nil {
313+
return err
314+
}
315+
316+
fmt.Fprintf(cmd.OutOrStdout(), "Context updated successfully to:\n%s\n", string(context))
317+
default:
318+
fmt.Fprint(cmd.OutOrStdout(), "Project updated successfully\n")
319+
}
320+
321+
return nil
322+
}
323+
}

0 commit comments

Comments
 (0)