github.com/fastly/go-fastly@v1.18.0/fastly/dictionary.go (about)

     1  package fastly
     2  
     3  import (
     4  	"fmt"
     5  	"net/url"
     6  	"sort"
     7  	"time"
     8  )
     9  
    10  // Dictionary represents a dictionary response from the Fastly API.
    11  type Dictionary struct {
    12  	ServiceID string `mapstructure:"service_id"`
    13  	Version   int    `mapstructure:"version"`
    14  
    15  	ID        string     `mapstructure:"id"`
    16  	Name      string     `mapstructure:"name"`
    17  	WriteOnly bool       `mapstructure:"write_only"`
    18  	CreatedAt *time.Time `mapstructure:"created_at"`
    19  	UpdatedAt *time.Time `mapstructure:"updated_at"`
    20  	DeletedAt *time.Time `mapstructure:"deleted_at"`
    21  }
    22  
    23  // dictionariesByName is a sortable list of dictionaries.
    24  type dictionariesByName []*Dictionary
    25  
    26  // Len, Swap, and Less implement the sortable interface.
    27  func (s dictionariesByName) Len() int      { return len(s) }
    28  func (s dictionariesByName) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
    29  func (s dictionariesByName) Less(i, j int) bool {
    30  	return s[i].Name < s[j].Name
    31  }
    32  
    33  // ListDictionariesInput is used as input to the ListDictionaries function.
    34  type ListDictionariesInput struct {
    35  	// Service is the ID of the service (required).
    36  	Service string
    37  
    38  	// Version is the specific configuration version (required).
    39  	Version int
    40  }
    41  
    42  // ListDictionaries returns the list of dictionaries for the configuration version.
    43  func (c *Client) ListDictionaries(i *ListDictionariesInput) ([]*Dictionary, error) {
    44  	if i.Service == "" {
    45  		return nil, ErrMissingService
    46  	}
    47  
    48  	if i.Version == 0 {
    49  		return nil, ErrMissingVersion
    50  	}
    51  
    52  	path := fmt.Sprintf("/service/%s/version/%d/dictionary", i.Service, i.Version)
    53  	resp, err := c.Get(path, nil)
    54  	if err != nil {
    55  		return nil, err
    56  	}
    57  
    58  	var bs []*Dictionary
    59  	if err := decodeBodyMap(resp.Body, &bs); err != nil {
    60  		return nil, err
    61  	}
    62  	sort.Stable(dictionariesByName(bs))
    63  	return bs, nil
    64  }
    65  
    66  // CreateDictionaryInput is used as input to the CreateDictionary function.
    67  type CreateDictionaryInput struct {
    68  	// Service is the ID of the service. Version is the specific configuration
    69  	// version. Both fields are required.
    70  	Service string
    71  	Version int
    72  
    73  	Name      string       `form:"name,omitempty"`
    74  	WriteOnly *Compatibool `form:"write_only,omitempty"`
    75  }
    76  
    77  // CreateDictionary creates a new Fastly dictionary.
    78  func (c *Client) CreateDictionary(i *CreateDictionaryInput) (*Dictionary, error) {
    79  	if i.Service == "" {
    80  		return nil, ErrMissingService
    81  	}
    82  
    83  	if i.Version == 0 {
    84  		return nil, ErrMissingVersion
    85  	}
    86  
    87  	path := fmt.Sprintf("/service/%s/version/%d/dictionary", i.Service, i.Version)
    88  	resp, err := c.PostForm(path, i, nil)
    89  	if err != nil {
    90  		return nil, err
    91  	}
    92  
    93  	var b *Dictionary
    94  	if err := decodeBodyMap(resp.Body, &b); err != nil {
    95  		return nil, err
    96  	}
    97  	return b, nil
    98  }
    99  
   100  // GetDictionaryInput is used as input to the GetDictionary function.
   101  type GetDictionaryInput struct {
   102  	// Service is the ID of the service. Version is the specific configuration
   103  	// version. Both fields are required.
   104  	Service string
   105  	Version int
   106  
   107  	// Name is the name of the dictionary to fetch.
   108  	Name string
   109  }
   110  
   111  // GetDictionary gets the dictionary configuration with the given parameters.
   112  func (c *Client) GetDictionary(i *GetDictionaryInput) (*Dictionary, error) {
   113  	if i.Service == "" {
   114  		return nil, ErrMissingService
   115  	}
   116  
   117  	if i.Version == 0 {
   118  		return nil, ErrMissingVersion
   119  	}
   120  
   121  	if i.Name == "" {
   122  		return nil, ErrMissingName
   123  	}
   124  
   125  	path := fmt.Sprintf("/service/%s/version/%d/dictionary/%s", i.Service, i.Version, url.PathEscape(i.Name))
   126  	resp, err := c.Get(path, nil)
   127  	if err != nil {
   128  		return nil, err
   129  	}
   130  
   131  	var b *Dictionary
   132  	if err := decodeBodyMap(resp.Body, &b); err != nil {
   133  		return nil, err
   134  	}
   135  	return b, nil
   136  }
   137  
   138  // UpdateDictionaryInput is used as input to the UpdateDictionary function.
   139  type UpdateDictionaryInput struct {
   140  	// Service is the ID of the service. Version is the specific configuration
   141  	// version. Both fields are required.
   142  	Service string
   143  	Version int
   144  
   145  	// Name is the name of the dictionary to update.
   146  	Name string
   147  
   148  	NewName   string       `form:"name,omitempty"`
   149  	WriteOnly *Compatibool `form:"write_only,omitempty"`
   150  }
   151  
   152  // UpdateDictionary updates a specific dictionary.
   153  func (c *Client) UpdateDictionary(i *UpdateDictionaryInput) (*Dictionary, error) {
   154  	if i.Service == "" {
   155  		return nil, ErrMissingService
   156  	}
   157  
   158  	if i.Version == 0 {
   159  		return nil, ErrMissingVersion
   160  	}
   161  
   162  	if i.Name == "" {
   163  		return nil, ErrMissingName
   164  	}
   165  
   166  	path := fmt.Sprintf("/service/%s/version/%d/dictionary/%s", i.Service, i.Version, url.PathEscape(i.Name))
   167  	resp, err := c.PutForm(path, i, nil)
   168  	if err != nil {
   169  		return nil, err
   170  	}
   171  
   172  	var b *Dictionary
   173  	if err := decodeBodyMap(resp.Body, &b); err != nil {
   174  		return nil, err
   175  	}
   176  	return b, nil
   177  }
   178  
   179  // DeleteDictionaryInput is the input parameter to DeleteDictionary.
   180  type DeleteDictionaryInput struct {
   181  	// Service is the ID of the service. Version is the specific configuration
   182  	// version. Both fields are required.
   183  	Service string
   184  	Version int
   185  
   186  	// Name is the name of the dictionary to delete (required).
   187  	Name string
   188  }
   189  
   190  // DeleteDictionary deletes the given dictionary version.
   191  func (c *Client) DeleteDictionary(i *DeleteDictionaryInput) error {
   192  	if i.Service == "" {
   193  		return ErrMissingService
   194  	}
   195  
   196  	if i.Version == 0 {
   197  		return ErrMissingVersion
   198  	}
   199  
   200  	if i.Name == "" {
   201  		return ErrMissingName
   202  	}
   203  
   204  	path := fmt.Sprintf("/service/%s/version/%d/dictionary/%s", i.Service, i.Version, url.PathEscape(i.Name))
   205  	resp, err := c.Delete(path, nil)
   206  	if err != nil {
   207  		return err
   208  	}
   209  	defer resp.Body.Close()
   210  
   211  	// Unlike other endpoints, the dictionary endpoint does not return a status
   212  	// response - it just returns a 200 OK.
   213  	return nil
   214  }