Files
request/gitea/releases.go
Matheus Sampaio Queiroga d3cc90b876
All checks were successful
Golang test / go-test (push) Successful in 2m4s
Update gitea asset upload to use octect-stream
Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
2025-11-06 18:00:50 -03:00

193 lines
6.6 KiB
Go

package gitea
import (
"fmt"
"io"
"iter"
"net/http"
"net/url"
"strconv"
gitea_api "sirherobrine23.com.br/go-bds/request/gitea/structs"
"sirherobrine23.com.br/go-bds/request/internal/gitpaginator"
"sirherobrine23.com.br/go-bds/request/v3"
)
// Get release by tag name
func (client Gitea) ReleaseTag(tagName string) (*gitea_api.Release, error) {
reqOptions := &request.Options{Method: "GET", Header: http.Header{}, Codes: processCodes}
client.authHeader(&reqOptions.Header)
res, _, err := request.JSON[*gitea_api.Release](client.pathJoin("v1/repos", client.repoPath(), "releases/tags", url.PathEscape(tagName)), reqOptions)
return res, err
}
// Get release by ID
func (client Gitea) Release(id int) (*gitea_api.Release, error) {
reqOptions := &request.Options{Method: "GET", Header: http.Header{}, Codes: processCodes}
client.authHeader(&reqOptions.Header)
res, _, err := request.JSON[*gitea_api.Release](client.pathJoin("v1/repos", client.repoPath(), "releases", strconv.Itoa(id)), reqOptions)
return res, err
}
// Create release if not exists else return current release based in tag name
func (client Gitea) CreateRelease(opt *gitea_api.CreateReleaseOption) (*gitea_api.Release, error) {
reqOptions := &request.Options{
Method: "POST",
Header: http.Header{
"Content-Type": {"application/json"},
},
Body: opt,
Codes: processCodes.Extends(request.CodeProcess{
400: func(req *request.RequestStatus) (res *http.Response, err error) {
req.Options.Method = "GET"
delete(req.Options.Header, "Content-Type")
delete(req.Options.Codes, 400) // ignore loop
return request.Request(client.pathJoin("v1/repos", client.repoPath(), "releases/tags", url.PathEscape(opt.TagName)), req.Options)
},
}),
}
client.authHeader(&reqOptions.Header)
res, _, err := request.JSON[*gitea_api.Release](client.pathJoin("v1/repos", client.repoPath(), "releases"), reqOptions)
return res, err
}
// DeleteRelease deletes a release from the repository identified by the given release ID.
func (client Gitea) DeleteRelease(id int64) error {
reqOptions := &request.Options{Method: "DELETE", Codes: processCodes}
client.authHeader(&reqOptions.Header)
res, err := request.Request(client.pathJoin("v1/repos", client.repoPath(), "releases", strconv.FormatInt(id, 10)), reqOptions)
if res != nil {
defer res.Body.Close()
}
return err
}
func (client Gitea) DeleteReleaseByTag(tagName string) error {
reqOptions := &request.Options{Method: "DELETE", Codes: processCodes}
client.authHeader(&reqOptions.Header)
res, err := request.Request(client.pathJoin("v1/repos", client.repoPath(), "releases/rags", url.PathEscape(tagName)), reqOptions)
if res != nil {
defer res.Body.Close()
}
return err
}
// List all release from gitea APIs
func (client Gitea) ReleasesSeq() iter.Seq2[*gitea_api.Release, error] {
releases, res, err := []*gitea_api.Release{}, (*http.Response)(nil), error(nil)
reqOptions := &request.Options{Method: "GET", Header: http.Header{}, Codes: processCodes}
client.authHeader(&reqOptions.Header)
return func(yield func(*gitea_api.Release, error) bool) {
requestUrl := client.pathJoin(client.repoPath(), "releases")
requestUrl.RawQuery = "limit=100"
if client.Settings != nil && client.Settings.MaxResponseItems > 0 {
requestUrl.RawQuery = fmt.Sprintf("limit=%d", client.Settings.MaxResponseItems)
}
for requestUrl != nil {
if len(releases) == 0 {
if releases, res, err = request.JSON[[]*gitea_api.Release](requestUrl, reqOptions); res != nil {
requestUrl, err = url.Parse(gitpaginator.ParsePaginator(res.Header).NextPageToken)
} else {
requestUrl = nil
}
}
if err != nil {
yield(nil, err)
return
}
for len(releases) > 0 {
if !yield(releases[0], nil) {
return
}
releases = releases[1:]
}
}
}
}
// List all release Assets in [iter.Seq2]
func (client Gitea) AssetsSeq(releaseID int) iter.Seq2[*gitea_api.Attachment, error] {
asserts, res, err := []*gitea_api.Attachment{}, (*http.Response)(nil), error(nil)
reqOptions := &request.Options{Method: "GET", Header: http.Header{}, Codes: processCodes}
client.authHeader(&reqOptions.Header)
return func(yield func(*gitea_api.Attachment, error) bool) {
requestUrl := client.pathJoin("v1/repos", client.repoPath(), "releases", strconv.Itoa(releaseID), "assets")
for requestUrl != nil {
if len(asserts) == 0 {
if asserts, res, err = request.JSON[[]*gitea_api.Attachment](requestUrl, reqOptions); res != nil {
requestUrl, err = url.Parse(gitpaginator.ParsePaginator(res.Header).NextPageToken)
} else {
requestUrl = nil
}
}
if err != nil {
yield(nil, err)
return
}
for len(asserts) > 0 {
if !yield(asserts[0], nil) {
return
}
asserts = asserts[1:]
}
}
}
}
// Get all releases from Gitea APIs and return slice with all versions
func (client Gitea) Releases() ([]*gitea_api.Release, error) {
releases := []*gitea_api.Release{}
for release, err := range client.ReleasesSeq() {
if err != nil {
return nil, err
}
releases = append(releases, release)
}
return releases, nil
}
// List all release Assets in to slice
func (client Gitea) AllAssets(releaseID int) ([]*gitea_api.Attachment, error) {
asserts := []*gitea_api.Attachment{}
for assert, err := range client.AssetsSeq(releaseID) {
if err != nil {
return nil, err
}
asserts = append(asserts, assert)
}
return asserts, nil
}
// Delete assert file from Release
func (client Gitea) DeleteAsset(releaseID, assetID int) error {
reqOptions := &request.Options{Method: "DELETE", Header: http.Header{}, Codes: processCodes}
client.authHeader(&reqOptions.Header)
res, err := request.Request(client.pathJoin("v1/repos", client.repoPath(), "releases", strconv.Itoa(releaseID), "assets", strconv.Itoa(assetID)), reqOptions)
res.Body.Close()
return err
}
// Upload file to Release
func (client Gitea) UploadAsset(releaseID int, name string, file io.Reader) (fileInfo *gitea_api.Attachment, err error) {
reqOptions := &request.Options{
Method: "POST",
Body: file,
Header: http.Header{
"Content-Type": {"application/octet-stream"},
},
Codes: processCodes.Extends(request.CodeProcess{
201: func(req *request.RequestStatus) (res *http.Response, err error) { return req.Res, nil },
422: func(req *request.RequestStatus) (res *http.Response, err error) {
return nil, fmt.Errorf("same filename exists in release: %s", name)
},
}),
}
client.authHeader(&reqOptions.Header)
fileInfo = new(gitea_api.Attachment)
reqUrl := client.pathJoin("v1/repos", client.repoPath(), "releases", strconv.Itoa(releaseID), "assets")
reqUrl.RawQuery = (&url.Values{"name": {name}}).Encode()
_, err = request.DecodeJSON(reqUrl, reqOptions, fileInfo)
return
}