package plane_v2_api import ( "fmt" plane "fwh-toolbox-server/repositories/api/plane_v2" "go.uber.org/zap" ) // ListIssues 列出项目工作项 func ListIssues(c *plane.PlaneClient, slug, projectID string) ([]byte, error) { url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/", slug, projectID) resp, err := c.Get(url) if err != nil { zap.L().Error("[PlaneAPI] ListIssues 请求失败", zap.Error(err)) return nil, err } if !plane.IsSuccess(resp.StatusCode) { return nil, fmt.Errorf("ListIssues 失败: %s", resp.Status) } return resp.Body, nil } // CreateIssue 创建工作项 func CreateIssue(c *plane.PlaneClient, slug, projectID string, data map[string]interface{}) ([]byte, error) { url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/", slug, projectID) resp, err := c.Post(url, data) if err != nil { zap.L().Error("[PlaneAPI] CreateIssue 请求失败", zap.Error(err)) return nil, err } if !plane.IsSuccess(resp.StatusCode) { return nil, fmt.Errorf("CreateIssue 失败: %s, body=%s", resp.Status, string(resp.Body)) } return resp.Body, nil } // GetIssue 获取工作项详情 func GetIssue(c *plane.PlaneClient, slug, projectID, issueID string) ([]byte, error) { url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/", slug, projectID, issueID) resp, err := c.Get(url) if err != nil { zap.L().Error("[PlaneAPI] GetIssue 请求失败", zap.Error(err)) return nil, err } if !plane.IsSuccess(resp.StatusCode) { return nil, fmt.Errorf("GetIssue 失败: %s", resp.Status) } return resp.Body, nil } // UpdateIssue 更新工作项 func UpdateIssue(c *plane.PlaneClient, slug, projectID, issueID string, data map[string]interface{}) ([]byte, error) { url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/", slug, projectID, issueID) resp, err := c.Patch(url, data) if err != nil { zap.L().Error("[PlaneAPI] UpdateIssue 请求失败", zap.Error(err)) return nil, err } if !plane.IsSuccess(resp.StatusCode) { return nil, fmt.Errorf("UpdateIssue 失败: %s, body=%s", resp.Status, string(resp.Body)) } return resp.Body, nil } // DeleteIssue 删除工作项 func DeleteIssue(c *plane.PlaneClient, slug, projectID, issueID string) error { url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/", slug, projectID, issueID) resp, err := c.Delete(url) if err != nil { zap.L().Error("[PlaneAPI] DeleteIssue 请求失败", zap.Error(err)) return err } if resp.StatusCode != 204 { return fmt.Errorf("DeleteIssue 失败: %s", resp.Status) } return nil } // GetSubIssues 获取子工作项 func GetSubIssues(c *plane.PlaneClient, slug, projectID, issueID string) ([]byte, error) { url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/sub-issues/", slug, projectID, issueID) resp, err := c.Get(url) if err != nil { zap.L().Error("[PlaneAPI] GetSubIssues 请求失败", zap.Error(err)) return nil, err } if !plane.IsSuccess(resp.StatusCode) { return nil, fmt.Errorf("GetSubIssues 失败: %s", resp.Status) } return resp.Body, nil } // ArchiveIssue 归档工作项 func ArchiveIssue(c *plane.PlaneClient, slug, projectID, issueID string) error { url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/archive/", slug, projectID, issueID) resp, err := c.Post(url, nil) if err != nil { zap.L().Error("[PlaneAPI] ArchiveIssue 请求失败", zap.Error(err)) return err } if !plane.IsSuccess(resp.StatusCode) { return fmt.Errorf("ArchiveIssue 失败: %s", resp.Status) } return nil } // UnarchiveIssue 取消归档工作项 func UnarchiveIssue(c *plane.PlaneClient, slug, projectID, issueID string) error { url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/archive/", slug, projectID, issueID) resp, err := c.Delete(url) if err != nil { zap.L().Error("[PlaneAPI] UnarchiveIssue 请求失败", zap.Error(err)) return err } if !plane.IsSuccess(resp.StatusCode) { return fmt.Errorf("UnarchiveIssue 失败: %s", resp.Status) } return nil } // GetIssueActivity 获取工作项活动历史 func GetIssueActivity(c *plane.PlaneClient, slug, projectID, issueID string) ([]byte, error) { url := fmt.Sprintf("/api/workspaces/%s/projects/%s/issues/%s/history/?activity_type=issue-property", slug, projectID, issueID) resp, err := c.Get(url) if err != nil { zap.L().Error("[PlaneAPI] GetIssueActivity 请求失败", zap.Error(err)) return nil, err } if !plane.IsSuccess(resp.StatusCode) { return nil, fmt.Errorf("GetIssueActivity 失败: %s", resp.Status) } return resp.Body, nil }