func()

in backend/plugins/tapd/impl/impl.go [186:272]


func (p Tapd) 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
	}
	connection := &models.TapdConnection{}
	connectionHelper := helper.NewConnectionHelper(
		taskCtx,
		nil,
		p.Name(),
	)
	err = connectionHelper.FirstById(connection, op.ConnectionId)
	if err != nil {
		return nil, err
	}
	if connection.RateLimitPerHour == 0 {
		connection.RateLimitPerHour = 3600
	}
	tapdApiClient, err := tasks.NewTapdApiClient(taskCtx, connection)
	if err != nil {
		return nil, errors.Default.Wrap(err, "failed to create tapd api client")
	}

	if op.WorkspaceId != 0 {
		var scope *models.TapdWorkspace
		// 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 id = ?", op.ConnectionId, op.WorkspaceId))
		if err != nil && db.IsErrorNotFound(err) {
			scope, err = api.GetApiWorkspace(op, tapdApiClient)
			if err != nil {
				return nil, err
			}
			logger.Debug(fmt.Sprintf("Current workspace: %d", scope.Id))
			err = db.CreateIfNotExist(&scope)
			if err != nil {
				return nil, err
			}
		}
		if err != nil {
			return nil, errors.Default.Wrap(err, fmt.Sprintf("fail to find workspace: %d", op.WorkspaceId))
		}
		op.WorkspaceId = scope.Id
		if op.ScopeConfigId == 0 {
			op.ScopeConfigId = scope.ScopeConfigId
		}
	}

	if op.ScopeConfig == nil && op.ScopeConfigId != 0 {
		var scopeConfig models.TapdScopeConfig
		err = taskCtx.GetDal().First(&scopeConfig, dal.Where("id = ?", op.ScopeConfigId))
		if err != nil && taskCtx.GetDal().IsErrorNotFound(err) {
			return nil, errors.BadInput.Wrap(err, "fail to get scopeConfig")
		}
		op.ScopeConfig, err = tasks.MakeScopeConfigs(scopeConfig)
		if err != nil {
			return nil, errors.BadInput.Wrap(err, "fail to make scopeConfig")
		}
	}

	if op.PageSize == 0 {
		op.PageSize = 100
	}
	cstZone, err1 := time.LoadLocation("Asia/Shanghai")
	if err1 != nil {
		return nil, errors.Default.Wrap(err1, "fail to get CST Location")
	}
	op.CstZone = cstZone
	taskData := &tasks.TapdTaskData{
		Options:    op,
		ApiClient:  tapdApiClient,
		Connection: connection,
	}
	if op.TimeAfter != "" {
		var timeAfter time.Time
		timeAfter, err = errors.Convert01(time.Parse(time.RFC3339, op.TimeAfter))
		if err != nil {
			return nil, errors.BadInput.Wrap(err, "invalid value for `timeAfter`")
		}
		taskData.TimeAfter = &timeAfter
		logger.Debug("collect data updated timeAfter %s", timeAfter)
	}
	return taskData, nil
}