Files
simplegit/cmd/gitctl/client.go
T
2026-07-29 06:51:43 -04:00

159 lines
4.7 KiB
Go

package gitctl
import (
"context"
"fmt"
"net/http"
"time"
"connectrpc.com/connect"
"google.golang.org/protobuf/types/known/emptypb"
v1 "simplegit/gitrpc/v1"
"simplegit/gitrpc/v1/v1connect"
)
type manageClient struct {
c v1connect.ManageServiceClient
baseURL string
http *http.Client
}
func newManageClient(baseURL string) *manageClient {
return &manageClient{
c: v1connect.NewManageServiceClient(&http.Client{Timeout: 15 * time.Second}, baseURL),
baseURL: baseURL,
http: &http.Client{Timeout: 15 * time.Second},
}
}
func (m *manageClient) ping() bool {
cli := &http.Client{Timeout: 2 * time.Second}
resp, err := cli.Get(m.baseURL + "/")
if err != nil {
return false
}
_ = resp.Body.Close()
return true
}
func errText(err error) string {
if err == nil {
return ""
}
code := connect.CodeOf(err)
if code == connect.CodeUnknown {
return err.Error()
}
return fmt.Sprintf("[%s] %v", code, err)
}
func (m *manageClient) Ctrl(ctx context.Context, op string, args ...string) ([]byte, error) {
resp, err := m.c.Ctrl(ctx, connect.NewRequest(&v1.CtrlRequest{Op: op, Args: args}))
if err != nil {
return nil, err
}
return resp.Msg.Result, nil
}
func (m *manageClient) UpsertRepo(ctx context.Context, ns, name string, isPrivate bool) error {
_, err := m.c.UpsertRepo(ctx, connect.NewRequest(&v1.UpsertRepoRequest{Ns: ns, Name: name, IsPrivate: isPrivate}))
return err
}
func (m *manageClient) CreateNS(ctx context.Context, ns string) error {
_, err := m.c.CreateNS(ctx, connect.NewRequest(&v1.CreateNSRequest{Ns: ns}))
return err
}
func (m *manageClient) DeleteNS(ctx context.Context, ns string) error {
_, err := m.c.DeleteNS(ctx, connect.NewRequest(&v1.DeleteNSRequest{Ns: ns}))
return err
}
func (m *manageClient) ExistRepo(ctx context.Context, ns, name string) (bool, error) {
_, err := m.c.ExistRepo(ctx, connect.NewRequest(&v1.ExistRepoRequest{Ns: ns, Name: name}))
if err != nil {
if connect.CodeOf(err) == connect.CodeNotFound {
return false, nil
}
return false, err
}
return true, nil
}
func (m *manageClient) DeleteRepo(ctx context.Context, ns, name string) error {
_, err := m.c.DeleteRepo(ctx, connect.NewRequest(&v1.DeleteRepoRequest{Ns: ns, Name: name}))
return err
}
func (m *manageClient) MoveRepo(ctx context.Context, src, dst string) error {
_, err := m.c.MoveRepo(ctx, connect.NewRequest(&v1.MoveRepoRequest{Src: src, Dst: dst}))
return err
}
func (m *manageClient) MoveNS(ctx context.Context, src, dst string) error {
_, err := m.c.MoveNS(ctx, connect.NewRequest(&v1.MoveNSRequest{Src: src, Dst: dst}))
return err
}
func (m *manageClient) UserPasswordUpsert(ctx context.Context, ns, password string) error {
_, err := m.c.UserPasswordUpsert(ctx, connect.NewRequest(&v1.UserPasswordUpsertRequest{Ns: ns, Password: password}))
return err
}
func (m *manageClient) UserDelete(ctx context.Context, ns string) error {
_, err := m.c.UserDelete(ctx, connect.NewRequest(&v1.UserDeleteRequest{Ns: ns}))
return err
}
func (m *manageClient) ACLUpsertSSHKeyOnNS(ctx context.Context, ns, key, perm string) (int64, error) {
resp, err := m.c.ACLUpsertSSHKeyOnNS(ctx, connect.NewRequest(&v1.ACLUpsertSSHKeyOnNSRequest{Ns: ns, Key: key, Perm: perm}))
if err != nil {
return 0, err
}
return resp.Msg.AclId, nil
}
func (m *manageClient) ACLUpsertPATOnNS(ctx context.Context, ns, pat, perm string) (int64, error) {
resp, err := m.c.ACLUpsertPATOnNS(ctx, connect.NewRequest(&v1.ACLUpsertPATOnNSRequest{Ns: ns, Pat: pat, Perm: perm}))
if err != nil {
return 0, err
}
return resp.Msg.AclId, nil
}
func (m *manageClient) ACLUpsertSSHKeyOnRepo(ctx context.Context, reponame, key, perm string) (int64, error) {
resp, err := m.c.ACLUpsertSSHKeyOnRepo(ctx, connect.NewRequest(&v1.ACLUpsertSSHKeyOnRepoRequest{Reponame: reponame, Key: key, Perm: perm}))
if err != nil {
return 0, err
}
return resp.Msg.AclId, nil
}
func (m *manageClient) ACLUpsertPATOnRepo(ctx context.Context, reponame, pat, perm string) (int64, error) {
resp, err := m.c.ACLUpsertPATOnRepo(ctx, connect.NewRequest(&v1.ACLUpsertPATOnRepoRequest{Reponame: reponame, Pat: pat, Perm: perm}))
if err != nil {
return 0, err
}
return resp.Msg.AclId, nil
}
func (m *manageClient) ACLDelete(ctx context.Context, id int64) error {
_, err := m.c.ACLDelete(ctx, connect.NewRequest(&v1.ACLDeleteRequest{AclId: id}))
return err
}
func (m *manageClient) ACLSetPerm(ctx context.Context, id int64, perm string) error {
_, err := m.c.ACLSetPerm(ctx, connect.NewRequest(&v1.ACLSetPermRequest{AclId: id, Perm: perm}))
return err
}
func (m *manageClient) Status(ctx context.Context) (*v1.StatusResponse, error) {
resp, err := m.c.Status(ctx, connect.NewRequest(&emptypb.Empty{}))
if err != nil {
return nil, err
}
return resp.Msg, nil
}