//todo: output relationships destination label user id, instead of node id private string FailureContext( string failureReason, IValidateAndRepairItemSyncContext context, ContentTypePartDefinition contentTypePartDefinition, ContentItem contentItem, string partName, dynamic partContent) { return($@"{context.ValidateAndRepairGraph.FailureContext(failureReason, contentItem)} part type name: '{partName}' part name: '{contentTypePartDefinition.Name}' part content: {partContent} Source Node ------------------------------------ {SourceNodeContext(context.NodeWithRelationships.SourceNode, context.NodeId)} Outgoing Relationships ------------------------- {string.Join(Environment.NewLine, context.NodeWithRelationships.OutgoingRelationships.Select(or => $"[:{or.Type}]->({or.Id})"))} Incoming Relationships ------------------------- {string.Join(Environment.NewLine, context.NodeWithRelationships.IncomingRelationships.Select(or => $"[:{or.Type}]->({or.Id})"))}"); }
public async Task <(bool validated, string failureReason)> ValidateSyncComponent( IValidateAndRepairItemSyncContext context) { foreach (ContentTypePartDefinition contentTypePartDefinition in context.ContentTypeDefinition.Parts) { IContentPartGraphSyncer?partSyncer = _partSyncers.SingleOrDefault(ps => ps.CanSync(contentTypePartDefinition.ContentTypeDefinition.Name, contentTypePartDefinition.PartDefinition)); if (partSyncer == null) { _logger.LogInformation("No IContentPartGraphSyncer registered to sync/validate {ContentTypeDefinitionName} parts, so ignoring.", contentTypePartDefinition.ContentTypeDefinition.Name); continue; } dynamic?partContent = context.ContentItem.Content[contentTypePartDefinition.Name]; if (partContent == null) { continue; //todo: throw?? } // pass as param, rather than context? context.ContentTypePartDefinition = contentTypePartDefinition; (bool validated, string partFailureReason) = await partSyncer.ValidateSyncComponent( (JObject)partContent, context); if (validated) { continue; } string failureReason = $"{partSyncer.PartName} did not validate: {partFailureReason}"; string failureContext = FailureContext(failureReason, context, contentTypePartDefinition, context.ContentItem, contentTypePartDefinition.PartDefinition.Name, partContent); return(false, failureContext); } return(true, ""); }
//todo: output relationships destination label user id, instead of node id private string FailureContext( string failureReason, IValidateAndRepairItemSyncContext context, ContentTypePartDefinition contentTypePartDefinition, ContentItem contentItem, string partName, dynamic partContent) { return($@"{context.ValidateAndRepairGraph.FailureContext(failureReason, contentItem)} part type name: '{partName}' part name: '{contentTypePartDefinition.Name}' part content: {partContent} Source Node ------------------------------------ ID: {context.NodeWithOutgoingRelationships.SourceNode.Id} user ID: {context.NodeId} labels: ':{string.Join(":", context.NodeWithOutgoingRelationships.SourceNode.Labels)}' properties: {string.Join(Environment.NewLine, context.NodeWithOutgoingRelationships.SourceNode.Properties.Select(p => $"{p.Key} = {(p.Value is IEnumerable<object> values ? string.Join(",", values.Select(v => v.ToString())) : p.Value)}"))} Relationships ---------------------------------- {string.Join(Environment.NewLine, context.NodeWithOutgoingRelationships.OutgoingRelationships.Select(or => $"[:{or.Relationship.Type}]->({or.DestinationNode.Id})"))}"); }
public Task <(bool validated, string failureReason)> ValidateSyncComponent( IValidateAndRepairItemSyncContext context) { return(_taxonomyPartGraphSyncer.ValidateSyncComponentForNonLeafEmbeddedTerm((JObject)context.ContentItem.Content, context)); }