in backend/plugins/github/tasks/pr_extractor.go [77:172]
func ExtractApiPullRequests(taskCtx plugin.SubTaskContext) errors.Error {
data := taskCtx.GetData().(*GithubTaskData)
config := data.Options.ScopeConfig
var labelTypeRegex *regexp.Regexp
var labelComponentRegex *regexp.Regexp
var prType = config.PrType
var err error
if len(prType) > 0 {
labelTypeRegex, err = regexp.Compile(prType)
if err != nil {
return errors.Default.Wrap(err, "regexp Compile prType failed")
}
}
var prComponent = config.PrComponent
if len(prComponent) > 0 {
labelComponentRegex, err = regexp.Compile(prComponent)
if err != nil {
return errors.Default.Wrap(err, "regexp Compile prComponent failed")
}
}
extractor, err := api.NewApiExtractor(api.ApiExtractorArgs{
RawDataSubTaskArgs: api.RawDataSubTaskArgs{
Ctx: taskCtx,
/*
This struct will be JSONEncoded and stored into database along with raw data itself, to identity minimal
set of data to be process, for example, we process JiraIssues by Board
*/
Params: GithubApiParams{
ConnectionId: data.Options.ConnectionId,
Name: data.Options.Name,
},
/*
Table store raw data
*/
Table: RAW_PULL_REQUEST_TABLE,
},
Extract: func(row *api.RawData) ([]interface{}, errors.Error) {
rawL := &GithubApiPullRequest{}
err := errors.Convert(json.Unmarshal(row.Data, rawL))
if err != nil {
return nil, err
}
// need to extract 2 kinds of entities here
results := make([]interface{}, 0, 1)
if rawL.GithubId == 0 {
return nil, nil
}
//If this is a pr, ignore
githubPr, err := convertGithubPullRequest(rawL, data.Options.ConnectionId, data.Options.GithubId)
if err != nil {
return nil, err
}
if rawL.User != nil {
githubUser, err := convertAccount(rawL.User, data.Options.GithubId, data.Options.ConnectionId)
if err != nil {
return nil, err
}
results = append(results, githubUser)
githubPr.AuthorName = githubUser.Login
githubPr.AuthorId = githubUser.AccountId
}
for _, label := range rawL.Labels {
results = append(results, &models.GithubPrLabel{
ConnectionId: data.Options.ConnectionId,
PullId: githubPr.GithubId,
LabelName: label.Name,
})
// if pr.Type has not been set and prType is set in .env, process the below
if labelTypeRegex != nil {
groups := labelTypeRegex.FindStringSubmatch(label.Name)
if len(groups) > 0 {
githubPr.Type = groups[1]
}
}
// if pr.Component has not been set and prComponent is set in .env, process
if labelComponentRegex != nil {
groups := labelComponentRegex.FindStringSubmatch(label.Name)
if len(groups) > 0 {
githubPr.Component = groups[1]
}
}
}
results = append(results, githubPr)
return results, nil
},
})
if err != nil {
return errors.Default.Wrap(err, "error initializing Github PR extractor")
}
return extractor.Execute()
}