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
})
}