plane_relation.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package plane_v2
  2. import (
  3. "fmt"
  4. "go.uber.org/zap"
  5. )
  6. // ==================== Issue Relation API ====================
  7. // ListIssueRelations 列出工作项关系
  8. func ListIssueRelations(slug, projectID, issueID string) ([]byte, error) {
  9. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/issue-relation/", slug, projectID, issueID)
  10. resp, err := planeWebGet(url)
  11. if err != nil {
  12. zap.L().Error("[PlaneWeb] ListIssueRelations 请求失败", zap.Error(err))
  13. return nil, err
  14. }
  15. if !isWebSuccess(resp.StatusCode) {
  16. zap.L().Error("[PlaneWeb] ListIssueRelations 返回错误", zap.String("status", resp.Status))
  17. return nil, fmt.Errorf("ListIssueRelations 失败: %s", resp.Status)
  18. }
  19. return resp.Body, nil
  20. }
  21. // CreateIssueRelation 创建工作项关系
  22. // relationType: blocking / blocked_by / duplicate / relates_to / start_before / start_after / finish_before / finish_after
  23. func CreateIssueRelation(slug, projectID, issueID, relationType string, relatedIDs []string) ([]byte, error) {
  24. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/issue-relation/", slug, projectID, issueID)
  25. payload := map[string]interface{}{
  26. "relation_type": relationType,
  27. "related_list": relatedIDs,
  28. }
  29. resp, err := planeWebPost(url, payload)
  30. if err != nil {
  31. zap.L().Error("[PlaneWeb] CreateIssueRelation 请求失败", zap.Error(err))
  32. return nil, err
  33. }
  34. if resp.StatusCode != 201 {
  35. zap.L().Error("[PlaneWeb] CreateIssueRelation 返回错误",
  36. zap.String("status", resp.Status),
  37. zap.String("body", string(resp.Body)),
  38. )
  39. return nil, fmt.Errorf("CreateIssueRelation 失败: %s", resp.Status)
  40. }
  41. return resp.Body, nil
  42. }
  43. // RemoveIssueRelation 移除工作项关系
  44. func RemoveIssueRelation(slug, projectID, issueID, relationType, relatedID string) error {
  45. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/remove-relation/", slug, projectID, issueID)
  46. payload := map[string]interface{}{
  47. "relation_type": relationType,
  48. "related_list": []string{relatedID},
  49. }
  50. resp, err := planeWebPost(url, payload)
  51. if err != nil {
  52. zap.L().Error("[PlaneWeb] RemoveIssueRelation 请求失败", zap.Error(err))
  53. return err
  54. }
  55. if resp.StatusCode != 204 {
  56. zap.L().Error("[PlaneWeb] RemoveIssueRelation 返回错误", zap.String("status", resp.Status))
  57. return fmt.Errorf("RemoveIssueRelation 失败: %s", resp.Status)
  58. }
  59. return nil
  60. }