//todo: contentmanager //todo: taxonomies use reltype*maxdepth ? //todo: for child contexts, do we need anything more than parentcontext, contentitem & relationships? public async Task <IDescribeRelationshipsContext?> BuildRelationships( ContentItem contentItem, string sourceNodeIdPropertyName, string sourceNodeId, IEnumerable <string> sourceNodeLabels, ISyncNameProvider syncNameProvider, IContentManager contentManager, IContentItemVersion contentItemVersion, IDescribeRelationshipsContext?parentContext, IServiceProvider serviceProvider) { var graphSyncPartSettings = syncNameProvider.GetGraphSyncPartSettings(contentItem.ContentType); int maxDepthFromHere; if (parentContext == null) { maxDepthFromHere = Math.Min(graphSyncPartSettings.VisualiserNodeDepth ?? int.MaxValue, //todo: store in root in case changes mid flow? _graphSyncSettings.CurrentValue.MaxVisualiserNodeDepth); } else { if (_encounteredContentTypes.Any(x => x == contentItem.ContentType)) { return(null); } maxDepthFromHere = Math.Min(parentContext.MaxDepthFromHere - 1, graphSyncPartSettings.VisualiserNodeDepth ?? int.MaxValue); } if (maxDepthFromHere <= 0) { return(null); } var context = new DescribeRelationshipsContext( sourceNodeIdPropertyName, sourceNodeId, sourceNodeLabels, contentItem, maxDepthFromHere, syncNameProvider, contentManager, contentItemVersion, parentContext, serviceProvider); foreach (IContentItemGraphSyncer itemSyncer in _contentItemGraphSyncers) { //todo: allow syncers to chain or not? probably not if (itemSyncer.CanSync(context.ContentItem)) { await itemSyncer.AddRelationship(context); } } _encounteredContentTypes.Add(contentItem.ContentType); return(context); }