func ExtractApiMergeRequests()

in backend/plugins/gitlab/tasks/mr_extractor.go [99:220]


func ExtractApiMergeRequests(subtaskCtx plugin.SubTaskContext) errors.Error {
	subtaskCommonArgs, data := CreateSubtaskCommonArgs(subtaskCtx, RAW_MERGE_REQUEST_TABLE)

	db := subtaskCtx.GetDal()
	config := data.Options.ScopeConfig
	var labelTypeRegex *regexp.Regexp
	var labelComponentRegex *regexp.Regexp
	var prType = config.PrType

	var err1 error
	if len(prType) > 0 {
		labelTypeRegex, err1 = regexp.Compile(prType)
		if err1 != nil {
			return errors.Default.Wrap(err1, "regexp Compile prType failed")
		}
	}
	var prComponent = config.PrComponent
	if len(prComponent) > 0 {
		labelComponentRegex, err1 = regexp.Compile(prComponent)
		if err1 != nil {
			return errors.Default.Wrap(err1, "regexp Compile prComponent failed")
		}
	}

	subtaskCommonArgs.SubtaskConfig = map[string]any{
		"prType":      prType,
		"prComponent": prComponent,
	}

	extractor, err := api.NewStatefulApiExtractor(&api.StatefulApiExtractorArgs[MergeRequestRes]{
		SubtaskCommonArgs: subtaskCommonArgs,
		BeforeExtract:     beforeExtractMr(db, data),
		Extract: func(mr *MergeRequestRes, row *api.RawData) ([]interface{}, errors.Error) {
			gitlabMergeRequest, err := convertMergeRequest(mr)
			if err != nil {
				return nil, err
			}

			// if we can not find merged_at and closed_at info in the detail
			// we need get detail for gitlab v11
			s := string(row.Data)
			if !strings.Contains(s, "\"merged_at\":") {
				if !strings.Contains(s, "\"closed_at\":") {
					gitlabMergeRequest.IsDetailRequired = true
				}
			}

			results := make([]interface{}, 0, len(mr.Reviewers)+len(mr.Labels)+1)
			gitlabMergeRequest.ConnectionId = data.Options.ConnectionId
			results = append(results, gitlabMergeRequest)
			err = db.Delete(
				&models.GitlabMrLabel{},
				dal.Where("connection_id = ? AND mr_id = ?", data.Options.ConnectionId, gitlabMergeRequest.GitlabId),
			)
			if err != nil {
				return nil, err
			}
			for _, label := range mr.Labels {
				results = append(results, &models.GitlabMrLabel{
					MrId:         gitlabMergeRequest.GitlabId,
					LabelName:    label,
					ConnectionId: data.Options.ConnectionId,
				})
				// if pr.Type has not been set and prType is set in .env, process the below
				if labelTypeRegex != nil && labelTypeRegex.MatchString(label) {
					gitlabMergeRequest.Type = label
				}
				// if pr.Component has not been set and prComponent is set in .env, process
				if labelComponentRegex != nil && labelComponentRegex.MatchString(label) {
					gitlabMergeRequest.Component = label
				}
			}
			err = db.Delete(
				&models.GitlabReviewer{},
				dal.Where("connection_id = ? AND merge_request_id = ?", data.Options.ConnectionId, gitlabMergeRequest.GitlabId),
			)
			if err != nil {
				return nil, err
			}
			for _, reviewer := range mr.Reviewers {
				gitlabReviewer := &models.GitlabReviewer{
					ConnectionId:   data.Options.ConnectionId,
					ReviewerId:     reviewer.ReviewerIdId,
					MergeRequestId: mr.GitlabId,
					ProjectId:      data.Options.ProjectId,
					Username:       reviewer.Username,
					Name:           reviewer.Name,
					State:          reviewer.State,
					AvatarUrl:      reviewer.AvatarUrl,
					WebUrl:         reviewer.WebUrl,
				}
				results = append(results, gitlabReviewer)
			}
			err = db.Delete(
				&models.GitlabAssignee{},
				dal.Where("connection_id = ? AND merge_request_id = ?", data.Options.ConnectionId, gitlabMergeRequest.GitlabId),
			)
			if err != nil {
				return nil, err
			}
			for _, assignee := range mr.Assignees {
				gitlabAssignee := &models.GitlabAssignee{
					ConnectionId:   data.Options.ConnectionId,
					AssigneeId:     assignee.AssigneeId,
					MergeRequestId: mr.GitlabId,
					ProjectId:      data.Options.ProjectId,
					Username:       assignee.Username,
					Name:           assignee.Name,
					State:          assignee.State,
					AvatarUrl:      assignee.AvatarUrl,
					WebUrl:         assignee.WebUrl,
				}
				results = append(results, gitlabAssignee)
			}
			return results, nil
		},
	})
	if err != nil {
		return err
	}
	return extractor.Execute()
}