github.com/pivotal-cf/go-pivnet/v6@v6.0.2/file_groups.go (about)

     1  package pivnet
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"net/http"
     8  )
     9  
    10  type FileGroupsService struct {
    11  	client Client
    12  }
    13  
    14  type createFileGroupBody struct {
    15  	FileGroup createFileGroup `json:"file_group"`
    16  }
    17  
    18  type updateFileGroupBody struct {
    19  	FileGroup updateFileGroup `json:"file_group"`
    20  }
    21  
    22  type createFileGroup struct {
    23  	Name string `json:"name,omitempty"`
    24  }
    25  
    26  type updateFileGroup struct {
    27  	Name string `json:"name,omitempty"`
    28  }
    29  
    30  type CreateFileGroupConfig struct {
    31   ProductSlug        string
    32   Name               string
    33  }
    34  
    35  type FileGroup struct {
    36  	ID           int              `json:"id,omitempty" yaml:"id,omitempty"`
    37  	Name         string           `json:"name,omitempty" yaml:"name,omitempty"`
    38  	Product      FileGroupProduct `json:"product,omitempty" yaml:"product,omitempty"`
    39  	ProductFiles []ProductFile    `json:"product_files,omitempty" yaml:"product_files,omitempty"`
    40  }
    41  
    42  type FileGroupProduct struct {
    43  	ID   int    `json:"id,omitempty" yaml:"id,omitempty"`
    44  	Name string `json:"name,omitempty" yaml:"name,omitempty"`
    45  }
    46  
    47  type FileGroupsResponse struct {
    48  	FileGroups []FileGroup `json:"file_groups,omitempty"`
    49  }
    50  
    51  func (e FileGroupsService) List(productSlug string) ([]FileGroup, error) {
    52  	url := fmt.Sprintf("/products/%s/file_groups", productSlug)
    53  
    54  	var response FileGroupsResponse
    55  	resp, err := e.client.MakeRequest(
    56  		"GET",
    57  		url,
    58  		http.StatusOK,
    59  		nil,
    60  	)
    61  	if err != nil {
    62  		return nil, err
    63  	}
    64  	defer resp.Body.Close()
    65  
    66  	err = json.NewDecoder(resp.Body).Decode(&response)
    67  	if err != nil {
    68  		return nil, err
    69  	}
    70  
    71  	return response.FileGroups, nil
    72  }
    73  
    74  func (p FileGroupsService) Get(productSlug string, fileGroupID int) (FileGroup, error) {
    75  	url := fmt.Sprintf("/products/%s/file_groups/%d",
    76  		productSlug,
    77  		fileGroupID,
    78  	)
    79  
    80  	var response FileGroup
    81  	resp, err := p.client.MakeRequest(
    82  		"GET",
    83  		url,
    84  		http.StatusOK,
    85  		nil,
    86  	)
    87  	if err != nil {
    88  		return FileGroup{}, err
    89  	}
    90  	defer resp.Body.Close()
    91  
    92  	err = json.NewDecoder(resp.Body).Decode(&response)
    93  	if err != nil {
    94  		return FileGroup{}, err
    95  	}
    96  
    97  	return response, nil
    98  }
    99  
   100  func (p FileGroupsService) Create(config CreateFileGroupConfig) (FileGroup, error) {
   101  	url := fmt.Sprintf(
   102  		"/products/%s/file_groups",
   103  		config.ProductSlug,
   104  	)
   105  
   106  	createBody := createFileGroupBody{
   107  		createFileGroup{
   108  			Name: config.Name,
   109  		},
   110  	}
   111  
   112  	b, err := json.Marshal(createBody)
   113  	if err != nil {
   114  		// Untested as we cannot force an error because we are marshalling
   115  		// a known-good body
   116  		return FileGroup{}, err
   117  	}
   118  
   119  	body := bytes.NewReader(b)
   120  
   121  	var response FileGroup
   122  	resp, err := p.client.MakeRequest(
   123  		"POST",
   124  		url,
   125  		http.StatusCreated,
   126  		body,
   127  	)
   128  	if err != nil {
   129  		return FileGroup{}, err
   130  	}
   131  	defer resp.Body.Close()
   132  
   133  	err = json.NewDecoder(resp.Body).Decode(&response)
   134  	if err != nil {
   135  		return FileGroup{}, err
   136  	}
   137  
   138  	return response, nil
   139  }
   140  
   141  func (p FileGroupsService) Update(productSlug string, fileGroup FileGroup) (FileGroup, error) {
   142  	url := fmt.Sprintf(
   143  		"/products/%s/file_groups/%d",
   144  		productSlug,
   145  		fileGroup.ID,
   146  	)
   147  
   148  	updateBody := updateFileGroupBody{
   149  		updateFileGroup{
   150  			Name: fileGroup.Name,
   151  		},
   152  	}
   153  
   154  	b, err := json.Marshal(updateBody)
   155  	if err != nil {
   156  		// Untested as we cannot force an error because we are marshalling
   157  		// a known-good body
   158  		return FileGroup{}, err
   159  	}
   160  
   161  	body := bytes.NewReader(b)
   162  
   163  	var response FileGroup
   164  	resp, err := p.client.MakeRequest(
   165  		"PATCH",
   166  		url,
   167  		http.StatusOK,
   168  		body,
   169  	)
   170  	if err != nil {
   171  		return FileGroup{}, err
   172  	}
   173  	defer resp.Body.Close()
   174  
   175  	err = json.NewDecoder(resp.Body).Decode(&response)
   176  	if err != nil {
   177  		return FileGroup{}, err
   178  	}
   179  
   180  	return response, nil
   181  }
   182  
   183  func (p FileGroupsService) Delete(productSlug string, id int) (FileGroup, error) {
   184  	url := fmt.Sprintf(
   185  		"/products/%s/file_groups/%d",
   186  		productSlug,
   187  		id,
   188  	)
   189  
   190  	var response FileGroup
   191  	resp, err := p.client.MakeRequest(
   192  		"DELETE",
   193  		url,
   194  		http.StatusOK,
   195  		nil,
   196  	)
   197  	if err != nil {
   198  		return FileGroup{}, err
   199  	}
   200  	defer resp.Body.Close()
   201  
   202  	err = json.NewDecoder(resp.Body).Decode(&response)
   203  	if err != nil {
   204  		return FileGroup{}, err
   205  	}
   206  
   207  	return response, nil
   208  }
   209  
   210  func (p FileGroupsService) ListForRelease(productSlug string, releaseID int) ([]FileGroup, error) {
   211  	url := fmt.Sprintf("/products/%s/releases/%d/file_groups",
   212  		productSlug,
   213  		releaseID,
   214  	)
   215  
   216  	var response FileGroupsResponse
   217  	resp, err := p.client.MakeRequest(
   218  		"GET",
   219  		url,
   220  		http.StatusOK,
   221  		nil,
   222  	)
   223  	if err != nil {
   224  		return []FileGroup{}, err
   225  	}
   226  	defer resp.Body.Close()
   227  
   228  	err = json.NewDecoder(resp.Body).Decode(&response)
   229  	if err != nil {
   230  		return []FileGroup{}, err
   231  	}
   232  
   233  	return response.FileGroups, nil
   234  }
   235  
   236  func (r FileGroupsService) AddToRelease(
   237  	productSlug string,
   238  	releaseID int,
   239  	fileGroupID int,
   240  ) error {
   241  	url := fmt.Sprintf(
   242  		"/products/%s/releases/%d/add_file_group",
   243  		productSlug,
   244  		releaseID,
   245  	)
   246  
   247  	body := addRemoveFileGroupBody{
   248  		FileGroup: addRemoveFileGroupBodyFileGroup{
   249  			ID: fileGroupID,
   250  		},
   251  	}
   252  
   253  	b, err := json.Marshal(body)
   254  	if err != nil {
   255  		// Untested as we cannot force an error because we are marshalling
   256  		// a known-good body
   257  		return err
   258  	}
   259  
   260  	resp, err := r.client.MakeRequest(
   261  		"PATCH",
   262  		url,
   263  		http.StatusNoContent,
   264  		bytes.NewReader(b),
   265  	)
   266  	if err != nil {
   267  		return err
   268  	}
   269  	defer resp.Body.Close()
   270  
   271  	return nil
   272  }
   273  
   274  func (r FileGroupsService) RemoveFromRelease(
   275  	productSlug string,
   276  	releaseID int,
   277  	fileGroupID int,
   278  ) error {
   279  	url := fmt.Sprintf(
   280  		"/products/%s/releases/%d/remove_file_group",
   281  		productSlug,
   282  		releaseID,
   283  	)
   284  
   285  	body := addRemoveFileGroupBody{
   286  		FileGroup: addRemoveFileGroupBodyFileGroup{
   287  			ID: fileGroupID,
   288  		},
   289  	}
   290  
   291  	b, err := json.Marshal(body)
   292  	if err != nil {
   293  		// Untested as we cannot force an error because we are marshalling
   294  		// a known-good body
   295  		return err
   296  	}
   297  
   298  	resp, err := r.client.MakeRequest(
   299  		"PATCH",
   300  		url,
   301  		http.StatusNoContent,
   302  		bytes.NewReader(b),
   303  	)
   304  	if err != nil {
   305  		return err
   306  	}
   307  	defer resp.Body.Close()
   308  
   309  	return nil
   310  }
   311  
   312  type addRemoveFileGroupBody struct {
   313  	FileGroup addRemoveFileGroupBodyFileGroup `json:"file_group"`
   314  }
   315  
   316  type addRemoveFileGroupBodyFileGroup struct {
   317  	ID int `json:"id"`
   318  }