plane_module.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package plane_v1
  2. import (
  3. "fmt"
  4. "go.uber.org/zap"
  5. )
  6. // ==================== Module API ====================
  7. // ListModules 列出模块
  8. func ListModules() ([]byte, error) {
  9. path := fmt.Sprintf("/api/v1/workspaces/%s/projects/%s/modules/", planeWorkspaceSlug, planeProjectId)
  10. resp, err := planeHttpGet(path)
  11. if err != nil {
  12. zap.L().Error("[Plane] ListModules 请求失败", zap.Error(err))
  13. return nil, err
  14. }
  15. if !isSuccess(resp.StatusCode) {
  16. zap.L().Error("[Plane] ListModules 返回错误", zap.String("status", resp.Status))
  17. return nil, fmt.Errorf("ListModules 失败: %s", resp.Status)
  18. }
  19. return resp.Body, nil
  20. }
  21. // CreateModule 创建模块
  22. func CreateModule(data map[string]interface{}) ([]byte, error) {
  23. path := fmt.Sprintf("/api/v1/workspaces/%s/projects/%s/modules/", planeWorkspaceSlug, planeProjectId)
  24. resp, err := planeHttpPost(path, data)
  25. if err != nil {
  26. zap.L().Error("[Plane] CreateModule 请求失败", zap.Error(err))
  27. return nil, err
  28. }
  29. if resp.StatusCode != 201 {
  30. zap.L().Error("[Plane] CreateModule 返回错误", zap.String("status", resp.Status), zap.String("body", string(resp.Body)))
  31. return nil, fmt.Errorf("CreateModule 失败: %s", resp.Status)
  32. }
  33. return resp.Body, nil
  34. }
  35. // GetModule 获取模块详情
  36. func GetModule(moduleID string) ([]byte, error) {
  37. path := fmt.Sprintf("/api/v1/workspaces/%s/projects/%s/modules/%s/", planeWorkspaceSlug, planeProjectId, moduleID)
  38. resp, err := planeHttpGet(path)
  39. if err != nil {
  40. zap.L().Error("[Plane] GetModule 请求失败", zap.Error(err))
  41. return nil, err
  42. }
  43. if !isSuccess(resp.StatusCode) {
  44. zap.L().Error("[Plane] GetModule 返回错误", zap.String("status", resp.Status))
  45. return nil, fmt.Errorf("GetModule 失败: %s", resp.Status)
  46. }
  47. return resp.Body, nil
  48. }
  49. // UpdateModule 更新模块
  50. func UpdateModule(moduleID string, data map[string]interface{}) ([]byte, error) {
  51. path := fmt.Sprintf("/api/v1/workspaces/%s/projects/%s/modules/%s/", planeWorkspaceSlug, planeProjectId, moduleID)
  52. resp, err := planeHttpPatch(path, data)
  53. if err != nil {
  54. zap.L().Error("[Plane] UpdateModule 请求失败", zap.Error(err))
  55. return nil, err
  56. }
  57. if !isSuccess(resp.StatusCode) {
  58. zap.L().Error("[Plane] UpdateModule 返回错误", zap.String("status", resp.Status), zap.String("body", string(resp.Body)))
  59. return nil, fmt.Errorf("UpdateModule 失败: %s", resp.Status)
  60. }
  61. return resp.Body, nil
  62. }
  63. // DeleteModule 删除模块
  64. func DeleteModule(moduleID string) error {
  65. path := fmt.Sprintf("/api/v1/workspaces/%s/projects/%s/modules/%s/", planeWorkspaceSlug, planeProjectId, moduleID)
  66. resp, err := planeHttpDelete(path)
  67. if err != nil {
  68. zap.L().Error("[Plane] DeleteModule 请求失败", zap.Error(err))
  69. return err
  70. }
  71. if resp.StatusCode != 204 {
  72. zap.L().Error("[Plane] DeleteModule 返回错误", zap.String("status", resp.Status))
  73. return fmt.Errorf("DeleteModule 失败: %s", resp.Status)
  74. }
  75. return nil
  76. }
  77. // ListModuleIssues 列出模块中的工作项
  78. func ListModuleIssues(moduleID string) ([]byte, error) {
  79. path := fmt.Sprintf("/api/v1/workspaces/%s/projects/%s/modules/%s/module-issues/", planeWorkspaceSlug, planeProjectId, moduleID)
  80. resp, err := planeHttpGet(path)
  81. if err != nil {
  82. zap.L().Error("[Plane] ListModuleIssues 请求失败", zap.Error(err))
  83. return nil, err
  84. }
  85. if !isSuccess(resp.StatusCode) {
  86. zap.L().Error("[Plane] ListModuleIssues 返回错误", zap.String("status", resp.Status))
  87. return nil, fmt.Errorf("ListModuleIssues 失败: %s", resp.Status)
  88. }
  89. return resp.Body, nil
  90. }
  91. // AddIssuesToModule 添加工作项到模块
  92. func AddIssuesToModule(moduleID string, issueIDs []string) ([]byte, error) {
  93. path := fmt.Sprintf("/api/v1/workspaces/%s/projects/%s/modules/%s/module-issues/", planeWorkspaceSlug, planeProjectId, moduleID)
  94. payload := map[string]interface{}{"issues": issueIDs}
  95. resp, err := planeHttpPost(path, payload)
  96. if err != nil {
  97. zap.L().Error("[Plane] AddIssuesToModule 请求失败", zap.Error(err))
  98. return nil, err
  99. }
  100. if !isSuccess(resp.StatusCode) {
  101. zap.L().Error("[Plane] AddIssuesToModule 返回错误", zap.String("status", resp.Status), zap.String("body", string(resp.Body)))
  102. return nil, fmt.Errorf("AddIssuesToModule 失败: %s", resp.Status)
  103. }
  104. return resp.Body, nil
  105. }
  106. // RemoveIssueFromModule 从模块移除工作项
  107. func RemoveIssueFromModule(moduleID, issueID string) error {
  108. path := fmt.Sprintf("/api/v1/workspaces/%s/projects/%s/modules/%s/module-issues/%s/", planeWorkspaceSlug, planeProjectId, moduleID, issueID)
  109. resp, err := planeHttpDelete(path)
  110. if err != nil {
  111. zap.L().Error("[Plane] RemoveIssueFromModule 请求失败", zap.Error(err))
  112. return err
  113. }
  114. if resp.StatusCode != 204 {
  115. zap.L().Error("[Plane] RemoveIssueFromModule 返回错误", zap.String("status", resp.Status))
  116. return fmt.Errorf("RemoveIssueFromModule 失败: %s", resp.Status)
  117. }
  118. return nil
  119. }
  120. // ArchiveModule 归档模块
  121. func ArchiveModule(moduleID string) error {
  122. path := fmt.Sprintf("/api/v1/workspaces/%s/projects/%s/modules/%s/archive/", planeWorkspaceSlug, planeProjectId, moduleID)
  123. resp, err := planeHttpPost(path, map[string]interface{}{})
  124. if err != nil {
  125. zap.L().Error("[Plane] ArchiveModule 请求失败", zap.Error(err))
  126. return err
  127. }
  128. if !isSuccess(resp.StatusCode) {
  129. zap.L().Error("[Plane] ArchiveModule 返回错误", zap.String("status", resp.Status))
  130. return fmt.Errorf("ArchiveModule 失败: %s", resp.Status)
  131. }
  132. return nil
  133. }