pkg/gitprovider/provider.go (116 lines of code) (raw):

package gitprovider import ( "context" "fmt" "strings" "github.com/go-resty/resty/v2" codebaseApi "github.com/epam/edp-codebase-operator/v2/api/v1" "github.com/epam/edp-codebase-operator/v2/pkg/util" ) // GitWebHookProvider is an interface for Git web hook provider. type GitWebHookProvider interface { CreateWebHook( ctx context.Context, gitProviderURL, token, projectID, webHookSecret, webHookURL string, skipTLS bool, ) (*WebHook, error) CreateWebHookIfNotExists( ctx context.Context, githubURL, token, projectID, webHookSecret, webHookURL string, skipTLS bool, ) (*WebHook, error) GetWebHook( ctx context.Context, gitProviderURL, token, projectID string, webHookRef string, ) (*WebHook, error) GetWebHooks( ctx context.Context, githubURL, token, projectID string, ) ([]*WebHook, error) DeleteWebHook( ctx context.Context, gitProviderURL, token, projectID string, webHookRef string, ) error } // GitProjectProvider is an interface for Git project provider. type GitProjectProvider interface { CreateProject( ctx context.Context, gitlabURL, token, fullPath string, ) error ProjectExists( ctx context.Context, gitlabURL, token, projectID string, ) (bool, error) SetDefaultBranch( ctx context.Context, githubURL, token, projectID, branch string, ) error } type GitProvider interface { GitWebHookProvider GitProjectProvider } // NewProvider creates a new Git provider based on gitServer. func NewProvider(gitServer *codebaseApi.GitServer, restyClient *resty.Client, token string) (GitProvider, error) { switch gitServer.Spec.GitProvider { case codebaseApi.GitProviderGithub: return NewGitHubClient(restyClient), nil case codebaseApi.GitProviderGitlab: return NewGitLabClient(restyClient), nil case codebaseApi.GitProviderBitbucket: return NewBitbucketClient(token) default: return nil, fmt.Errorf("unsupported git provider %s", gitServer.Spec.GitProvider) } } // NewGitProjectProvider creates a new Git project provider based on gitServer. func NewGitProjectProvider(gitServer *codebaseApi.GitServer, token string) (GitProjectProvider, error) { return NewProvider(gitServer, resty.New(), token) } // GetGitProviderAPIURL returns git server url with protocol. func GetGitProviderAPIURL(gitServer *codebaseApi.GitServer) string { url := util.GetHostWithProtocol(gitServer.Spec.GitHost) if gitServer.Spec.GitProvider == codebaseApi.GitProviderGithub { // GitHub API url is different for enterprise and other versions // see: https://docs.github.com/en/get-started/learning-about-github/about-versions-of-github-docs#github-enterprise-server if url == "https://github.com" { return "https://api.github.com" } url = fmt.Sprintf("%s/api/v3", url) } if gitServer.Spec.GitProvider == codebaseApi.GitProviderBitbucket { return "https://api.bitbucket.org/2.0" } if gitServer.Spec.HttpsPort != 0 { url = fmt.Sprintf("%s:%d", url, gitServer.Spec.HttpsPort) } return url } func parseProjectID(projectID string) (owner, repo string, err error) { parts := strings.Split(projectID, "/") if len(parts) != 2 { return "", "", fmt.Errorf("invalid project ID: %s", projectID) } return parts[0], parts[1], nil } type WebHook struct { ID string `json:"id"` URL string `json:"url"` }