Files
gitlab-to-gitea/gitlab/client.go
2025-04-20 21:18:53 -04:00

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
}