in backend/plugins/gitlab/impl/impl.go [125:218]
func (p Gitlab) PrepareTaskData(taskCtx plugin.TaskContext, options map[string]interface{}) (interface{}, errors.Error) {
logger := taskCtx.GetLogger()
logger.Debug("%v", options)
op, err := tasks.DecodeAndValidateTaskOptions(options)
if err != nil {
return nil, err
}
if op.ConnectionId == 0 {
return nil, errors.BadInput.New("connectionId is invalid")
}
connection := &models.GitlabConnection{}
connectionHelper := helper.NewConnectionHelper(
taskCtx,
nil,
p.Name(),
)
if err != nil {
return nil, err
}
err = connectionHelper.FirstById(connection, op.ConnectionId)
if err != nil {
return nil, errors.BadInput.Wrap(err, "connection not found")
}
apiClient, err := tasks.NewGitlabApiClient(taskCtx, connection)
if err != nil {
return nil, err
}
if op.ProjectId != 0 {
var scope *models.GitlabProject
// support v100 & advance mode
// If we still cannot find the record in db, we have to request from remote server and save it to db
db := taskCtx.GetDal()
err = db.First(&scope, dal.Where("connection_id = ? AND gitlab_id = ?", op.ConnectionId, op.ProjectId))
if err == nil {
if op.ScopeConfigId == 0 && scope.ScopeConfigId != 0 {
op.ScopeConfigId = scope.ScopeConfigId
}
}
if err != nil && db.IsErrorNotFound(err) {
var project *models.GitlabApiProject
project, err = api.GetApiProject(op, apiClient)
if err != nil {
return nil, err
}
logger.Debug(fmt.Sprintf("Current project: %d", project.GitlabId))
scope := project.ConvertApiScope()
scope.ConnectionId = op.ConnectionId
err = taskCtx.GetDal().CreateIfNotExist(scope)
if err != nil {
return nil, err
}
}
if err != nil {
return nil, errors.Default.Wrap(err, fmt.Sprintf("fail to find project: %d", op.ProjectId))
}
}
if op.ScopeConfig == nil {
if op.ScopeConfigId != 0 {
var scopeConfig models.GitlabScopeConfig
db := taskCtx.GetDal()
err = db.First(&scopeConfig, dal.Where("id = ?", op.ScopeConfigId))
if err != nil {
if db.IsErrorNotFound(err) {
return nil, errors.Default.Wrap(err, fmt.Sprintf("can not find scopeConfigs by scopeConfigId [%d]", op.ScopeConfigId))
}
return nil, errors.Default.Wrap(err, fmt.Sprintf("fail to find scopeConfigs by scopeConfigId [%d]", op.ScopeConfigId))
}
op.ScopeConfig = &scopeConfig
} else {
op.ScopeConfig = &models.GitlabScopeConfig{}
}
}
regexEnricher := helper.NewRegexEnricher()
if err := regexEnricher.TryAdd(devops.DEPLOYMENT, op.ScopeConfig.DeploymentPattern); err != nil {
return nil, errors.BadInput.Wrap(err, "invalid value for `deploymentPattern`")
}
if err := regexEnricher.TryAdd(devops.PRODUCTION, op.ScopeConfig.ProductionPattern); err != nil {
return nil, errors.BadInput.Wrap(err, "invalid value for `productionPattern`")
}
if err := regexEnricher.TryAdd(devops.ENV_NAME_PATTERN, op.ScopeConfig.EnvNamePattern); err != nil {
return nil, errors.BadInput.Wrap(err, "invalid value for `envNamePattern`")
}
taskData := tasks.GitlabTaskData{
Options: op,
ApiClient: apiClient,
RegexEnricher: regexEnricher,
}
return &taskData, nil
}