protected override void InternalHasValidationResult(EntityValidationFacade validationFacade, KeyValuePair <string, List <dynamic> > properties) { // If there are already critical errors that apply to the property, no further validation is performed. if (properties.Value == null || validationFacade.ValidationResults.Any(v => v.Node == validationFacade.RequestResource.Id && v.Path == properties.Key && v.ResultSeverity == ValidationResultSeverity.Violation)) { return; } foreach (var propertyValue in properties.Value) { if (propertyValue is Entity propertyEntity) { if (!_attachmentService.Exists(propertyEntity.Id.ToString())) { var validationResultProperty = new ValidationResultProperty(validationFacade.RequestResource.Id, properties.Key, propertyEntity.Id, string.Format(Common.Constants.Messages.Attachment.NotExists, propertyEntity.Id), ValidationResultSeverity.Violation); validationFacade.ValidationResults.Add(validationResultProperty); } } } ; }
private IList <ValidationResultProperty> CheckDuplicatesInRepository(Entity resource, string resourceId, string previousVersion) { var duplicateErrors = new List <ValidationResultProperty>(); var pidUriResults = GetDuplicateResultsByIdentifierType(Graph.Metadata.Constants.EnterpriseCore.PidUri, resource, out var pidUri); var baseUriResults = GetDuplicateResultsByIdentifierType(Graph.Metadata.Constants.Resource.BaseUri, resource, out var baseUri); var targetUriResults = GetDuplicateResultsByTargetUri(resource, out var targetUri); // allow the pidURI to be duplicate when changing resource type if (pidUri != null && pidUri != string.Empty) { if (pidUriResults.Count == 2 && pidUriResults[0].Type != pidUriResults[1].Type && resource.Id != null) { pidUriResults.Clear(); } } // TODO: Piduri has no entry then duplicate, or if entry/entryDraft is not actual resource if (CheckIdentifierIsDuplicate(pidUriResults, resource, resourceId, out bool orphanedPid)) { var message = orphanedPid ? Common.Constants.Validation.DuplicateFieldOrphaned : Common.Constants.Validation.DuplicateField; var pidUriValidationResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.EnterpriseCore.PidUri, pidUri, message, ValidationResultSeverity.Violation, ValidationResultPropertyType.DUPLICATE); duplicateErrors.Add(pidUriValidationResult); } if (CheckBaseUriIsDuplicate(baseUriResults, resource, resourceId, pidUri, previousVersion, out bool orphanedBaseUri)) { var message = orphanedBaseUri ? Common.Constants.Validation.DuplicateFieldOrphaned : Common.Constants.Validation.DuplicateField; var baseUriValidatioResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.Resource.BaseUri, baseUri, message, ValidationResultSeverity.Violation, ValidationResultPropertyType.DUPLICATE, null); duplicateErrors.Add(baseUriValidatioResult); } if (CheckIdentifierIsDuplicate(targetUriResults, resource, resourceId, out _)) { var targetUriValidationResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.Resource.DistributionEndpoints.HasNetworkAddress, targetUri, Common.Constants.Validation.DuplicateField, ValidationResultSeverity.Info, ValidationResultPropertyType.DUPLICATE); duplicateErrors.Add(targetUriValidationResult); } foreach (var property in resource.Properties) { // TODO: Check metadata property type is permanent identifier if (property.Key != Graph.Metadata.Constants.EnterpriseCore.PidUri && property.Key != Graph.Metadata.Constants.Resource.BaseUri) { foreach (var prop in property.Value) { if (DynamicExtension.IsType <Entity>(prop, out Entity entity)) { duplicateErrors.AddRange(CheckDuplicatesInRepository(entity, resourceId, string.Empty)); } } } } return(duplicateErrors); }
public void InternalHasValidationResult_CriticalValidatioResultExists() { // Arrange var resource = CreateResourceWithConsumerGroup(_activeConsumerGroup.Id); var criticalValidationResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.Resource.HasConsumerGroup, "Unique critical mock error", string.Empty, ValidationResultSeverity.Violation); var validationFacade = new EntityValidationFacade(ResourceCrudAction.Create, resource, null, null, _metadata, null); validationFacade.ValidationResults.Add(criticalValidationResult); //// Act _validator.HasValidationResult(validationFacade, GetConsumerGroupProperty(resource)); //// Assert Assert.Contains(Graph.Metadata.Constants.Resource.HasConsumerGroup, validationFacade.RequestResource.Properties); Assert.Single(validationFacade.RequestResource.Properties[Graph.Metadata.Constants.Resource.HasConsumerGroup]); Assert.Equal(_activeConsumerGroup.Id, validationFacade.RequestResource.Properties[Graph.Metadata.Constants.Resource.HasConsumerGroup].First()); Assert.Equal(1, validationFacade.ValidationResults.Count); Assert.Contains(criticalValidationResult, validationFacade.ValidationResults); }
private IList <ValidationResultProperty> CheckDuplicatesInRepository(Entity resource, string resourceId, string previousVersion) { var duplicateErrors = new List <ValidationResultProperty>(); var pidUriResults = GetDuplicateResultsByIdentifierType(Graph.Metadata.Constants.EnterpriseCore.PidUri, resource, out var pidUri); var baseUriResults = GetDuplicateResultsByIdentifierType(Graph.Metadata.Constants.Resource.BaseUri, resource, out var baseUri); var targetUriResults = GetDuplicateResultsByTargetUri(resource, out var targetUri); // TODO: Piduri has no entry then duiplicate, or if entry/entryDraft is not actual resource if (CheckIdentifierIsDuplicate(pidUriResults, resource, resourceId)) { var pidUriValidationResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.EnterpriseCore.PidUri, pidUri, Common.Constants.Validation.DuplicateField, ValidationResultSeverity.Violation, ValidationResultPropertyType.DUPLICATE); duplicateErrors.Add(pidUriValidationResult); } if (CheckBaseUriIsDuplicate(baseUriResults, resource, resourceId, pidUri, previousVersion)) { var baseUriValidatioResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.Resource.BaseUri, baseUri, Common.Constants.Validation.DuplicateField, ValidationResultSeverity.Violation, ValidationResultPropertyType.DUPLICATE, null); duplicateErrors.Add(baseUriValidatioResult); } if (CheckIdentifierIsDuplicate(targetUriResults, resource, resourceId)) { var targetUriValidationResult = new ValidationResultProperty(resource.Id, Graph.Metadata.Constants.Resource.DistributionEndpoints.HasNetworkAddress, targetUri, Common.Constants.Validation.DuplicateField, ValidationResultSeverity.Info, ValidationResultPropertyType.DUPLICATE); duplicateErrors.Add(targetUriValidationResult); } foreach (var property in resource.Properties) { foreach (var prop in property.Value) { if (DynamicExtension.IsType <Entity>(prop, out Entity parsedProp) && property.Key != Graph.Metadata.Constants.EnterpriseCore.PidUri && property.Key != Graph.Metadata.Constants.Resource.BaseUri) { duplicateErrors.AddRange(CheckDuplicatesInRepository(parsedProp, resourceId, string.Empty)); } } } return(duplicateErrors); }
private void AssertValidationResult(ValidationResultProperty validationResult, string taxonomyId) { Assert.Equal(string.Format(RegistrationService.Common.Constants.Messages.Taxonomy.InvalidSelection, taxonomyId), validationResult.Message); Assert.Equal(ValidationResultSeverity.Violation, validationResult.ResultSeverity); }
protected override void InternalHasValidationResult(EntityValidationFacade validationFacade, KeyValuePair <string, List <dynamic> > properties) { // Create temporary validation error var validationResult = new ValidationResultProperty(validationFacade.RequestResource.Id, Graph.Metadata.Constants.Resource.HasVersion, null, null, ValidationResultSeverity.Violation); // Get version string newVersion = properties.Value.FirstOrDefault(); // Check if version is given if (!string.IsNullOrWhiteSpace(newVersion)) { // Check if version match version regex. Only numbers with points are allowed. if (!Regex.IsMatch(newVersion, Common.Constants.Regex.Version)) { validationResult.Message = "The version does not have the correct format. Only numbers and points are allowed. For example: 1 , 1.2 , 1.2.1"; validationResult.ResultValue = newVersion; validationFacade.ValidationResults.Add(validationResult); return; } // If the entry is new, search the version list for previous entry string pidUriString; if (validationFacade.ResourcesCTO.IsEmpty) { if (string.IsNullOrWhiteSpace(validationFacade.PreviousVersion)) { return; } pidUriString = validationFacade.PreviousVersion; } else { // Get repo version string repoVersion = validationFacade.ResourcesCTO.GetDraftOrPublishedVersion().Properties.GetValueOrNull(Graph.Metadata.Constants.Resource.HasVersion, true); // If repo version is equal to actual version, then everything is okay. if (repoVersion == newVersion) { return; } pidUriString = validationFacade.ResourcesCTO.GetDraftOrPublishedVersion().Properties.GetValueOrNull(Graph.Metadata.Constants.EnterpriseCore.PidUri, true)?.Id; } if (!Uri.TryCreate(pidUriString, UriKind.Absolute, out var pidUri)) { return; } var graphList = new HashSet <Uri>(); graphList.Add(_metadataService.GetInstanceGraph(PIDO.PidConcept)); graphList.Add(_metadataService.GetInstanceGraph("draft")); var versions = _resourceRepository.GetAllVersionsOfResourceByPidUri(pidUri, graphList).ToArray(); if (versions.IsNullOrEmpty()) { return; } // Check if actual version is already in list if (versions.Any(r => r.Version.CompareVersionTo(newVersion) == 0)) { validationResult.Message = $"The new version already exists in the list, the last version is {versions.Last().Version}."; validationFacade.ValidationResults.Add(validationResult); return; } // If no entry with same pid uri in list, a new resource will be created if (!versions.Any(r => r.PidUri == validationFacade.RequestResource.PidUri?.ToString())) { return; } // Check if entry is already in list and check if the current version is still between the two linked neighbors. // -> case: if someone changes the version of an already linked resource. // Get index of actual version var index = Array.FindIndex(versions, r => r.PidUri == validationFacade.RequestResource.PidUri.ToString()); // If actual entry is not last entry if (versions.Last().PidUri != validationFacade.RequestResource.PidUri.ToString()) { // Check if actual version is lower than the version of the next entry if (versions[index + 1].Version.CompareVersionTo(newVersion) <= 0) { validationResult.Message = $"The new version is larger than the later entry in the list (must be < {versions[index + 1].Version})."; validationFacade.ValidationResults.Add(validationResult); return; } } // If actual entry is not first entry if (versions.First().PidUri != validationFacade.RequestResource.PidUri.ToString()) { // Check if actual version is higher than the version of the previous entry if (versions[index - 1].Version.CompareVersionTo(newVersion) >= 0) { validationResult.Message = $"The new version is smaller than the previous entry in the list (must be > {versions[index - 1].Version})."; validationFacade.ValidationResults.Add(validationResult); return; } } } }
private bool IsWarningSeverity(ValidationResultProperty property, ResourceCrudAction resourceCrudAction) { return(property.ResultSeverity == ValidationResultSeverity.Violation && !Common.Constants.Validation.CriticalProperties.Contains(property.Path) && resourceCrudAction != ResourceCrudAction.Publish); }