github.com/cobalt77/jfrog-client-go@v0.14.5/bintray/services/versions/versions.go (about) 1 package versions 2 3 import ( 4 "encoding/json" 5 "errors" 6 "github.com/cobalt77/jfrog-client-go/bintray/auth" 7 "github.com/cobalt77/jfrog-client-go/httpclient" 8 clientutils "github.com/cobalt77/jfrog-client-go/utils" 9 "github.com/cobalt77/jfrog-client-go/utils/errorutils" 10 "github.com/cobalt77/jfrog-client-go/utils/log" 11 "net/http" 12 "path" 13 ) 14 15 func NewService(client *httpclient.HttpClient) *VersionService { 16 us := &VersionService{client: client} 17 return us 18 } 19 20 func NewVersionParams() *Params { 21 return &Params{Path: &Path{}} 22 } 23 24 type VersionService struct { 25 client *httpclient.HttpClient 26 BintrayDetails auth.BintrayDetails 27 } 28 29 type Path struct { 30 Subject string 31 Repo string 32 Package string 33 Version string 34 } 35 36 type Params struct { 37 *Path 38 Desc string 39 VcsTag string 40 Released string 41 GithubReleaseNotesFile string 42 GithubUseTagReleaseNotes bool 43 } 44 45 func (vs *VersionService) Create(params *Params) error { 46 log.Info("Creating version...") 47 resp, body, err := vs.doCreateVersion(params) 48 if err != nil { 49 return err 50 } 51 if resp.StatusCode != http.StatusCreated { 52 return errorutils.CheckError(errors.New("Bintray response: " + resp.Status + "\n" + clientutils.IndentJson(body))) 53 } 54 log.Debug("Bintray response:", resp.Status) 55 log.Output(clientutils.IndentJson(body)) 56 return nil 57 } 58 59 func (vs *VersionService) Update(params *Params) error { 60 if vs.BintrayDetails.GetUser() == "" { 61 vs.BintrayDetails.SetUser(params.Subject) 62 } 63 64 content, err := createVersionContent(params) 65 if err != nil { 66 return err 67 } 68 69 url := vs.BintrayDetails.GetApiUrl() + path.Join("packages/", params.Subject, params.Repo, params.Package, "versions", params.Version) 70 71 log.Info("Updating version...") 72 httpClientsDetails := vs.BintrayDetails.CreateHttpClientDetails() 73 client, err := httpclient.ClientBuilder().Build() 74 if err != nil { 75 return err 76 } 77 resp, body, err := client.SendPatch(url, content, httpClientsDetails) 78 if err != nil { 79 return err 80 } 81 82 if resp.StatusCode != http.StatusOK { 83 return errorutils.CheckError(errors.New("Bintray response: " + resp.Status + "\n" + clientutils.IndentJson(body))) 84 } 85 86 log.Debug("Bintray response:", resp.Status) 87 log.Info("Updated version", params.Version+".") 88 return nil 89 } 90 91 func (vs *VersionService) Publish(versionPath *Path) error { 92 if vs.BintrayDetails.GetUser() == "" { 93 vs.BintrayDetails.SetUser(versionPath.Subject) 94 } 95 url := vs.BintrayDetails.GetApiUrl() + path.Join("content", versionPath.Subject, versionPath.Repo, versionPath.Package, versionPath.Version, "publish") 96 97 log.Info("Publishing version...") 98 httpClientsDetails := vs.BintrayDetails.CreateHttpClientDetails() 99 client, err := httpclient.ClientBuilder().Build() 100 if err != nil { 101 return err 102 } 103 resp, body, err := client.SendPost(url, nil, httpClientsDetails) 104 if err != nil { 105 return err 106 } 107 if resp.StatusCode != http.StatusOK { 108 return errorutils.CheckError(errors.New("Bintray response: " + resp.Status + "\n" + clientutils.IndentJson(body))) 109 } 110 111 log.Debug("Bintray response:", resp.Status) 112 log.Output(clientutils.IndentJson(body)) 113 return nil 114 } 115 116 func (vs *VersionService) Delete(versionPath *Path) error { 117 if vs.BintrayDetails.GetUser() == "" { 118 vs.BintrayDetails.SetUser(versionPath.Subject) 119 } 120 url := vs.BintrayDetails.GetApiUrl() + path.Join("packages", versionPath.Subject, versionPath.Repo, versionPath.Package, "versions", versionPath.Version) 121 122 log.Info("Deleting version...") 123 httpClientsDetails := vs.BintrayDetails.CreateHttpClientDetails() 124 client, err := httpclient.ClientBuilder().Build() 125 if err != nil { 126 return err 127 } 128 resp, body, err := client.SendDelete(url, nil, httpClientsDetails) 129 if err != nil { 130 return err 131 } 132 if resp.StatusCode != http.StatusOK { 133 return errorutils.CheckError(errors.New("Bintray response: " + resp.Status + "\n" + clientutils.IndentJson(body))) 134 } 135 136 log.Debug("Bintray response:", resp.Status) 137 log.Info("Deleted version", versionPath.Version+".") 138 return nil 139 } 140 141 func (vs *VersionService) Show(versionPath *Path) error { 142 if vs.BintrayDetails.GetUser() == "" { 143 vs.BintrayDetails.SetUser(versionPath.Subject) 144 } 145 if versionPath.Version == "" { 146 versionPath.Version = "_latest" 147 } 148 149 url := vs.BintrayDetails.GetApiUrl() + path.Join("packages", versionPath.Subject, versionPath.Repo, versionPath.Package, "versions", versionPath.Version) 150 151 log.Info("Getting version details...") 152 httpClientsDetails := vs.BintrayDetails.CreateHttpClientDetails() 153 client, err := httpclient.ClientBuilder().Build() 154 if err != nil { 155 return err 156 } 157 resp, body, _, _ := client.SendGet(url, true, httpClientsDetails) 158 159 if resp.StatusCode != http.StatusOK { 160 return errorutils.CheckError(errors.New("Bintray response: " + resp.Status + "\n" + clientutils.IndentJson(body))) 161 } 162 163 log.Debug("Bintray response:", resp.Status) 164 log.Output(clientutils.IndentJson(body)) 165 return nil 166 } 167 168 func (vs *VersionService) IsVersionExists(versionPath *Path) (bool, error) { 169 url := vs.BintrayDetails.GetApiUrl() + path.Join("packages", versionPath.Subject, versionPath.Repo, versionPath.Package, "versions", versionPath.Version) 170 httpClientsDetails := vs.BintrayDetails.CreateHttpClientDetails() 171 172 client, err := httpclient.ClientBuilder().Build() 173 if err != nil { 174 return false, err 175 } 176 resp, _, err := client.SendHead(url, httpClientsDetails) 177 if err != nil { 178 return false, err 179 } 180 if resp.StatusCode == http.StatusOK { 181 return true, nil 182 } 183 if resp.StatusCode == http.StatusNotFound { 184 return false, nil 185 } 186 187 return false, errorutils.CheckError(errors.New("Bintray response: " + resp.Status)) 188 } 189 190 func (vs *VersionService) doCreateVersion(params *Params) (*http.Response, []byte, error) { 191 if vs.BintrayDetails.GetUser() == "" { 192 vs.BintrayDetails.SetUser(params.Subject) 193 } 194 195 content, err := createVersionContent(params) 196 if err != nil { 197 return nil, []byte{}, err 198 } 199 url := vs.BintrayDetails.GetApiUrl() + path.Join("packages", params.Subject, params.Repo, params.Package, "versions") 200 httpClientsDetails := vs.BintrayDetails.CreateHttpClientDetails() 201 client, err := httpclient.ClientBuilder().Build() 202 if err != nil { 203 return nil, []byte{}, err 204 } 205 return client.SendPost(url, content, httpClientsDetails) 206 } 207 208 func createVersionContent(params *Params) ([]byte, error) { 209 Config := contentConfig{ 210 Name: params.Version, 211 Desc: params.Desc, 212 VcsTag: params.VcsTag, 213 Released: params.Released, 214 GithubReleaseNotesFile: params.GithubReleaseNotesFile, 215 GithubUseTagReleaseNotes: params.GithubUseTagReleaseNotes, 216 } 217 requestContent, err := json.Marshal(Config) 218 if err != nil { 219 return nil, errorutils.CheckError(errors.New("Failed to execute request.")) 220 } 221 return requestContent, nil 222 } 223 224 type contentConfig struct { 225 Name string `json:"name,omitempty"` 226 Desc string `json:"desc,omitempty"` 227 VcsTag string `json:"vcs_tag,omitempty"` 228 Released string `json:"released,omitempty"` 229 GithubReleaseNotesFile string `json:"github_release_notes_file,omitempty"` 230 GithubUseTagReleaseNotes bool `json:"github_use_tag_release_notes,omitempty"` 231 }