Skip to content

Commit 004edc0

Browse files
committed
Return minimal project
1 parent 3521c35 commit 004edc0

File tree

3 files changed

+108
-8
lines changed

3 files changed

+108
-8
lines changed

pkg/github/minimal_types.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,97 @@ type MinimalResponse struct {
114114
URL string `json:"url"`
115115
}
116116

117+
type MinimalProject struct {
118+
ID *int64 `json:"id,omitempty"`
119+
NodeID *string `json:"node_id,omitempty"`
120+
Owner *MinimalUser `json:"owner,omitempty"`
121+
Creator *MinimalUser `json:"creator,omitempty"`
122+
Title *string `json:"title,omitempty"`
123+
Description *string `json:"description,omitempty"`
124+
Public *bool `json:"public,omitempty"`
125+
ClosedAt *github.Timestamp `json:"closed_at,omitempty"`
126+
CreatedAt *github.Timestamp `json:"created_at,omitempty"`
127+
UpdatedAt *github.Timestamp `json:"updated_at,omitempty"`
128+
DeletedAt *github.Timestamp `json:"deleted_at,omitempty"`
129+
Number *int `json:"number,omitempty"`
130+
ShortDescription *string `json:"short_description,omitempty"`
131+
DeletedBy *MinimalUser `json:"deleted_by,omitempty"`
132+
}
133+
134+
type MinimalProjectItem struct {
135+
ID *int64 `json:"id,omitempty"`
136+
NodeID *string `json:"node_id,omitempty"`
137+
ProjectNodeID *string `json:"project_node_id,omitempty"`
138+
ContentNodeID *string `json:"content_node_id,omitempty"`
139+
ProjectURL *string `json:"project_url,omitempty"`
140+
ContentType *string `json:"content_type,omitempty"`
141+
Creator *MinimalUser `json:"creator,omitempty"`
142+
CreatedAt *github.Timestamp `json:"created_at,omitempty"`
143+
UpdatedAt *github.Timestamp `json:"updated_at,omitempty"`
144+
ArchivedAt *github.Timestamp `json:"archived_at,omitempty"`
145+
ItemURL *string `json:"item_url,omitempty"`
146+
Fields []*projectV2Field `json:"fields,omitempty"`
147+
}
148+
117149
// Helper functions
118150

151+
func convertToMinimalProject(fullProject *github.ProjectV2) *MinimalProject {
152+
if fullProject == nil {
153+
return nil
154+
}
155+
156+
return &MinimalProject{
157+
ID: github.Ptr(fullProject.GetID()),
158+
NodeID: github.Ptr(fullProject.GetNodeID()),
159+
Owner: convertToMinimalUser(fullProject.GetOwner()),
160+
Creator: convertToMinimalUser(fullProject.GetCreator()),
161+
Title: github.Ptr(fullProject.GetTitle()),
162+
Description: github.Ptr(fullProject.GetDescription()),
163+
Public: github.Ptr(fullProject.GetPublic()),
164+
ClosedAt: github.Ptr(fullProject.GetClosedAt()),
165+
CreatedAt: github.Ptr(fullProject.GetCreatedAt()),
166+
UpdatedAt: github.Ptr(fullProject.GetUpdatedAt()),
167+
DeletedAt: github.Ptr(fullProject.GetDeletedAt()),
168+
Number: github.Ptr(fullProject.GetNumber()),
169+
ShortDescription: github.Ptr(fullProject.GetShortDescription()),
170+
DeletedBy: convertToMinimalUser(fullProject.GetDeletedBy()),
171+
}
172+
}
173+
174+
func convertToMinimalUser(user *github.User) *MinimalUser {
175+
if user == nil {
176+
return nil
177+
}
178+
179+
return &MinimalUser{
180+
Login: user.GetLogin(),
181+
ID: user.GetID(),
182+
ProfileURL: user.GetHTMLURL(),
183+
AvatarURL: user.GetAvatarURL(),
184+
}
185+
}
186+
187+
func convertToMinimalProjectItem(item *projectV2Item) *MinimalProjectItem {
188+
if item == nil {
189+
return nil
190+
}
191+
192+
return &MinimalProjectItem{
193+
ID: item.ID,
194+
NodeID: item.NodeID,
195+
ProjectNodeID: item.ProjectNodeID,
196+
ContentNodeID: item.ContentNodeID,
197+
ProjectURL: item.ProjectURL,
198+
ContentType: item.ContentType,
199+
Creator: convertToMinimalUser(item.Creator),
200+
CreatedAt: item.CreatedAt,
201+
UpdatedAt: item.UpdatedAt,
202+
ArchivedAt: item.ArchivedAt,
203+
ItemURL: item.ItemURL,
204+
Fields: item.Fields,
205+
}
206+
}
207+
119208
// convertToMinimalCommit converts a GitHub API RepositoryCommit to MinimalCommit
120209
func convertToMinimalCommit(commit *github.RepositoryCommit, includeDiffs bool) MinimalCommit {
121210
minimalCommit := MinimalCommit{

pkg/github/projects.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func ListProjects(getClient GetClientFn, t translations.TranslationHelperFunc) (
3434
if err != nil {
3535
return mcp.NewToolResultError(err.Error()), nil
3636
}
37-
queryStr, err := OptionalParam[string](req, "q")
37+
queryStr, err := OptionalParam[string](req, "query")
3838
if err != nil {
3939
return mcp.NewToolResultError(err.Error()), nil
4040
}
@@ -54,6 +54,7 @@ func ListProjects(getClient GetClientFn, t translations.TranslationHelperFunc) (
5454
url = fmt.Sprintf("users/%s/projectsV2", owner)
5555
}
5656
projects := []github.ProjectV2{}
57+
minimalProjects := []MinimalProject{}
5758

5859
opts := listProjectsOptions{PerPage: perPage}
5960

@@ -83,14 +84,18 @@ func ListProjects(getClient GetClientFn, t translations.TranslationHelperFunc) (
8384
}
8485
defer func() { _ = resp.Body.Close() }()
8586

87+
for _, project := range projects {
88+
minimalProjects = append(minimalProjects, *convertToMinimalProject(&project))
89+
}
90+
8691
if resp.StatusCode != http.StatusOK {
8792
body, err := io.ReadAll(resp.Body)
8893
if err != nil {
8994
return nil, fmt.Errorf("failed to read response body: %w", err)
9095
}
9196
return mcp.NewToolResultError(fmt.Sprintf("failed to list projects: %s", string(body))), nil
9297
}
93-
r, err := json.Marshal(projects)
98+
r, err := json.Marshal(minimalProjects)
9499
if err != nil {
95100
return nil, fmt.Errorf("failed to marshal response: %w", err)
96101
}
@@ -159,7 +164,9 @@ func GetProject(getClient GetClientFn, t translations.TranslationHelperFunc) (to
159164
}
160165
return mcp.NewToolResultError(fmt.Sprintf("failed to get project: %s", string(body))), nil
161166
}
162-
r, err := json.Marshal(project)
167+
168+
minimalProject := convertToMinimalProject(&project)
169+
r, err := json.Marshal(minimalProject)
163170
if err != nil {
164171
return nil, fmt.Errorf("failed to marshal response: %w", err)
165172
}
@@ -355,7 +362,7 @@ func ListProjectItems(getClient GetClientFn, t translations.TranslationHelperFun
355362
if err != nil {
356363
return mcp.NewToolResultError(err.Error()), nil
357364
}
358-
queryStr, err := OptionalParam[string](req, "q")
365+
queryStr, err := OptionalParam[string](req, "query")
359366
if err != nil {
360367
return mcp.NewToolResultError(err.Error()), nil
361368
}
@@ -406,7 +413,11 @@ func ListProjectItems(getClient GetClientFn, t translations.TranslationHelperFun
406413
}
407414
return mcp.NewToolResultError(fmt.Sprintf("failed to list project items: %s", string(body))), nil
408415
}
409-
r, err := json.Marshal(projectItems)
416+
minimalProjectItems := []MinimalProjectItem{}
417+
for _, item := range projectItems {
418+
minimalProjectItems = append(minimalProjectItems, *convertToMinimalProjectItem(&item))
419+
}
420+
r, err := json.Marshal(minimalProjectItems)
410421
if err != nil {
411422
return nil, fmt.Errorf("failed to marshal response: %w", err)
412423
}
@@ -476,7 +487,7 @@ func GetProjectItem(getClient GetClientFn, t translations.TranslationHelperFunc)
476487
}
477488
return mcp.NewToolResultError(fmt.Sprintf("failed to get project item: %s", string(body))), nil
478489
}
479-
r, err := json.Marshal(projectItem)
490+
r, err := json.Marshal(convertToMinimalProjectItem(&projectItem))
480491
if err != nil {
481492
return nil, fmt.Errorf("failed to marshal response: %w", err)
482493
}

pkg/github/projects_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func Test_ListProjects(t *testing.T) {
8989
"owner": "octo-org",
9090
"owner_type": "org",
9191
"per_page": float64(50),
92-
"q": "roadmap",
92+
"query": "roadmap",
9393
},
9494
expectError: false,
9595
expectedLength: 1,
@@ -679,7 +679,7 @@ func Test_ListProjectItems(t *testing.T) {
679679
"owner_type": "org",
680680
"project_number": float64(123),
681681
"per_page": float64(50),
682-
"q": "bug",
682+
"query": "bug",
683683
},
684684
expectedLength: 1,
685685
},

0 commit comments

Comments
 (0)