in backend/plugins/github_graphql/tasks/issue_collector.go [86:197]
func CollectIssue(taskCtx plugin.SubTaskContext) errors.Error {
db := taskCtx.GetDal()
data := taskCtx.GetData().(*githubTasks.GithubTaskData)
config := data.Options.ScopeConfig
issueRegexes, err := githubTasks.NewIssueRegexes(config)
if err != nil {
return nil
}
milestoneMap, err := getMilestoneMap(db, data.Options.GithubId, data.Options.ConnectionId)
if err != nil {
return nil
}
collectorWithState, err := helper.NewStatefulApiCollector(helper.RawDataSubTaskArgs{
Ctx: taskCtx,
Params: githubTasks.GithubApiParams{
ConnectionId: data.Options.ConnectionId,
Name: data.Options.Name,
},
Table: RAW_ISSUES_TABLE,
}, data.TimeAfter)
if err != nil {
return err
}
incremental := collectorWithState.IsIncremental()
err = collectorWithState.InitGraphQLCollector(helper.GraphqlCollectorArgs{
GraphqlClient: data.GraphqlClient,
PageSize: 100,
Incremental: incremental,
BuildQuery: func(reqData *helper.GraphqlRequestData) (interface{}, map[string]interface{}, error) {
query := &GraphqlQueryIssueWrapper{}
if reqData == nil {
return query, map[string]interface{}{}, nil
}
since := helper.DateTime{}
if incremental {
since = helper.DateTime{Time: *collectorWithState.LatestState.LatestSuccessStart}
} else if collectorWithState.TimeAfter != nil {
since = helper.DateTime{Time: *collectorWithState.TimeAfter}
}
ownerName := strings.Split(data.Options.Name, "/")
variables := map[string]interface{}{
"since": since,
"pageSize": graphql.Int(reqData.Pager.Size),
"skipCursor": (*graphql.String)(reqData.Pager.SkipCursor),
"owner": graphql.String(ownerName[0]),
"name": graphql.String(ownerName[1]),
}
return query, variables, nil
},
GetPageInfo: func(iQuery interface{}, args *helper.GraphqlCollectorArgs) (*helper.GraphqlQueryPageInfo, error) {
query := iQuery.(*GraphqlQueryIssueWrapper)
return query.Repository.IssueList.PageInfo, nil
},
ResponseParser: func(iQuery interface{}, variables map[string]interface{}) ([]interface{}, error) {
query := iQuery.(*GraphqlQueryIssueWrapper)
issues := query.Repository.IssueList.Issues
results := make([]interface{}, 0, 1)
isFinish := false
for _, issue := range issues {
githubIssue, err := convertGithubIssue(milestoneMap, issue, data.Options.ConnectionId, data.Options.GithubId)
if err != nil {
return nil, err
}
githubLabels, err := convertGithubLabels(issueRegexes, issue, githubIssue)
if err != nil {
return nil, err
}
results = append(results, githubLabels...)
results = append(results, githubIssue)
if issue.AssigneeList.Assignees != nil && len(issue.AssigneeList.Assignees) > 0 {
relatedUser, err := convertGraphqlPreAccount(issue.AssigneeList.Assignees[0], data.Options.GithubId, data.Options.ConnectionId)
if err != nil {
return nil, err
}
results = append(results, relatedUser)
}
if issue.Author != nil {
relatedUser, err := convertGraphqlPreAccount(*issue.Author, data.Options.GithubId, data.Options.ConnectionId)
if err != nil {
return nil, err
}
results = append(results, relatedUser)
}
for _, assignee := range issue.AssigneeList.Assignees {
issueAssignee := &models.GithubIssueAssignee{
ConnectionId: githubIssue.ConnectionId,
IssueId: githubIssue.GithubId,
RepoId: githubIssue.RepoId,
AssigneeId: assignee.Id,
AssigneeName: assignee.Login,
}
results = append(results, issueAssignee)
}
}
if isFinish {
return results, helper.ErrFinishCollect
} else {
return results, nil
}
},
})
if err != nil {
return err
}
return collectorWithState.Execute()
}