plane_state.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package plane_v2
  2. import (
  3. "fmt"
  4. "go.uber.org/zap"
  5. )
  6. // ==================== State API ====================
  7. // ListStates 列出状态
  8. func ListStates(slug, projectID string) ([]byte, error) {
  9. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/states/", slug, projectID)
  10. resp, err := planeWebGet(url)
  11. if err != nil {
  12. zap.L().Error("[PlaneWeb] ListStates 请求失败", zap.Error(err))
  13. return nil, err
  14. }
  15. if !isWebSuccess(resp.StatusCode) {
  16. zap.L().Error("[PlaneWeb] ListStates 返回错误", zap.String("status", resp.Status))
  17. return nil, fmt.Errorf("ListStates 失败: %s", resp.Status)
  18. }
  19. return resp.Body, nil
  20. }
  21. // CreateState 创建状态
  22. // group: backlog / unstarted / started / completed / cancelled
  23. func CreateState(slug, projectID, name, color, group string) ([]byte, error) {
  24. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/states/", slug, projectID)
  25. payload := map[string]interface{}{
  26. "name": name,
  27. "color": color,
  28. "group": group,
  29. }
  30. resp, err := planeWebPost(url, payload)
  31. if err != nil {
  32. zap.L().Error("[PlaneWeb] CreateState 请求失败", zap.Error(err))
  33. return nil, err
  34. }
  35. if resp.StatusCode != 201 {
  36. zap.L().Error("[PlaneWeb] CreateState 返回错误",
  37. zap.String("status", resp.Status),
  38. zap.String("body", string(resp.Body)),
  39. )
  40. return nil, fmt.Errorf("CreateState 失败: %s", resp.Status)
  41. }
  42. return resp.Body, nil
  43. }
  44. // GetState 获取状态详情
  45. func GetState(slug, projectID, stateID string) ([]byte, error) {
  46. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/states/%s/", slug, projectID, stateID)
  47. resp, err := planeWebGet(url)
  48. if err != nil {
  49. zap.L().Error("[PlaneWeb] GetState 请求失败", zap.Error(err))
  50. return nil, err
  51. }
  52. if !isWebSuccess(resp.StatusCode) {
  53. zap.L().Error("[PlaneWeb] GetState 返回错误", zap.String("status", resp.Status))
  54. return nil, fmt.Errorf("GetState 失败: %s", resp.Status)
  55. }
  56. return resp.Body, nil
  57. }
  58. // UpdateState 更新状态
  59. func UpdateState(slug, projectID, stateID string, data map[string]interface{}) ([]byte, error) {
  60. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/states/%s/", slug, projectID, stateID)
  61. resp, err := planeWebPatch(url, data)
  62. if err != nil {
  63. zap.L().Error("[PlaneWeb] UpdateState 请求失败", zap.Error(err))
  64. return nil, err
  65. }
  66. if !isWebSuccess(resp.StatusCode) {
  67. zap.L().Error("[PlaneWeb] UpdateState 返回错误",
  68. zap.String("status", resp.Status),
  69. zap.String("body", string(resp.Body)),
  70. )
  71. return nil, fmt.Errorf("UpdateState 失败: %s", resp.Status)
  72. }
  73. return resp.Body, nil
  74. }
  75. // DeleteState 删除状态
  76. func DeleteState(slug, projectID, stateID string) error {
  77. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/states/%s/", slug, projectID, stateID)
  78. resp, err := planeWebDelete(url)
  79. if err != nil {
  80. zap.L().Error("[PlaneWeb] DeleteState 请求失败", zap.Error(err))
  81. return err
  82. }
  83. if resp.StatusCode != 204 {
  84. zap.L().Error("[PlaneWeb] DeleteState 返回错误", zap.String("status", resp.Status))
  85. return fmt.Errorf("DeleteState 失败: %s", resp.Status)
  86. }
  87. return nil
  88. }
  89. // MarkStateDefault 设为默认状态
  90. func MarkStateDefault(slug, projectID, stateID string) error {
  91. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/states/%s/mark-default/", slug, projectID, stateID)
  92. resp, err := planeWebPost(url, map[string]interface{}{})
  93. if err != nil {
  94. zap.L().Error("[PlaneWeb] MarkStateDefault 请求失败", zap.Error(err))
  95. return err
  96. }
  97. if !isWebSuccess(resp.StatusCode) {
  98. zap.L().Error("[PlaneWeb] MarkStateDefault 返回错误", zap.String("status", resp.Status))
  99. return fmt.Errorf("MarkStateDefault 失败: %s", resp.Status)
  100. }
  101. return nil
  102. }
  103. // ListCurrentStates 列出当前项目下的状态
  104. func ListCurrentStates() ([]byte, error) {
  105. return ListStates(webWorkspaceSlug, webProjectId)
  106. }