public CarConfigUserConfiguration Add(CarConfigUserConfiguration userConfiguration, string code)
        {
            using var connection = new SqlConnection(ConnectionString);

            if (Get(code) != null)
            {
                throw new Exception("There's already an entry for this code.");
            }

            // Delete old product selection for this configuration
            var insertId = connection.ExecuteScalar <int>(
                @"INSERT INTO CarConfigUserConfiguration (Code, ModelEAN)
                          output INSERTED.ID 
                          VALUES (@code, @carModelEAN);",
                new { code, carModelEAN = userConfiguration.ModelEAN });

            if (insertId <= 0)
            {
                throw new Exception("Unknown error while saving the user configuration.");
            }

            var newUserConfiguration = GetById(insertId);

            // Add new selected products
            InsertProducts(newUserConfiguration.Id, userConfiguration.Products);

            return(GetById(newUserConfiguration.Id));
        }
        /// <summary>
        /// Save a user car model configuration.
        /// </summary>
        /// <param name="summary"></param>
        /// <returns></returns>
        private CarConfigUserConfiguration SaveConfiguration(CarConfiguratorSummary summary)
        {
            var carModelProduct = _productRepository.GetByEAN(summary.SelectedModelEAN);

            if (carModelProduct == null || carModelProduct.IsOptionProduct)
            {
                throw new Exception("Unknown car model.");
            }

            var configurationProducts = summary.SelectedOptionProducts.Select(keyValuePair =>
            {
                var optionId        = keyValuePair.Key;
                var selectedProduct = keyValuePair.Value;

                var product = _productRepository.GetByEAN(selectedProduct.EAN);
                return(new CarConfigUserConfigurationProduct(carModelProduct.Id, optionId, product.Id));
            }).ToList();

            CarConfigUserConfiguration userConfiguration;

            if (summary.Code != null)
            {
                userConfiguration          = _carConfigUserConfigurationRepository.Get(summary.Code);
                userConfiguration.Products = configurationProducts;

                userConfiguration = _carConfigUserConfigurationRepository.Update(userConfiguration);

                return(userConfiguration);
            }

            var code = Guid.NewGuid().ToString("N");

            userConfiguration = new CarConfigUserConfiguration(
                carModelProduct.EAN,
                configurationProducts
                );

            userConfiguration = _carConfigUserConfigurationRepository.Add(userConfiguration, code);

            return(userConfiguration);
        }
        public CarConfigUserConfiguration Update(CarConfigUserConfiguration userConfiguration)
        {
            var currentUserConfiguration = Get(userConfiguration.Code);

            if (currentUserConfiguration == null)
            {
                return(null);
            }

            using var connection = new SqlConnection(ConnectionString);

            // Delete old product selection for this configuration
            connection.Execute(
                "DELETE FROM CarConfigUserConfigurationProduct WHERE CarConfigUserConfigurationId=@carConfigUserConfigurationId",
                new { carConfigUserConfigurationId = currentUserConfiguration.Id });

            // Add new selected products
            InsertProducts(currentUserConfiguration.Id, userConfiguration.Products);

            return(Get(currentUserConfiguration.Code));
        }