intake.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package plane_v2_api
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. plane "fwh-toolbox-server/repositories/api/plane_v2"
  6. "go.uber.org/zap"
  7. )
  8. // ListIntakeIssues 列出收件箱工作项
  9. func ListIntakeIssues(c *plane.PlaneClient, slug, projectID, status string) ([]byte, error) {
  10. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/intake-issues/", slug, projectID)
  11. if status != "" {
  12. url += "?status=" + status
  13. }
  14. resp, err := c.Get(url)
  15. if err != nil {
  16. zap.L().Error("[PlaneAPI] ListIntakeIssues 请求失败", zap.Error(err))
  17. return nil, err
  18. }
  19. if !plane.IsSuccess(resp.StatusCode) {
  20. return nil, fmt.Errorf("ListIntakeIssues 失败: %s", resp.Status)
  21. }
  22. return resp.Body, nil
  23. }
  24. // CreateIntakeIssue 创建收件箱工作项
  25. func CreateIntakeIssue(c *plane.PlaneClient, slug, projectID string, issue plane.IntakeIssueRequest) (*plane.IntakeIssueResponse, error) {
  26. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/intake-issues/", slug, projectID)
  27. payload := map[string]any{
  28. "source": "IN_APP",
  29. "issue": issue,
  30. }
  31. resp, err := c.Post(url, payload)
  32. if err != nil {
  33. zap.L().Error("[PlaneAPI] CreateIntakeIssue 请求失败", zap.Error(err))
  34. return nil, err
  35. }
  36. if !plane.IsSuccess(resp.StatusCode) {
  37. return nil, fmt.Errorf("CreateIntakeIssue 失败: %s, body=%s", resp.Status, string(resp.Body))
  38. }
  39. var result plane.IntakeIssueResponse
  40. if err := json.Unmarshal(resp.Body, &result); err != nil {
  41. return nil, fmt.Errorf("响应解析失败: %w", err)
  42. }
  43. return &result, nil
  44. }
  45. // GetIntakeIssue 获取收件箱工作项详情
  46. func GetIntakeIssue(c *plane.PlaneClient, slug, projectID, issueID string) ([]byte, error) {
  47. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/intake-issues/%s/?expand=issue_inbox", slug, projectID, issueID)
  48. resp, err := c.Get(url)
  49. if err != nil {
  50. return nil, err
  51. }
  52. if !plane.IsSuccess(resp.StatusCode) {
  53. return nil, fmt.Errorf("GetIntakeIssue 失败: %s", resp.Status)
  54. }
  55. return resp.Body, nil
  56. }
  57. // UpdateIntakeIssue 更新收件箱工作项
  58. func UpdateIntakeIssue(c *plane.PlaneClient, slug, projectID, issueID string, data map[string]any) ([]byte, error) {
  59. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/intake-issues/%s/", slug, projectID, issueID)
  60. resp, err := c.Patch(url, data)
  61. if err != nil {
  62. return nil, err
  63. }
  64. if !plane.IsSuccess(resp.StatusCode) {
  65. return nil, fmt.Errorf("UpdateIntakeIssue 失败: %s", resp.Status)
  66. }
  67. return resp.Body, nil
  68. }
  69. // AcceptIntakeIssue 接受收件箱工作项
  70. func AcceptIntakeIssue(c *plane.PlaneClient, slug, projectID, issueID string) ([]byte, error) {
  71. return UpdateIntakeIssue(c, slug, projectID, issueID, map[string]any{"status": 1})
  72. }
  73. // RejectIntakeIssue 拒绝收件箱工作项
  74. func RejectIntakeIssue(c *plane.PlaneClient, slug, projectID, issueID string) ([]byte, error) {
  75. return UpdateIntakeIssue(c, slug, projectID, issueID, map[string]any{"status": -1})
  76. }
  77. // DeleteIntakeIssue 删除收件箱工作项
  78. func DeleteIntakeIssue(c *plane.PlaneClient, slug, projectID, issueID string) error {
  79. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/intake-issues/%s/", slug, projectID, issueID)
  80. resp, err := c.Delete(url)
  81. if err != nil {
  82. return err
  83. }
  84. if resp.StatusCode != 204 {
  85. return fmt.Errorf("DeleteIntakeIssue 失败: %s", resp.Status)
  86. }
  87. return nil
  88. }