plane_member.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package plane_v2
  2. import (
  3. "fmt"
  4. "go.uber.org/zap"
  5. )
  6. // ==================== Member API ====================
  7. // Member 角色常量
  8. const (
  9. RoleAdmin = 20
  10. RoleMember = 15
  11. RoleGuest = 5
  12. )
  13. // ListWorkspaceMembers 列出工作空间成员
  14. func ListWorkspaceMembers(slug string) ([]byte, error) {
  15. url := fmt.Sprintf("/api/workspaces/%s/members/", slug)
  16. resp, err := planeWebGet(url)
  17. if err != nil {
  18. zap.L().Error("[PlaneWeb] ListWorkspaceMembers 请求失败", zap.Error(err))
  19. return nil, err
  20. }
  21. if !isWebSuccess(resp.StatusCode) {
  22. zap.L().Error("[PlaneWeb] ListWorkspaceMembers 返回错误", zap.String("status", resp.Status))
  23. return nil, fmt.Errorf("ListWorkspaceMembers 失败: %s", resp.Status)
  24. }
  25. return resp.Body, nil
  26. }
  27. // GetWorkspaceMember 获取工作空间成员详情
  28. func GetWorkspaceMember(slug, memberID string) ([]byte, error) {
  29. url := fmt.Sprintf("/api/workspaces/%s/members/%s/", slug, memberID)
  30. resp, err := planeWebGet(url)
  31. if err != nil {
  32. zap.L().Error("[PlaneWeb] GetWorkspaceMember 请求失败", zap.Error(err))
  33. return nil, err
  34. }
  35. if !isWebSuccess(resp.StatusCode) {
  36. zap.L().Error("[PlaneWeb] GetWorkspaceMember 返回错误", zap.String("status", resp.Status))
  37. return nil, fmt.Errorf("GetWorkspaceMember 失败: %s", resp.Status)
  38. }
  39. return resp.Body, nil
  40. }
  41. // UpdateWorkspaceMemberRole 更新工作空间成员角色
  42. func UpdateWorkspaceMemberRole(slug, memberID string, role int) ([]byte, error) {
  43. url := fmt.Sprintf("/api/workspaces/%s/members/%s/", slug, memberID)
  44. payload := map[string]interface{}{
  45. "role": role,
  46. }
  47. resp, err := planeWebPatch(url, payload)
  48. if err != nil {
  49. zap.L().Error("[PlaneWeb] UpdateWorkspaceMemberRole 请求失败", zap.Error(err))
  50. return nil, err
  51. }
  52. if !isWebSuccess(resp.StatusCode) {
  53. zap.L().Error("[PlaneWeb] UpdateWorkspaceMemberRole 返回错误",
  54. zap.String("status", resp.Status),
  55. zap.String("body", string(resp.Body)),
  56. )
  57. return nil, fmt.Errorf("UpdateWorkspaceMemberRole 失败: %s", resp.Status)
  58. }
  59. return resp.Body, nil
  60. }
  61. // RemoveWorkspaceMember 移除工作空间成员
  62. func RemoveWorkspaceMember(slug, memberID string) error {
  63. url := fmt.Sprintf("/api/workspaces/%s/members/%s/", slug, memberID)
  64. resp, err := planeWebDelete(url)
  65. if err != nil {
  66. zap.L().Error("[PlaneWeb] RemoveWorkspaceMember 请求失败", zap.Error(err))
  67. return err
  68. }
  69. if resp.StatusCode != 204 {
  70. zap.L().Error("[PlaneWeb] RemoveWorkspaceMember 返回错误", zap.String("status", resp.Status))
  71. return fmt.Errorf("RemoveWorkspaceMember 失败: %s", resp.Status)
  72. }
  73. return nil
  74. }
  75. // ListProjectMembers 列出项目成员
  76. func ListProjectMembers(slug, projectID string) ([]byte, error) {
  77. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/members/", slug, projectID)
  78. resp, err := planeWebGet(url)
  79. if err != nil {
  80. zap.L().Error("[PlaneWeb] ListProjectMembers 请求失败", zap.Error(err))
  81. return nil, err
  82. }
  83. if !isWebSuccess(resp.StatusCode) {
  84. zap.L().Error("[PlaneWeb] ListProjectMembers 返回错误", zap.String("status", resp.Status))
  85. return nil, fmt.Errorf("ListProjectMembers 失败: %s", resp.Status)
  86. }
  87. return resp.Body, nil
  88. }
  89. // AddProjectMember 添加项目成员
  90. func AddProjectMember(slug, projectID, memberID string, role int) ([]byte, error) {
  91. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/members/", slug, projectID)
  92. payload := map[string]interface{}{
  93. "members": []map[string]interface{}{
  94. {"member_id": memberID, "role": role},
  95. },
  96. }
  97. resp, err := planeWebPost(url, payload)
  98. if err != nil {
  99. zap.L().Error("[PlaneWeb] AddProjectMember 请求失败", zap.Error(err))
  100. return nil, err
  101. }
  102. if resp.StatusCode != 201 {
  103. zap.L().Error("[PlaneWeb] AddProjectMember 返回错误",
  104. zap.String("status", resp.Status),
  105. zap.String("body", string(resp.Body)),
  106. )
  107. return nil, fmt.Errorf("AddProjectMember 失败: %s", resp.Status)
  108. }
  109. return resp.Body, nil
  110. }
  111. // GetProjectMember 获取项目成员详情
  112. func GetProjectMember(slug, projectID, memberID string) ([]byte, error) {
  113. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/members/%s/", slug, projectID, memberID)
  114. resp, err := planeWebGet(url)
  115. if err != nil {
  116. zap.L().Error("[PlaneWeb] GetProjectMember 请求失败", zap.Error(err))
  117. return nil, err
  118. }
  119. if !isWebSuccess(resp.StatusCode) {
  120. zap.L().Error("[PlaneWeb] GetProjectMember 返回错误", zap.String("status", resp.Status))
  121. return nil, fmt.Errorf("GetProjectMember 失败: %s", resp.Status)
  122. }
  123. return resp.Body, nil
  124. }
  125. // UpdateProjectMemberRole 更新项目成员角色
  126. func UpdateProjectMemberRole(slug, projectID, memberID string, role int) ([]byte, error) {
  127. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/members/%s/", slug, projectID, memberID)
  128. payload := map[string]interface{}{
  129. "role": role,
  130. }
  131. resp, err := planeWebPatch(url, payload)
  132. if err != nil {
  133. zap.L().Error("[PlaneWeb] UpdateProjectMemberRole 请求失败", zap.Error(err))
  134. return nil, err
  135. }
  136. if !isWebSuccess(resp.StatusCode) {
  137. zap.L().Error("[PlaneWeb] UpdateProjectMemberRole 返回错误",
  138. zap.String("status", resp.Status),
  139. zap.String("body", string(resp.Body)),
  140. )
  141. return nil, fmt.Errorf("UpdateProjectMemberRole 失败: %s", resp.Status)
  142. }
  143. return resp.Body, nil
  144. }
  145. // RemoveProjectMember 移除项目成员
  146. func RemoveProjectMember(slug, projectID, memberID string) error {
  147. url := fmt.Sprintf("/api/workspaces/%s/projects/%s/members/%s/", slug, projectID, memberID)
  148. resp, err := planeWebDelete(url)
  149. if err != nil {
  150. zap.L().Error("[PlaneWeb] RemoveProjectMember 请求失败", zap.Error(err))
  151. return err
  152. }
  153. if resp.StatusCode != 204 {
  154. zap.L().Error("[PlaneWeb] RemoveProjectMember 返回错误", zap.String("status", resp.Status))
  155. return fmt.Errorf("RemoveProjectMember 失败: %s", resp.Status)
  156. }
  157. return nil
  158. }
  159. // GetCurrentUser 获取当前用户信息
  160. func GetCurrentUser() ([]byte, error) {
  161. resp, err := planeWebGet("/api/users/me/")
  162. if err != nil {
  163. zap.L().Error("[PlaneWeb] GetCurrentUser 请求失败", zap.Error(err))
  164. return nil, err
  165. }
  166. if !isWebSuccess(resp.StatusCode) {
  167. zap.L().Error("[PlaneWeb] GetCurrentUser 返回错误", zap.String("status", resp.Status))
  168. return nil, fmt.Errorf("GetCurrentUser 失败: %s", resp.Status)
  169. }
  170. return resp.Body, nil
  171. }
  172. // UpdateCurrentUser 更新当前用户信息
  173. func UpdateCurrentUser(data map[string]interface{}) ([]byte, error) {
  174. resp, err := planeWebPatch("/api/users/me/", data)
  175. if err != nil {
  176. zap.L().Error("[PlaneWeb] UpdateCurrentUser 请求失败", zap.Error(err))
  177. return nil, err
  178. }
  179. if !isWebSuccess(resp.StatusCode) {
  180. zap.L().Error("[PlaneWeb] UpdateCurrentUser 返回错误",
  181. zap.String("status", resp.Status),
  182. zap.String("body", string(resp.Body)),
  183. )
  184. return nil, fmt.Errorf("UpdateCurrentUser 失败: %s", resp.Status)
  185. }
  186. return resp.Body, nil
  187. }
  188. // ListCurrentWorkspaceMembers 列出当前工作空间的成员
  189. func ListCurrentWorkspaceMembers() ([]byte, error) {
  190. return ListWorkspaceMembers(webWorkspaceSlug)
  191. }
  192. // ListCurrentProjectMembers 列出当前项目的成员
  193. func ListCurrentProjectMembers() ([]byte, error) {
  194. return ListProjectMembers(webWorkspaceSlug, webProjectId)
  195. }