diff --git a/operation/issue/blocking.go b/operation/issue/blocking.go index 62a1e14..8722178 100644 --- a/operation/issue/blocking.go +++ b/operation/issue/blocking.go @@ -3,6 +3,8 @@ package issue import ( "context" "fmt" + "net/http" + "net/url" "gitea.com/gitea/gitea-mcp/pkg/gitea" "gitea.com/gitea/gitea-mcp/pkg/params" @@ -12,6 +14,14 @@ import ( "github.com/modelcontextprotocol/go-sdk/mcp" ) +// issueMeta carries owner/repo in the body; the SDK's IssueMeta only has Index +// and Gitea resolves the body repo from those fields. +type issueMeta struct { + Index int64 `json:"index"` + Owner string `json:"owner"` + Repo string `json:"repo"` +} + func listIssueBlocksFn(ctx context.Context, args map[string]any) (*mcp.CallToolResult, error) { owner, repo, index, err := issueRef(args) if err != nil { @@ -49,21 +59,16 @@ func setIssueBlockingFn(ctx context.Context, args map[string]any, block bool) (* if err != nil { return to.ErrorResult(err) } - client, err := gitea.ClientFromContext(ctx) - if err != nil { - return to.ErrorResult(fmt.Errorf("get gitea client err: %v", err)) + method := http.MethodPost + if !block { + method = http.MethodDelete } - meta := gitea_sdk.IssueMeta{Index: blocked} - var issue *gitea_sdk.Issue - if block { - issue, _, err = client.Issues.CreateIssueBlocking(ctx, owner, repo, index, meta) - } else { - issue, _, err = client.Issues.RemoveIssueBlocking(ctx, owner, repo, index, meta) - } - if err != nil { + var issue gitea_sdk.Issue + path := fmt.Sprintf("repos/%s/%s/issues/%d/blocks", url.PathEscape(owner), url.PathEscape(repo), index) + if _, err := gitea.DoJSON(ctx, method, path, nil, issueMeta{Index: blocked, Owner: owner, Repo: repo}, &issue); err != nil { return to.ErrorResult(fmt.Errorf("update %v/%v/issue/%v/blocks err: %v", owner, repo, index, err)) } - return to.TextResult(slimIssue(issue)) + return to.TextResult(slimIssue(&issue)) } func listIssueDependenciesFn(ctx context.Context, args map[string]any) (*mcp.CallToolResult, error) { @@ -103,21 +108,16 @@ func setIssueDependencyFn(ctx context.Context, args map[string]any, add bool) (* if err != nil { return to.ErrorResult(err) } - client, err := gitea.ClientFromContext(ctx) - if err != nil { - return to.ErrorResult(fmt.Errorf("get gitea client err: %v", err)) + method := http.MethodPost + if !add { + method = http.MethodDelete } - meta := gitea_sdk.IssueMeta{Index: blocking} - var issue *gitea_sdk.Issue - if add { - issue, _, err = client.Issues.CreateIssueDependency(ctx, owner, repo, index, meta) - } else { - issue, _, err = client.Issues.RemoveIssueDependency(ctx, owner, repo, index, meta) - } - if err != nil { + var issue gitea_sdk.Issue + path := fmt.Sprintf("repos/%s/%s/issues/%d/dependencies", url.PathEscape(owner), url.PathEscape(repo), index) + if _, err := gitea.DoJSON(ctx, method, path, nil, issueMeta{Index: blocking, Owner: owner, Repo: repo}, &issue); err != nil { return to.ErrorResult(fmt.Errorf("update %v/%v/issue/%v/dependencies err: %v", owner, repo, index, err)) } - return to.TextResult(slimIssue(issue)) + return to.TextResult(slimIssue(&issue)) } func issueRef(args map[string]any) (owner, repo string, index int64, err error) { diff --git a/operation/issue/blocking_test.go b/operation/issue/blocking_test.go index cd1c4d2..adae1c0 100644 --- a/operation/issue/blocking_test.go +++ b/operation/issue/blocking_test.go @@ -135,8 +135,16 @@ func Test_issueBlocking(t *testing.T) { if tt.wantQuery != "" && gotQuery != tt.wantQuery { t.Fatalf("query = %s, want %s", gotQuery, tt.wantQuery) } - if tt.wantIndex != 0 && gotBody["index"] != tt.wantIndex { - t.Fatalf("body index = %v, want %v", gotBody["index"], tt.wantIndex) + if tt.wantIndex != 0 { + if gotBody["index"] != tt.wantIndex { + t.Fatalf("body index = %v, want %v", gotBody["index"], tt.wantIndex) + } + if gotBody["owner"] != owner { + t.Fatalf("body owner = %v, want %s", gotBody["owner"], owner) + } + if gotBody["repo"] != repo { + t.Fatalf("body repo = %v, want %s", gotBody["repo"], repo) + } } body := res.Content[0].(*mcp.TextContent).Text if !strings.Contains(body, `"number":7`) && !strings.Contains(body, `"number": 7`) {