mirror of
https://github.com/go-i2p/gitlab-to-gitea.git
synced 2025-07-13 06:07:43 -04:00
274 lines
6.6 KiB
Go
274 lines
6.6 KiB
Go
// client.go
|
|
|
|
// Package gitlab provides a client for interacting with the GitLab API
|
|
package gitlab
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/xanzy/go-gitlab"
|
|
)
|
|
|
|
// Client wraps the GitLab client for custom functionality
|
|
type Client struct {
|
|
client *gitlab.Client
|
|
}
|
|
|
|
// NewClient creates a new GitLab client with the provided URL and token
|
|
func NewClient(url, token string) (*Client, error) {
|
|
client, err := gitlab.NewClient(token, gitlab.WithBaseURL(url))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create GitLab client: %w", err)
|
|
}
|
|
|
|
return &Client{
|
|
client: client,
|
|
}, nil
|
|
}
|
|
|
|
// GetVersion retrieves the GitLab version
|
|
func (c *Client) GetVersion() (string, error) {
|
|
v, _, err := c.client.Version.GetVersion()
|
|
if err != nil {
|
|
return "", fmt.Errorf("failed to get GitLab version: %w", err)
|
|
}
|
|
return v.Version, nil
|
|
}
|
|
|
|
// GetCurrentUser retrieves information about the current authenticated user
|
|
func (c *Client) GetCurrentUser() (*gitlab.User, error) {
|
|
user, _, err := c.client.Users.CurrentUser()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to get current user: %w", err)
|
|
}
|
|
return user, nil
|
|
}
|
|
|
|
// ListUsers returns all users in the GitLab instance
|
|
func (c *Client) ListUsers() ([]*gitlab.User, error) {
|
|
opts := &gitlab.ListUsersOptions{
|
|
ListOptions: gitlab.ListOptions{
|
|
PerPage: 100,
|
|
},
|
|
}
|
|
|
|
var allUsers []*gitlab.User
|
|
for {
|
|
users, resp, err := c.client.Users.ListUsers(opts)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to list users: %w", err)
|
|
}
|
|
allUsers = append(allUsers, users...)
|
|
if resp.NextPage == 0 {
|
|
break
|
|
}
|
|
opts.Page = resp.NextPage
|
|
}
|
|
return allUsers, nil
|
|
}
|
|
|
|
// ListGroups returns all groups in the GitLab instance
|
|
func (c *Client) ListGroups() ([]*gitlab.Group, error) {
|
|
opts := &gitlab.ListGroupsOptions{
|
|
ListOptions: gitlab.ListOptions{
|
|
PerPage: 100,
|
|
},
|
|
}
|
|
|
|
var allGroups []*gitlab.Group
|
|
for {
|
|
groups, resp, err := c.client.Groups.ListGroups(opts)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to list groups: %w", err)
|
|
}
|
|
allGroups = append(allGroups, groups...)
|
|
if resp.NextPage == 0 {
|
|
break
|
|
}
|
|
opts.Page = resp.NextPage
|
|
}
|
|
return allGroups, nil
|
|
}
|
|
|
|
// ListProjects returns all projects in the GitLab instance
|
|
func (c *Client) ListProjects() ([]*gitlab.Project, error) {
|
|
opts := &gitlab.ListProjectsOptions{
|
|
ListOptions: gitlab.ListOptions{
|
|
PerPage: 100,
|
|
},
|
|
}
|
|
|
|
var allProjects []*gitlab.Project
|
|
for {
|
|
projects, resp, err := c.client.Projects.ListProjects(opts)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to list projects: %w", err)
|
|
}
|
|
allProjects = append(allProjects, projects...)
|
|
if resp.NextPage == 0 {
|
|
break
|
|
}
|
|
opts.Page = resp.NextPage
|
|
}
|
|
return allProjects, nil
|
|
}
|
|
|
|
// GetProjectMembers returns all members of a project
|
|
func (c *Client) GetProjectMembers(projectID int) ([]*gitlab.ProjectMember, error) {
|
|
opts := &gitlab.ListProjectMembersOptions{
|
|
ListOptions: gitlab.ListOptions{
|
|
PerPage: 100,
|
|
},
|
|
}
|
|
|
|
var allMembers []*gitlab.ProjectMember
|
|
for {
|
|
members, resp, err := c.client.ProjectMembers.ListProjectMembers(projectID, opts)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to list project members: %w", err)
|
|
}
|
|
allMembers = append(allMembers, members...)
|
|
if resp.NextPage == 0 {
|
|
break
|
|
}
|
|
opts.Page = resp.NextPage
|
|
}
|
|
return allMembers, nil
|
|
}
|
|
|
|
// GetProjectLabels returns all labels of a project
|
|
func (c *Client) GetProjectLabels(projectID int) ([]*gitlab.Label, error) {
|
|
opts := &gitlab.ListLabelsOptions{
|
|
ListOptions: gitlab.ListOptions{
|
|
PerPage: 100,
|
|
},
|
|
}
|
|
|
|
var allLabels []*gitlab.Label
|
|
for {
|
|
labels, resp, err := c.client.Labels.ListLabels(projectID, opts)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to list project labels: %w", err)
|
|
}
|
|
allLabels = append(allLabels, labels...)
|
|
if resp.NextPage == 0 {
|
|
break
|
|
}
|
|
opts.Page = resp.NextPage
|
|
}
|
|
return allLabels, nil
|
|
}
|
|
|
|
// GetProjectMilestones returns all milestones of a project
|
|
func (c *Client) GetProjectMilestones(projectID int) ([]*gitlab.Milestone, error) {
|
|
opts := &gitlab.ListMilestonesOptions{
|
|
ListOptions: gitlab.ListOptions{
|
|
PerPage: 100,
|
|
},
|
|
}
|
|
|
|
var allMilestones []*gitlab.Milestone
|
|
for {
|
|
milestones, resp, err := c.client.Milestones.ListMilestones(projectID, opts)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to list project milestones: %w", err)
|
|
}
|
|
allMilestones = append(allMilestones, milestones...)
|
|
if resp.NextPage == 0 {
|
|
break
|
|
}
|
|
opts.Page = resp.NextPage
|
|
}
|
|
return allMilestones, nil
|
|
}
|
|
|
|
// GetProjectIssues returns all issues of a project
|
|
func (c *Client) GetProjectIssues(projectID int) ([]*gitlab.Issue, error) {
|
|
opts := &gitlab.ListProjectIssuesOptions{
|
|
ListOptions: gitlab.ListOptions{
|
|
PerPage: 100,
|
|
},
|
|
}
|
|
|
|
var allIssues []*gitlab.Issue
|
|
for {
|
|
issues, resp, err := c.client.Issues.ListProjectIssues(projectID, opts)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to list project issues: %w", err)
|
|
}
|
|
allIssues = append(allIssues, issues...)
|
|
if resp.NextPage == 0 {
|
|
break
|
|
}
|
|
opts.Page = resp.NextPage
|
|
}
|
|
return allIssues, nil
|
|
}
|
|
|
|
// GetIssueNotes returns all notes of an issue
|
|
func (c *Client) GetIssueNotes(projectID, issueID int) ([]*gitlab.Note, error) {
|
|
opts := &gitlab.ListIssueNotesOptions{
|
|
ListOptions: gitlab.ListOptions{
|
|
PerPage: 100,
|
|
},
|
|
}
|
|
|
|
var allNotes []*gitlab.Note
|
|
for {
|
|
notes, resp, err := c.client.Notes.ListIssueNotes(projectID, issueID, opts)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to list issue notes: %w", err)
|
|
}
|
|
allNotes = append(allNotes, notes...)
|
|
if resp.NextPage == 0 {
|
|
break
|
|
}
|
|
opts.Page = resp.NextPage
|
|
}
|
|
return allNotes, nil
|
|
}
|
|
|
|
// GetGroupMembers returns all members of a group
|
|
func (c *Client) GetGroupMembers(groupID int) ([]*gitlab.GroupMember, error) {
|
|
opts := &gitlab.ListGroupMembersOptions{
|
|
ListOptions: gitlab.ListOptions{
|
|
PerPage: 100,
|
|
},
|
|
}
|
|
|
|
var allMembers []*gitlab.GroupMember
|
|
for {
|
|
members, resp, err := c.client.Groups.ListGroupMembers(groupID, opts)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to list group members: %w", err)
|
|
}
|
|
allMembers = append(allMembers, members...)
|
|
if resp.NextPage == 0 {
|
|
break
|
|
}
|
|
opts.Page = resp.NextPage
|
|
}
|
|
return allMembers, nil
|
|
}
|
|
|
|
// GetUserKeys returns all SSH keys of a user
|
|
func (c *Client) GetUserKeys(userID int) ([]*gitlab.SSHKey, error) {
|
|
opts := &gitlab.ListSSHKeysForUserOptions{
|
|
PerPage: 100,
|
|
}
|
|
|
|
var allKeys []*gitlab.SSHKey
|
|
for {
|
|
keys, resp, err := c.client.Users.ListSSHKeysForUser(userID, opts)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to list user SSH keys: %w", err)
|
|
}
|
|
allKeys = append(allKeys, keys...)
|
|
if resp.NextPage == 0 {
|
|
break
|
|
}
|
|
opts.Page = resp.NextPage
|
|
}
|
|
return allKeys, nil
|
|
}
|