/// <inheritdoc /> public async Task <MetadataDefinitionDto> HandleResult(ChangePropertyTypeAndDefaultValueCommand command, CancellationToken token) { var definition = _dynamicMetadataDefinitonService.GetById(command.DefinitionId); if (definition == null) { throw new NotFoundException(); } var existingProperty = definition.Properties.SingleOrDefault(x => x.Id == command.PropertyKey); if (existingProperty == null) { throw new BadRequestException("Property doesn't already exist"); } DynamicMetadataProperty property; try { property = _inputDataParser.DeserializeItem(command.PropertyKey, command.UpdatedObject.Type, command.UpdatedObject.DefaultValue); } catch (JsonException exception) { throw new AggregatedValidationException("Invalid type mismatch") { ErrorCode = 11231, ValidationErrors = new List <Error>() }; } // parsing property definition.Properties.Remove(existingProperty); definition.Properties.Add(property); _dynamicMetadataDefinitionWriteService.UpdateItem(definition, token); await _eventDispatcher.DispatchEvent(new PropertyDefinitionUpdatedEvent { UpdatedPropertyKey = property.Id, DefinitionId = command.DefinitionId }); return(_mapper.Map <MetadataDefinitionDto>(definition)); }
/// <inheritdoc /> public async Task <DynamicMetadataDto> HandleResult(UpdateMovieMetadataCommand command, CancellationToken token) { var movie = _movieReadService.GetById(command.MovieId); var metadata = movie.Metadata.FirstOrDefault(x => x.Id == command.MetdataId); var definition = _dynamicMetadataDefinitionReadService.GetById(metadata.DefinitionId); var validator = _validationFactory.GetValidator(definition); foreach (var metadataEntry in command.Metadata.DynamicProperties) { var propertyDefinition = definition.Properties.SingleOrDefault(x => x.Id == metadataEntry.Id); if (propertyDefinition != null) { if (propertyDefinition.Type != metadataEntry.Type) { throw new AggregatedValidationException("Type mismatch") { ErrorCode = 11231, ValidationErrors = new List <Error>() }; } var existingMetadata = metadata.Properties.SingleOrDefault(x => x.Id == metadataEntry.Id); if (existingMetadata != null) { try { var parsedValue = _inputDataParser.DeserializeItem(metadataEntry.Id, metadataEntry.Type, metadataEntry.Value); parsedValue.HasDefaultValue = false; metadata.Properties.Remove(existingMetadata); metadata.Properties.Add(parsedValue); } catch (JsonException exception) { throw new AggregatedValidationException("Invalid type mismatch") { ErrorCode = 11231, ValidationErrors = new List <Error>() }; } } } } var validationResult = validator.Validate(metadata, movie); if (validationResult.Any()) { throw new AggregatedValidationException("Validation exception") { ErrorCode = 1, ValidationErrors = validationResult }; } movie.Metadata.Add(metadata); _movieWriteService.UpdateItem(movie, token); var resultValue = _mapper.Map <DynamicMetadataDto>(metadata); return(resultValue); }