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 }