@@ -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