github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/domain/update.go (about)

     1  package domain
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  
     7  	"github.com/fastly/go-fastly/v9/fastly"
     8  
     9  	"github.com/fastly/cli/pkg/argparser"
    10  	"github.com/fastly/cli/pkg/errors"
    11  	"github.com/fastly/cli/pkg/global"
    12  	"github.com/fastly/cli/pkg/text"
    13  )
    14  
    15  // UpdateCommand calls the Fastly API to update domains.
    16  type UpdateCommand struct {
    17  	argparser.Base
    18  	input          fastly.UpdateDomainInput
    19  	serviceName    argparser.OptionalServiceNameID
    20  	serviceVersion argparser.OptionalServiceVersion
    21  	autoClone      argparser.OptionalAutoClone
    22  
    23  	NewName argparser.OptionalString
    24  	Comment argparser.OptionalString
    25  }
    26  
    27  // NewUpdateCommand returns a usable command registered under the parent.
    28  func NewUpdateCommand(parent argparser.Registerer, g *global.Data) *UpdateCommand {
    29  	c := UpdateCommand{
    30  		Base: argparser.Base{
    31  			Globals: g,
    32  		},
    33  	}
    34  	c.CmdClause = parent.Command("update", "Update a domain on a Fastly service version")
    35  
    36  	// Required.
    37  	c.CmdClause.Flag("name", "Domain name").Short('n').Required().StringVar(&c.input.Name)
    38  	c.RegisterFlag(argparser.StringFlagOpts{
    39  		Name:        argparser.FlagVersionName,
    40  		Description: argparser.FlagVersionDesc,
    41  		Dst:         &c.serviceVersion.Value,
    42  		Required:    true,
    43  	})
    44  
    45  	// Optional.
    46  	c.RegisterAutoCloneFlag(argparser.AutoCloneFlagOpts{
    47  		Action: c.autoClone.Set,
    48  		Dst:    &c.autoClone.Value,
    49  	})
    50  	c.CmdClause.Flag("comment", "A descriptive note").Action(c.Comment.Set).StringVar(&c.Comment.Value)
    51  	c.CmdClause.Flag("new-name", "New domain name").Action(c.NewName.Set).StringVar(&c.NewName.Value)
    52  	c.RegisterFlag(argparser.StringFlagOpts{
    53  		Name:        argparser.FlagServiceIDName,
    54  		Description: argparser.FlagServiceIDDesc,
    55  		Dst:         &g.Manifest.Flag.ServiceID,
    56  		Short:       's',
    57  	})
    58  	c.RegisterFlag(argparser.StringFlagOpts{
    59  		Action:      c.serviceName.Set,
    60  		Name:        argparser.FlagServiceName,
    61  		Description: argparser.FlagServiceDesc,
    62  		Dst:         &c.serviceName.Value,
    63  	})
    64  	return &c
    65  }
    66  
    67  // Exec invokes the application logic for the command.
    68  func (c *UpdateCommand) Exec(_ io.Reader, out io.Writer) error {
    69  	serviceID, serviceVersion, err := argparser.ServiceDetails(argparser.ServiceDetailsOpts{
    70  		AutoCloneFlag:      c.autoClone,
    71  		APIClient:          c.Globals.APIClient,
    72  		Manifest:           *c.Globals.Manifest,
    73  		Out:                out,
    74  		ServiceNameFlag:    c.serviceName,
    75  		ServiceVersionFlag: c.serviceVersion,
    76  		VerboseMode:        c.Globals.Flags.Verbose,
    77  	})
    78  	if err != nil {
    79  		c.Globals.ErrLog.AddWithContext(err, map[string]any{
    80  			"Service ID":      serviceID,
    81  			"Service Version": errors.ServiceVersion(serviceVersion),
    82  		})
    83  		return err
    84  	}
    85  
    86  	c.input.ServiceID = serviceID
    87  	c.input.ServiceVersion = fastly.ToValue(serviceVersion.Number)
    88  
    89  	// If neither arguments are provided, error with useful message.
    90  	if !c.NewName.WasSet && !c.Comment.WasSet {
    91  		return fmt.Errorf("error parsing arguments: must provide either --new-name or --comment to update domain")
    92  	}
    93  
    94  	if c.NewName.WasSet {
    95  		c.input.NewName = &c.NewName.Value
    96  	}
    97  	if c.Comment.WasSet {
    98  		c.input.Comment = &c.Comment.Value
    99  	}
   100  
   101  	d, err := c.Globals.APIClient.UpdateDomain(&c.input)
   102  	if err != nil {
   103  		c.Globals.ErrLog.AddWithContext(err, map[string]any{
   104  			"Service ID":      serviceID,
   105  			"Service Version": fastly.ToValue(serviceVersion.Number),
   106  			"New Name":        c.NewName.Value,
   107  			"Comment":         c.Comment.Value,
   108  		})
   109  		return err
   110  	}
   111  
   112  	text.Success(out, "Updated domain %s (service %s version %d)", fastly.ToValue(d.Name), fastly.ToValue(d.ServiceID), fastly.ToValue(d.ServiceVersion))
   113  	return nil
   114  }