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 }