plane_link.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package plane_v2
  2. import (
  3. "fmt"
  4. "go.uber.org/zap"
  5. )
  6. // ==================== Issue Link API ====================
  7. // ListIssueLinks 列出工作项链接
  8. func ListIssueLinks(slug, projectID, issueID string) ([]byte, error) {
  9. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/issue-links/", slug, projectID, issueID)
  10. resp, err := planeWebGet(url)
  11. if err != nil {
  12. zap.L().Error("[PlaneWeb] ListIssueLinks 请求失败", zap.Error(err))
  13. return nil, err
  14. }
  15. if !isWebSuccess(resp.StatusCode) {
  16. zap.L().Error("[PlaneWeb] ListIssueLinks 返回错误", zap.String("status", resp.Status))
  17. return nil, fmt.Errorf("ListIssueLinks 失败: %s", resp.Status)
  18. }
  19. return resp.Body, nil
  20. }
  21. // CreateIssueLink 创建工作项链接
  22. func CreateIssueLink(slug, projectID, issueID, linkURL, title string) ([]byte, error) {
  23. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/issue-links/", slug, projectID, issueID)
  24. payload := map[string]interface{}{
  25. "url": linkURL,
  26. "title": title,
  27. }
  28. resp, err := planeWebPost(url, payload)
  29. if err != nil {
  30. zap.L().Error("[PlaneWeb] CreateIssueLink 请求失败", zap.Error(err))
  31. return nil, err
  32. }
  33. if resp.StatusCode != 201 {
  34. zap.L().Error("[PlaneWeb] CreateIssueLink 返回错误",
  35. zap.String("status", resp.Status),
  36. zap.String("body", string(resp.Body)),
  37. )
  38. return nil, fmt.Errorf("CreateIssueLink 失败: %s", resp.Status)
  39. }
  40. return resp.Body, nil
  41. }
  42. // UpdateIssueLink 更新工作项链接
  43. func UpdateIssueLink(slug, projectID, issueID, linkID string, data map[string]interface{}) ([]byte, error) {
  44. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/issue-links/%s/", slug, projectID, issueID, linkID)
  45. resp, err := planeWebPatch(url, data)
  46. if err != nil {
  47. zap.L().Error("[PlaneWeb] UpdateIssueLink 请求失败", zap.Error(err))
  48. return nil, err
  49. }
  50. if !isWebSuccess(resp.StatusCode) {
  51. zap.L().Error("[PlaneWeb] UpdateIssueLink 返回错误",
  52. zap.String("status", resp.Status),
  53. zap.String("body", string(resp.Body)),
  54. )
  55. return nil, fmt.Errorf("UpdateIssueLink 失败: %s", resp.Status)
  56. }
  57. return resp.Body, nil
  58. }
  59. // DeleteIssueLink 删除工作项链接
  60. func DeleteIssueLink(slug, projectID, issueID, linkID string) error {
  61. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/issue-links/%s/", slug, projectID, issueID, linkID)
  62. resp, err := planeWebDelete(url)
  63. if err != nil {
  64. zap.L().Error("[PlaneWeb] DeleteIssueLink 请求失败", zap.Error(err))
  65. return err
  66. }
  67. if resp.StatusCode != 204 {
  68. zap.L().Error("[PlaneWeb] DeleteIssueLink 返回错误", zap.String("status", resp.Status))
  69. return fmt.Errorf("DeleteIssueLink 失败: %s", resp.Status)
  70. }
  71. return nil
  72. }