plane_v2_api_handlers.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. package data
  2. import (
  3. "context"
  4. "github.com/mark3labs/mcp-go/mcp"
  5. "fwh-toolbox-server/cmd/mcp/tools/helper"
  6. "fwh-toolbox-server/repositories"
  7. )
  8. // === Workspace Handlers ===
  9. func handlePlaneV2ListWorkspaces(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  10. data, err := repositories.Plane.ListWorkspaces()
  11. return planeRawResult(data, err, "列出工作空间")
  12. }
  13. func handlePlaneV2GetWorkspace(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  14. data, err := repositories.Plane.GetWorkspace()
  15. return planeRawResult(data, err, "获取工作空间详情")
  16. }
  17. // === Project Handlers ===
  18. func handlePlaneV2ListProjects(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  19. data, err := repositories.Plane.ListProjects()
  20. return planeRawResult(data, err, "列出项目")
  21. }
  22. func handlePlaneV2GetProject(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  23. id, err := req.RequireString("project_id")
  24. if err != nil {
  25. return helper.ParamError("project_id"), nil
  26. }
  27. data, apiErr := repositories.Plane.GetProject(id)
  28. return planeRawResult(data, apiErr, "获取项目详情")
  29. }
  30. // === Issue Handlers ===
  31. func handlePlaneV2ListIssues(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  32. data, err := repositories.Plane.ListIssues()
  33. return planeRawResult(data, err, "列出工作项")
  34. }
  35. func handlePlaneV2GetIssue(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  36. id, err := req.RequireString("issue_id")
  37. if err != nil {
  38. return helper.ParamError("issue_id"), nil
  39. }
  40. data, apiErr := repositories.Plane.GetIssue(id)
  41. return planeRawResult(data, apiErr, "获取工作项详情")
  42. }
  43. func handlePlaneV2GetSubIssues(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  44. id, err := req.RequireString("issue_id")
  45. if err != nil {
  46. return helper.ParamError("issue_id"), nil
  47. }
  48. data, apiErr := repositories.Plane.GetSubIssues(id)
  49. return planeRawResult(data, apiErr, "获取子工作项")
  50. }
  51. func handlePlaneV2GetIssueActivity(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  52. id, err := req.RequireString("issue_id")
  53. if err != nil {
  54. return helper.ParamError("issue_id"), nil
  55. }
  56. data, apiErr := repositories.Plane.GetIssueActivity(id)
  57. return planeRawResult(data, apiErr, "获取工作项活动历史")
  58. }
  59. // === Cycle Handlers ===
  60. func handlePlaneV2ListCycles(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  61. data, err := repositories.Plane.ListCycles()
  62. return planeRawResult(data, err, "列出周期")
  63. }
  64. func handlePlaneV2GetCycle(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  65. id, err := req.RequireString("cycle_id")
  66. if err != nil {
  67. return helper.ParamError("cycle_id"), nil
  68. }
  69. data, apiErr := repositories.Plane.GetCycle(id)
  70. return planeRawResult(data, apiErr, "获取周期详情")
  71. }
  72. func handlePlaneV2ListCycleIssues(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  73. id, err := req.RequireString("cycle_id")
  74. if err != nil {
  75. return helper.ParamError("cycle_id"), nil
  76. }
  77. data, apiErr := repositories.Plane.ListCycleIssues(id)
  78. return planeRawResult(data, apiErr, "列出周期工作项")
  79. }
  80. // === Module Handlers ===
  81. func handlePlaneV2ListModules(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  82. data, err := repositories.Plane.ListModules()
  83. return planeRawResult(data, err, "列出模块")
  84. }
  85. func handlePlaneV2GetModule(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  86. id, err := req.RequireString("module_id")
  87. if err != nil {
  88. return helper.ParamError("module_id"), nil
  89. }
  90. data, apiErr := repositories.Plane.GetModule(id)
  91. return planeRawResult(data, apiErr, "获取模块详情")
  92. }
  93. func handlePlaneV2ListModuleIssues(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  94. id, err := req.RequireString("module_id")
  95. if err != nil {
  96. return helper.ParamError("module_id"), nil
  97. }
  98. data, apiErr := repositories.Plane.ListModuleIssues(id)
  99. return planeRawResult(data, apiErr, "列出模块工作项")
  100. }
  101. // === Label Handlers ===
  102. func handlePlaneV2ListLabels(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  103. data, err := repositories.Plane.ListLabels()
  104. return planeRawResult(data, err, "列出标签")
  105. }
  106. func handlePlaneV2GetLabel(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  107. id, err := req.RequireString("label_id")
  108. if err != nil {
  109. return helper.ParamError("label_id"), nil
  110. }
  111. data, apiErr := repositories.Plane.GetLabel(id)
  112. return planeRawResult(data, apiErr, "获取标签详情")
  113. }
  114. // === State Handlers ===
  115. func handlePlaneV2ListStates(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  116. data, err := repositories.Plane.ListStates()
  117. return planeRawResult(data, err, "列出状态")
  118. }
  119. func handlePlaneV2GetState(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  120. id, err := req.RequireString("state_id")
  121. if err != nil {
  122. return helper.ParamError("state_id"), nil
  123. }
  124. data, apiErr := repositories.Plane.GetState(id)
  125. return planeRawResult(data, apiErr, "获取状态详情")
  126. }
  127. // === Comment Handlers ===
  128. func handlePlaneV2ListComments(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  129. id, err := req.RequireString("issue_id")
  130. if err != nil {
  131. return helper.ParamError("issue_id"), nil
  132. }
  133. data, apiErr := repositories.Plane.ListComments(id)
  134. return planeRawResult(data, apiErr, "列出评论")
  135. }
  136. func handlePlaneV2GetComment(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  137. issueID, err := req.RequireString("issue_id")
  138. if err != nil {
  139. return helper.ParamError("issue_id"), nil
  140. }
  141. commentID, err := req.RequireString("comment_id")
  142. if err != nil {
  143. return helper.ParamError("comment_id"), nil
  144. }
  145. data, apiErr := repositories.Plane.GetComment(issueID, commentID)
  146. return planeRawResult(data, apiErr, "获取评论详情")
  147. }
  148. // === Link Handlers ===
  149. func handlePlaneV2ListIssueLinks(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  150. id, err := req.RequireString("issue_id")
  151. if err != nil {
  152. return helper.ParamError("issue_id"), nil
  153. }
  154. data, apiErr := repositories.Plane.ListIssueLinks(id)
  155. return planeRawResult(data, apiErr, "列出工作项链接")
  156. }
  157. // === Relation Handlers ===
  158. func handlePlaneV2ListIssueRelations(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  159. id, err := req.RequireString("issue_id")
  160. if err != nil {
  161. return helper.ParamError("issue_id"), nil
  162. }
  163. data, apiErr := repositories.Plane.ListIssueRelations(id)
  164. return planeRawResult(data, apiErr, "列出工作项关联")
  165. }
  166. // === Sticky Handlers ===
  167. func handlePlaneV2ListStickies(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  168. data, err := repositories.Plane.ListStickies()
  169. return planeRawResult(data, err, "列出便签")
  170. }
  171. func handlePlaneV2GetSticky(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  172. id, err := req.RequireString("sticky_id")
  173. if err != nil {
  174. return helper.ParamError("sticky_id"), nil
  175. }
  176. data, apiErr := repositories.Plane.GetSticky(id)
  177. return planeRawResult(data, apiErr, "获取便签详情")
  178. }
  179. // === Intake Handlers ===
  180. func handlePlaneV2ListIntakeIssues(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  181. status := req.GetString("status", "")
  182. data, err := repositories.Plane.ListIntakeIssues(status)
  183. return planeRawResult(data, err, "列出收件箱工作项")
  184. }
  185. func handlePlaneV2GetIntakeIssue(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  186. id, err := req.RequireString("issue_id")
  187. if err != nil {
  188. return helper.ParamError("issue_id"), nil
  189. }
  190. data, apiErr := repositories.Plane.GetIntakeIssue(id)
  191. return planeRawResult(data, apiErr, "获取收件箱工作项详情")
  192. }
  193. // === Asset Handlers ===
  194. func handlePlaneV2GetProjectAssetURL(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  195. id, err := req.RequireString("asset_id")
  196. if err != nil {
  197. return helper.ParamError("asset_id"), nil
  198. }
  199. url, apiErr := repositories.Plane.GetProjectAssetURL(id)
  200. if apiErr != nil {
  201. return helper.ServiceError("获取资源URL", apiErr), nil
  202. }
  203. return helper.TextResult(url), nil
  204. }
  205. // === Page Handlers ===
  206. func handlePlaneV2ListPages(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  207. data, err := repositories.Plane.ListPages()
  208. return planeRawResult(data, err, "列出页面")
  209. }
  210. func handlePlaneV2GetPage(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  211. id, err := req.RequireString("page_id")
  212. if err != nil {
  213. return helper.ParamError("page_id"), nil
  214. }
  215. data, apiErr := repositories.Plane.GetPage(id)
  216. return planeRawResult(data, apiErr, "获取页面详情")
  217. }
  218. func handlePlaneV2GetPageDescription(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  219. id, err := req.RequireString("page_id")
  220. if err != nil {
  221. return helper.ParamError("page_id"), nil
  222. }
  223. data, apiErr := repositories.Plane.GetPageDescription(id)
  224. return planeRawResult(data, apiErr, "获取页面描述")
  225. }
  226. // === Member Handlers ===
  227. func handlePlaneV2ListWorkspaceMembers(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  228. data, err := repositories.Plane.ListWorkspaceMembers()
  229. return planeRawResult(data, err, "列出工作空间成员")
  230. }
  231. func handlePlaneV2GetWorkspaceMember(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  232. id, err := req.RequireString("member_id")
  233. if err != nil {
  234. return helper.ParamError("member_id"), nil
  235. }
  236. data, apiErr := repositories.Plane.GetWorkspaceMember(id)
  237. return planeRawResult(data, apiErr, "获取工作空间成员详情")
  238. }
  239. func handlePlaneV2ListProjectMembers(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  240. data, err := repositories.Plane.ListProjectMembers()
  241. return planeRawResult(data, err, "列出项目成员")
  242. }
  243. func handlePlaneV2GetProjectMember(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
  244. id, err := req.RequireString("member_id")
  245. if err != nil {
  246. return helper.ParamError("member_id"), nil
  247. }
  248. data, apiErr := repositories.Plane.GetProjectMember(id)
  249. return planeRawResult(data, apiErr, "获取项目成员详情")
  250. }