func removeProviderRuleOfConsumer()

in datasource/etcd/util/dependency_util.go [308:352]


func removeProviderRuleOfConsumer(ctx context.Context, domainProject string, cache map[string]bool) ([]etcdadpt.OpOptions, error) {
	key := path.GenerateConsumerDependencyRuleKey(domainProject, nil) + path.SPLIT
	resp, err := sd.DependencyRule().Search(ctx,
		etcdadpt.WithStrKey(key), etcdadpt.WithPrefix())
	if err != nil {
		return nil, err
	}

	var ops []etcdadpt.OpOptions
	for _, keyValue := range resp.Kvs {
		var left []*pb.MicroServiceKey
		all := keyValue.Value.(*pb.MicroServiceDependency).Dependency
		for _, key := range all {
			id := path.GenerateProviderDependencyRuleKey(key.Tenant, key)
			exist, ok := cache[id]
			if !ok {
				_, exist, err = FindServiceIds(ctx, key, false)
				if err != nil {
					return nil, fmt.Errorf("%v, find service %s/%s/%s/%s",
						err, key.Tenant, key.AppId, key.ServiceName, key.Version)
				}
				cache[id] = exist
			}

			if exist {
				left = append(left, key)
			}
		}

		if len(all) == len(left) {
			continue
		}

		if len(left) == 0 {
			ops = append(ops, etcdadpt.OpDel(etcdadpt.WithKey(keyValue.Key)))
		} else {
			val, err := json.Marshal(&pb.MicroServiceDependency{Dependency: left})
			if err != nil {
				return nil, fmt.Errorf("%v, marshal %v", err, left)
			}
			ops = append(ops, etcdadpt.OpPut(etcdadpt.WithKey(keyValue.Key), etcdadpt.WithValue(val)))
		}
	}
	return ops, nil
}