Ejemplo n.º 1
0
        /// <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);
        }