public IActionResult GetLatestMetadataGraphConfiguration([FromQuery, NotRequired] string subject) { if (string.IsNullOrWhiteSpace(subject)) { return(Ok(_MetadataGraphConfigurationService.GetLatestConfiguration())); } return(Ok(_MetadataGraphConfigurationService.GetEntity(subject))); }
public async Task <Tuple <ValidationResult, bool, EntityValidationFacade> > ValidateAndPreProcessResource(string resourceId, ResourceRequestDTO resourceRequestDTO, ResourcesCTO resourcesCTO, ResourceCrudAction resourceCrudAction, bool nestedValidation = false, string consumerGroup = null, bool changeResourceType = false) { var requestResource = _mapper.Map <Resource>(resourceRequestDTO); requestResource.Id = string.IsNullOrWhiteSpace(resourceId) ? CreateNewResourceId() : resourceId; string entityType = requestResource.Properties.GetValueOrNull(Graph.Metadata.Constants.RDF.Type, true).ToString(); var metadata = _metadataService.GetMetadataForEntityType(entityType); // If it is a nested validation (example distribution endpoint), the consumer group of the parent must be included in the process. var actualConsumerGroup = nestedValidation ? consumerGroup : requestResource.Properties.GetValueOrNull(Graph.Metadata.Constants.Resource.HasConsumerGroup, true); var validationFacade = new EntityValidationFacade(resourceCrudAction, requestResource, resourcesCTO, resourceRequestDTO.HasPreviousVersion, metadata, actualConsumerGroup); if (changeResourceType) { // dirty solution for changing resource type. could be refactored in the future var validationRes = await _validationService.ValidateEntity(requestResource, metadata).ConfigureAwait(true); if (validationRes.Results.Count == 1 && validationRes.Results[0].Path == Graph.Metadata.Constants.Resource.BaseUri) { validationFacade.ResourceCrudAction = ResourceCrudAction.Create; } } // Remove passed properties for several properties and replace it with repo-resource properties afterwards RemoveProperty(Graph.Metadata.Constants.Resource.HasLaterVersion, requestResource); //RemoveProperty(Graph.Metadata.Constants.Resource.HasHistoricVersion, requestResource); RemoveProperty(Graph.Metadata.Constants.Resource.ChangeRequester, requestResource); if (resourceCrudAction != ResourceCrudAction.Create) { UpdatePropertyFromRepositoryResource(Graph.Metadata.Constants.Resource.HasLaterVersion, validationFacade); //validationFacade.RequestResource.Properties.AddOrUpdate(Graph.Metadata.Constants.Resource.MetadataGraphConfiguration, new List<dynamic>() { _metadataConfigService.GetLatestConfiguration().Id }); } if (!nestedValidation) // so only new resources get this property, no distribution endpoints { RemoveProperty(Graph.Metadata.Constants.Resource.MetadataGraphConfiguration, requestResource); validationFacade.RequestResource.Properties.AddOrUpdate(Graph.Metadata.Constants.Resource.MetadataGraphConfiguration, new List <dynamic>() { _metadataConfigService.GetLatestConfiguration().Id }); } // Each property have to be valiated and in same cases transformed var keys = requestResource.Properties.Keys.ToList(); foreach (var key in keys) { var property = new KeyValuePair <string, List <dynamic> >(key, requestResource.Properties[key]); if (changeResourceType && (property.Key == Graph.Metadata.Constants.RDF.Type)) { continue; } _entityPropertyValidator.Validate(key, validationFacade); await ValidateEndpoint(property, validationFacade); } // The following processes may only be executed for the main entry, so that the function already ends here with nested validations. if (nestedValidation) { var nestedValidationResult = new ValidationResult() { Results = validationFacade.ValidationResults }; var failedValidation = !nestedValidationResult.Conforms && nestedValidationResult.Severity != ValidationResultSeverity.Info; return(new Tuple <ValidationResult, bool, EntityValidationFacade>(nestedValidationResult, failedValidation, validationFacade)); } var validationResult = await _validationService.ValidateEntity(requestResource, metadata).ConfigureAwait(true); validationResult.Results = validationResult.Results.Select(r => { r.ResultSeverity = IsWarningSeverity(r, resourceCrudAction) ? ValidationResultSeverity.Warning : r.ResultSeverity; return(r); }).ToList(); string validationResourceId = validationFacade.ResourceCrudAction == ResourceCrudAction.Create ? null : resourcesCTO.GetDraftOrPublishedVersion().Id; var duplicateResults = _identifierValidationService.CheckDuplicates(requestResource, validationResourceId, resourceRequestDTO.HasPreviousVersion); if (changeResourceType) { duplicateResults = duplicateResults.ToList().FindAll(r => r.Path != Graph.Metadata.Constants.Resource.hasPID); } // Check whether forbidden properties are contained in the entity. var forbiddenPropertiesResults = _validationService.CheckForbiddenProperties(requestResource); // TODO: Concat or AddRange check validationResult.Results = validationResult.Results.Concat(validationFacade.ValidationResults).Concat(duplicateResults).Concat(forbiddenPropertiesResults).OrderBy(t => t.ResultSeverity).ToList(); var failed = ProcessFailed(validationResult, resourceCrudAction); // dirty solution for changing resource type (see also above) validationFacade.ResourceCrudAction = changeResourceType ? ResourceCrudAction.Update : validationFacade.ResourceCrudAction; if (failed) { // Reset the lifecycle Status to the correct value if (resourceCrudAction == ResourceCrudAction.Update) { requestResource.Properties.AddOrUpdate(Graph.Metadata.Constants.Resource.HasEntryLifecycleStatus, new List <dynamic>() { resourcesCTO.HasDraft?Graph.Metadata.Constants.Resource.ColidEntryLifecycleStatus.Draft: Graph.Metadata.Constants.Resource.ColidEntryLifecycleStatus.Published }); } } else { if (resourceCrudAction == ResourceCrudAction.Update && resourcesCTO.HasPublished) { requestResource.PublishedVersion = resourcesCTO.Published.Id; } } return(new Tuple <ValidationResult, bool, EntityValidationFacade>(validationResult, failed, validationFacade)); }