plane_relation.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package plane_v1
  2. import (
  3. "fmt"
  4. "go.uber.org/zap"
  5. )
  6. // ==================== Work Item Relation API ====================
  7. // ListWorkItemRelations 列出工作项关系
  8. func ListWorkItemRelations(workItemID string) ([]byte, error) {
  9. path := fmt.Sprintf("/api/v1/workspaces/%s/projects/%s/work-items/%s/relations/", planeWorkspaceSlug, planeProjectId, workItemID)
  10. resp, err := planeHttpGet(path)
  11. if err != nil {
  12. zap.L().Error("[Plane] ListWorkItemRelations 请求失败", zap.Error(err))
  13. return nil, err
  14. }
  15. if !isSuccess(resp.StatusCode) {
  16. zap.L().Error("[Plane] ListWorkItemRelations 返回错误", zap.String("status", resp.Status))
  17. return nil, fmt.Errorf("ListWorkItemRelations 失败: %s", resp.Status)
  18. }
  19. return resp.Body, nil
  20. }
  21. // CreateWorkItemRelation 创建工作项关系
  22. // relationType: blocking / blocked_by / duplicate / relates_to / start_before / start_after / finish_before / finish_after
  23. func CreateWorkItemRelation(workItemID, relationType string, targetIDs []string) ([]byte, error) {
  24. path := fmt.Sprintf("/api/v1/workspaces/%s/projects/%s/work-items/%s/relations/", planeWorkspaceSlug, planeProjectId, workItemID)
  25. payload := map[string]interface{}{
  26. "relation_type": relationType,
  27. "issues": targetIDs,
  28. }
  29. resp, err := planeHttpPost(path, payload)
  30. if err != nil {
  31. zap.L().Error("[Plane] CreateWorkItemRelation 请求失败", zap.Error(err))
  32. return nil, err
  33. }
  34. if resp.StatusCode != 201 {
  35. zap.L().Error("[Plane] CreateWorkItemRelation 返回错误", zap.String("status", resp.Status), zap.String("body", string(resp.Body)))
  36. return nil, fmt.Errorf("CreateWorkItemRelation 失败: %s", resp.Status)
  37. }
  38. return resp.Body, nil
  39. }