func updateDepTxn()

in datasource/mongo/dep.go [104:162]


func updateDepTxn(ctx context.Context, dependencyInfos []*discovery.ConsumerDependency, override bool) error {
	return dmongo.GetClient().ExecTxn(ctx, func(sessionContext mongo.SessionContext) error {
		domainProject := util.ParseDomainProject(ctx)
		for _, dependency := range dependencyInfos {
			consumerFlag := util.StringJoin([]string{
				dependency.Consumer.Environment,
				dependency.Consumer.AppId,
				dependency.Consumer.ServiceName,
				dependency.Consumer.Version}, "/")
			consumerInfo := discovery.DependenciesToKeys([]*discovery.MicroServiceKey{dependency.Consumer}, domainProject)[0]
			providersInfo := discovery.DependenciesToKeys(dependency.Providers, domainProject)

			if err := datasource.ParamsChecker(consumerInfo, providersInfo); err != nil {
				log.Error(fmt.Sprintf("put request into dependency queue failed, override: %t consumer is %s",
					override, consumerFlag), nil)
				return err
			}

			consumerID, err := GetServiceID(ctx, consumerInfo)
			if err != nil && !errors.Is(err, datasource.ErrNoData) {
				log.Error(fmt.Sprintf("put request into dependency queue failed, override: %t, get consumer %s id failed",
					override, consumerFlag), err)
				return discovery.NewError(discovery.ErrInternal, err.Error())
			}
			if len(consumerID) == 0 {
				log.Error(fmt.Sprintf("put request into dependency queue failed, override: %t consumer %s does not exist",
					override, consumerFlag), err)
				return discovery.NewError(discovery.ErrServiceNotExists, fmt.Sprintf("Consumer %s does not exist.", consumerFlag))
			}

			dependency.Override = override
			if !override {
				id := util.GenerateUUID()

				domain := util.ParseDomain(ctx)
				project := util.ParseProject(ctx)
				data := &model.ConsumerDep{
					Domain:      domain,
					Project:     project,
					ConsumerID:  consumerID,
					UUID:        id,
					ConsumerDep: dependency,
				}

				insertRes, err := dmongo.GetClient().GetDB().Collection(model.CollectionDep).InsertOne(ctx, data)
				if err != nil {
					log.Error("failed to insert dep to mongodb", err)
					return discovery.NewError(discovery.ErrInternal, err.Error())
				}
				log.Info(fmt.Sprintf("insert dep to mongodb success %s", insertRes.InsertedID))
			}
			err = syncDependencyRule(ctx, domainProject, dependency)
			if err != nil {
				return err
			}
		}
		return nil
	})
}