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  }