pages-server/server/gitea/client_std.go

102 lines
2.8 KiB
Go
Raw Normal View History

2022-07-15 16:53:04 +00:00
//go:build !fasthttp
package gitea
import (
"bytes"
"fmt"
"io"
"net/http"
"net/url"
"strings"
"time"
"code.gitea.io/sdk/gitea"
2022-07-15 16:53:04 +00:00
"codeberg.org/codeberg/pages/server/cache"
)
type Client struct {
sdkClient *gitea.Client
fileResponseCache cache.SetGetKey
followSymlinks bool
supportLFS bool
2022-07-15 16:53:04 +00:00
}
func NewClient(giteaRoot, giteaAPIToken string, fileResponseCache cache.SetGetKey, followSymlinks, supportLFS bool) (*Client, error) {
2022-07-15 16:53:04 +00:00
rootURL, err := url.Parse(giteaRoot)
giteaRoot = strings.Trim(rootURL.String(), "/")
stdClient := http.Client{Timeout: 10 * time.Second}
sdk, err := gitea.NewClient(giteaRoot, gitea.SetHTTPClient(&stdClient), gitea.SetToken(giteaAPIToken))
return &Client{
sdkClient: sdk,
fileResponseCache: fileResponseCache,
}, err
}
func (client *Client) GiteaRawContent(targetOwner, targetRepo, ref, resource string) ([]byte, error) {
// var apiURL string
// if client.supportLFS {
// apiURL = joinURL(client.giteaRoot, giteaAPIRepos, targetOwner, targetRepo, "media", resource+"?ref="+url.QueryEscape(ref))
// } else {
// apiURL = joinURL(client.giteaRoot, giteaAPIRepos, targetOwner, targetRepo, "raw", resource+"?ref="+url.QueryEscape(ref))
// }
// TODO: sdk client support media api!!!
2022-07-15 16:53:04 +00:00
rawBytes, resp, err := client.sdkClient.GetFile(targetOwner, targetRepo, ref, resource)
if err != nil {
return nil, err
}
switch resp.StatusCode {
case http.StatusOK:
return rawBytes, nil
case http.StatusNotFound:
return nil, ErrorNotFound
default:
return nil, fmt.Errorf("unexpected status code '%d'", resp.StatusCode)
}
}
func (client *Client) ServeRawContent(targetOwner, targetRepo, ref, resource string) (io.ReadCloser, error) {
// TODO: add func that return io.ReadCloser or io.ReadSeekCloser?
rawBytes, resp, err := client.sdkClient.GetFile(targetOwner, targetRepo, ref, resource)
if err != nil {
return nil, err
}
switch resp.StatusCode {
case http.StatusOK:
return io.NopCloser(bytes.NewReader(rawBytes)), nil
case http.StatusNotFound:
return nil, ErrorNotFound
default:
return nil, fmt.Errorf("unexpected status code '%d'", resp.StatusCode)
}
}
func (client *Client) GiteaGetRepoBranchTimestamp(repoOwner, repoName, branchName string) (time.Time, error) {
branch, resp, err := client.sdkClient.GetRepoBranch(repoOwner, repoName, branchName)
if err != nil {
return time.Time{}, err
}
if resp.StatusCode != http.StatusOK {
return time.Time{}, fmt.Errorf("unexpected status code '%d'", resp.StatusCode)
}
return branch.Commit.Timestamp, nil
}
func (client *Client) GiteaGetRepoDefaultBranch(repoOwner, repoName string) (string, error) {
repo, resp, err := client.sdkClient.GetRepo(repoOwner, repoName)
if err != nil {
return "", err
}
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("unexpected status code '%d'", resp.StatusCode)
}
return repo.DefaultBranch, nil
}