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

     1  package pivnet
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"net/http"
     8  )
     9  
    10  type ReleaseDependenciesService struct {
    11  	client Client
    12  }
    13  
    14  type ReleaseDependenciesResponse struct {
    15  	ReleaseDependencies []ReleaseDependency `json:"dependencies,omitempty"`
    16  }
    17  
    18  type ReleaseDependency struct {
    19  	Release DependentRelease `json:"release,omitempty" yaml:"release,omitempty"`
    20  }
    21  
    22  type DependentRelease struct {
    23  	ID      int     `json:"id,omitempty" yaml:"id,omitempty"`
    24  	Version string  `json:"version,omitempty" yaml:"version,omitempty"`
    25  	Product Product `json:"product,omitempty" yaml:"product,omitempty"`
    26  }
    27  
    28  func (r ReleaseDependenciesService) List(productSlug string, releaseID int) ([]ReleaseDependency, error) {
    29  	url := fmt.Sprintf(
    30  		"/products/%s/releases/%d/dependencies",
    31  		productSlug,
    32  		releaseID,
    33  	)
    34  
    35  	var response ReleaseDependenciesResponse
    36  	resp, err := r.client.MakeRequest(
    37  		"GET",
    38  		url,
    39  		http.StatusOK,
    40  		nil,
    41  	)
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  	defer resp.Body.Close()
    46  
    47  	err = json.NewDecoder(resp.Body).Decode(&response)
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  
    52  	return response.ReleaseDependencies, nil
    53  }
    54  
    55  func (r ReleaseDependenciesService) Add(
    56  	productSlug string,
    57  	releaseID int,
    58  	dependentReleaseID int,
    59  ) error {
    60  	url := fmt.Sprintf(
    61  		"/products/%s/releases/%d/add_dependency",
    62  		productSlug,
    63  		releaseID,
    64  	)
    65  
    66  	body := addRemoveDependencyBody{
    67  		Dependency: addRemoveDependencyBodyDependency{
    68  			ReleaseID: dependentReleaseID,
    69  		},
    70  	}
    71  
    72  	b, err := json.Marshal(body)
    73  	if err != nil {
    74  		// Untested as we cannot force an error because we are marshalling
    75  		// a known-good body
    76  		return err
    77  	}
    78  
    79  	resp, err := r.client.MakeRequest(
    80  		"PATCH",
    81  		url,
    82  		http.StatusNoContent,
    83  		bytes.NewReader(b),
    84  	)
    85  	if err != nil {
    86  		return err
    87  	}
    88  	defer resp.Body.Close()
    89  
    90  	return nil
    91  }
    92  
    93  func (r ReleaseDependenciesService) Remove(
    94  	productSlug string,
    95  	releaseID int,
    96  	dependentReleaseID int,
    97  ) error {
    98  	url := fmt.Sprintf(
    99  		"/products/%s/releases/%d/remove_dependency",
   100  		productSlug,
   101  		releaseID,
   102  	)
   103  
   104  	body := addRemoveDependencyBody{
   105  		Dependency: addRemoveDependencyBodyDependency{
   106  			ReleaseID: dependentReleaseID,
   107  		},
   108  	}
   109  
   110  	b, err := json.Marshal(body)
   111  	if err != nil {
   112  		// Untested as we cannot force an error because we are marshalling
   113  		// a known-good body
   114  		return err
   115  	}
   116  
   117  	resp, err := r.client.MakeRequest(
   118  		"PATCH",
   119  		url,
   120  		http.StatusNoContent,
   121  		bytes.NewReader(b),
   122  	)
   123  	if err != nil {
   124  		return err
   125  	}
   126  	defer resp.Body.Close()
   127  
   128  	return nil
   129  }
   130  
   131  type addRemoveDependencyBody struct {
   132  	Dependency addRemoveDependencyBodyDependency `json:"dependency"`
   133  }
   134  
   135  type addRemoveDependencyBodyDependency struct {
   136  	ReleaseID int `json:"release_id"`
   137  }