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

     1  package pivnet
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"net/http"
     8  	"time"
     9  
    10  	"github.com/pivotal-cf/go-pivnet/v6/logger"
    11  )
    12  
    13  type ReleasesService struct {
    14  	client Client
    15  	l      logger.Logger
    16  }
    17  
    18  type createReleaseBody struct {
    19  	Release      Release `json:"release"`
    20  	CopyMetadata bool    `json:"copy_metadata"`
    21  }
    22  
    23  type ReleasesResponse struct {
    24  	Releases []Release `json:"releases,omitempty"`
    25  }
    26  
    27  type CreateReleaseResponse struct {
    28  	Release Release `json:"release,omitempty"`
    29  }
    30  
    31  type Release struct {
    32  	ID                     int         `json:"id,omitempty" yaml:"id,omitempty"`
    33  	Availability           string      `json:"availability,omitempty" yaml:"availability,omitempty"`
    34  	EULA                   *EULA       `json:"eula,omitempty" yaml:"eula,omitempty"`
    35  	OSSCompliant           string      `json:"oss_compliant,omitempty" yaml:"oss_compliant,omitempty"`
    36  	ReleaseDate            string      `json:"release_date,omitempty" yaml:"release_date,omitempty"`
    37  	ReleaseType            ReleaseType `json:"release_type,omitempty" yaml:"release_type,omitempty"`
    38  	Version                string      `json:"version,omitempty" yaml:"version,omitempty"`
    39  	Links                  *Links      `json:"_links,omitempty" yaml:"_links,omitempty"`
    40  	Description            string      `json:"description,omitempty" yaml:"description,omitempty"`
    41  	ReleaseNotesURL        string      `json:"release_notes_url,omitempty" yaml:"release_notes_url,omitempty"`
    42  	Controlled             bool        `json:"controlled,omitempty" yaml:"controlled,omitempty"`
    43  	ECCN                   string      `json:"eccn,omitempty" yaml:"eccn,omitempty"`
    44  	LicenseException       string      `json:"license_exception,omitempty" yaml:"license_exception,omitempty"`
    45  	EndOfSupportDate       string      `json:"end_of_support_date,omitempty" yaml:"end_of_support_date,omitempty"`
    46  	EndOfGuidanceDate      string      `json:"end_of_guidance_date,omitempty" yaml:"end_of_guidance_date,omitempty"`
    47  	EndOfAvailabilityDate  string      `json:"end_of_availability_date,omitempty" yaml:"end_of_availability_date,omitempty"`
    48  	UpdatedAt              string      `json:"updated_at,omitempty" yaml:"updated_at,omitempty"`
    49  	SoftwareFilesUpdatedAt string      `json:"software_files_updated_at,omitempty" yaml:"software_files_updated_at,omitempty"`
    50  	UserGroupsUpdatedAt    string      `json:"user_groups_updated_at,omitempty" yaml:"user_groups_updated_at,omitempty"`
    51  }
    52  
    53  type CreateReleaseConfig struct {
    54  	ProductSlug           string
    55  	Version               string
    56  	ReleaseType           string
    57  	ReleaseDate           string
    58  	EULASlug              string
    59  	Description           string
    60  	ReleaseNotesURL       string
    61  	Controlled            bool
    62  	ECCN                  string
    63  	LicenseException      string
    64  	EndOfSupportDate      string
    65  	EndOfGuidanceDate     string
    66  	EndOfAvailabilityDate string
    67  	CopyMetadata          bool
    68  }
    69  
    70  func (r ReleasesService) List(productSlug string, params ...QueryParameter) ([]Release, error) {
    71  	url := fmt.Sprintf("/products/%s/releases", productSlug)
    72  
    73  	var response ReleasesResponse
    74  	resp, err := r.client.MakeRequestWithParams("GET", url, http.StatusOK, params, nil)
    75  	if err != nil {
    76  		return nil, err
    77  	}
    78  	defer resp.Body.Close()
    79  
    80  	err = json.NewDecoder(resp.Body).Decode(&response)
    81  	if err != nil {
    82  		return nil, err
    83  	}
    84  
    85  	return response.Releases, nil
    86  }
    87  
    88  func (r ReleasesService) Get(productSlug string, releaseID int) (Release, error) {
    89  	url := fmt.Sprintf("/products/%s/releases/%d", productSlug, releaseID)
    90  
    91  	var response Release
    92  	resp, err := r.client.MakeRequest("GET", url, http.StatusOK, nil)
    93  	if err != nil {
    94  		return Release{}, err
    95  	}
    96  	defer resp.Body.Close()
    97  
    98  	err = json.NewDecoder(resp.Body).Decode(&response)
    99  	if err != nil {
   100  		return Release{}, err
   101  	}
   102  
   103  	return response, nil
   104  }
   105  
   106  func (r ReleasesService) Create(config CreateReleaseConfig) (Release, error) {
   107  	url := fmt.Sprintf("/products/%s/releases", config.ProductSlug)
   108  
   109  	body := createReleaseBody{
   110  		Release: Release{
   111  			Availability: "Admins Only",
   112  			EULA: &EULA{
   113  				Slug: config.EULASlug,
   114  			},
   115  			OSSCompliant:          "confirm",
   116  			ReleaseDate:           config.ReleaseDate,
   117  			ReleaseType:           ReleaseType(config.ReleaseType),
   118  			Version:               config.Version,
   119  			Description:           config.Description,
   120  			ReleaseNotesURL:       config.ReleaseNotesURL,
   121  			Controlled:            config.Controlled,
   122  			ECCN:                  config.ECCN,
   123  			LicenseException:      config.LicenseException,
   124  			EndOfSupportDate:      config.EndOfSupportDate,
   125  			EndOfGuidanceDate:     config.EndOfGuidanceDate,
   126  			EndOfAvailabilityDate: config.EndOfAvailabilityDate,
   127  		},
   128  		CopyMetadata: config.CopyMetadata,
   129  	}
   130  
   131  	if config.ReleaseDate == "" {
   132  		body.Release.ReleaseDate = time.Now().Format("2006-01-02")
   133  		r.l.Info(
   134  			"No release date found - using default release date",
   135  			logger.Data{"release date": body.Release.ReleaseDate})
   136  	}
   137  
   138  	b, err := json.Marshal(body)
   139  	if err != nil {
   140  		// Untested as we cannot force an error because we are marshalling
   141  		// a known-good body
   142  		return Release{}, err
   143  	}
   144  
   145  	var response CreateReleaseResponse
   146  	resp, err := r.client.MakeRequest(
   147  		"POST",
   148  		url,
   149  		http.StatusCreated,
   150  		bytes.NewReader(b),
   151  	)
   152  	if err != nil {
   153  		return Release{}, err
   154  	}
   155  	defer resp.Body.Close()
   156  
   157  	err = json.NewDecoder(resp.Body).Decode(&response)
   158  	if err != nil {
   159  		return Release{}, err
   160  	}
   161  
   162  	return response.Release, nil
   163  }
   164  
   165  func (r ReleasesService) Update(productSlug string, release Release) (Release, error) {
   166  	url := fmt.Sprintf(
   167  		"/products/%s/releases/%d",
   168  		productSlug,
   169  		release.ID,
   170  	)
   171  
   172  	release.OSSCompliant = "confirm"
   173  
   174  	var updatedRelease = createReleaseBody{
   175  		Release: release,
   176  	}
   177  
   178  	body, err := json.Marshal(updatedRelease)
   179  	if err != nil {
   180  		// Untested as we cannot force an error because we are marshalling
   181  		// a known-good body
   182  		return Release{}, err
   183  	}
   184  
   185  	var response CreateReleaseResponse
   186  	resp, err := r.client.MakeRequest(
   187  		"PATCH",
   188  		url,
   189  		http.StatusOK,
   190  		bytes.NewReader(body),
   191  	)
   192  	if err != nil {
   193  		return Release{}, err
   194  	}
   195  	defer resp.Body.Close()
   196  
   197  	err = json.NewDecoder(resp.Body).Decode(&response)
   198  	if err != nil {
   199  		return Release{}, err
   200  	}
   201  
   202  	return response.Release, nil
   203  }
   204  
   205  func (r ReleasesService) Delete(productSlug string, release Release) error {
   206  	url := fmt.Sprintf(
   207  		"/products/%s/releases/%d",
   208  		productSlug,
   209  		release.ID,
   210  	)
   211  
   212  	resp, err := r.client.MakeRequest(
   213  		"DELETE",
   214  		url,
   215  		http.StatusNoContent,
   216  		nil,
   217  	)
   218  	if err != nil {
   219  		return err
   220  	}
   221  	defer resp.Body.Close()
   222  
   223  	return nil
   224  }