func Create()

in server/service/kv/kv_svc.go [74:140]


func Create(ctx context.Context, kv *model.KVDoc) (*model.KVDoc, *errsvc.Error) {
	if kv.Status == "" {
		kv.Status = common.StatusDisabled
	}
	err := validator.Validate(kv)
	if err != nil {
		return nil, config.NewError(config.ErrInvalidParams, err.Error())
	}
	err = quota.PreCreate(kv.Domain, kv.Project, "", 1)
	if err != nil {
		if err == quota.ErrReached {
			openlog.Error(fmt.Sprintf("can not create kv %s@%s, due to quota violation", kv.Key, kv.Project))
			return nil, config.NewError(config.ErrNotEnoughQuota, err.Error())
		}
		openlog.Error(err.Error())
		return nil, config.NewError(config.ErrInternal, "quota check failed")
	}

	if kv.Labels == nil {
		kv.Labels = map[string]string{}
	}
	kv.LabelFormat = stringutil.FormatMap(kv.Labels)
	if kv.ValueType == "" {
		kv.ValueType = datasource.DefaultValueType
	}
	//check whether the project has certain labels or not
	exist, err := datasource.GetBroker().GetKVDao().Exist(
		ctx,
		kv.Key,
		kv.Project,
		kv.Domain,
		datasource.WithLabelFormat(kv.LabelFormat),
		datasource.WithLabels(kv.Labels),
	)
	if err != nil {
		openlog.Error(err.Error())
		return nil, config.NewError(config.ErrInternal, "create kv failed")
	}
	if exist {
		return kv, config.NewError(config.ErrRecordAlreadyExists, datasource.ErrKVAlreadyExists.Error())
	}
	revision, err := datasource.GetBroker().GetRevisionDao().ApplyRevision(ctx, kv.Domain)
	if err != nil {
		openlog.Error(err.Error())
		return nil, config.NewError(config.ErrInternal, "create kv failed")
	}
	err = completeKV(kv, revision)
	if err != nil {
		openlog.Error(err.Error())
		return nil, config.NewError(config.ErrInternal, "create kv failed")
	}

	kv, err = datasource.GetBroker().GetKVDao().Create(ctx, kv, datasource.WithSync(sync.FromContext(ctx)))
	if err != nil {
		openlog.Error(fmt.Sprintf("post err:%s", err.Error()))
		return nil, util.SvcErr(err)
	}
	err = datasource.GetBroker().GetHistoryDao().AddHistory(ctx, kv)
	if err != nil {
		openlog.Warn(
			fmt.Sprintf("can not updateKeyValue version for [%s] [%s] in [%s]",
				kv.Key, kv.Labels, kv.Domain))
	}
	openlog.Debug(fmt.Sprintf("create %s with labels %s length [%d]", kv.Key, kv.Labels, len(kv.Value)))
	datasource.ClearPart(kv)
	return kv, nil
}