public async Task <EditAutomobileInputModel> GetAutomobileEditInputModelAsync(int id)
        {
            Automobile automobile = await this.GetAutomobileByIdAsync(id);

            if (!await UserOwnsAutomobileAsync(automobile))
            {
                throw new UnauthorizedAccessException(ModelConstants.Unauthorized);
            }

            EditAutomobileInputModel viewModel = this.mapper.Map <EditAutomobileInputModel>(automobile);

            return(viewModel);
        }
        public async Task EditAutomobileAsync(int id, EditAutomobileInputModel inputModel)
        {
            var automobileToEdit = await this.GetAutomobileByIdAsync(id);

            if (!await UserOwnsAutomobileAsync(automobileToEdit))
            {
                throw new UnauthorizedAccessException(ModelConstants.Unauthorized);
            }

            var automobileMapping = this.mapper.Map <Automobile>(inputModel);

            automobileToEdit.Make = await this.dbContext.Makes
                                    .Where(x => x.Name == inputModel.PrimaryProperties.Make)
                                    .FirstOrDefaultAsync();

            automobileToEdit.Model = await this.dbContext.Models
                                     .Where(x => x.Name == inputModel.PrimaryProperties.Model)
                                     .FirstOrDefaultAsync();

            automobileToEdit.Title       = inputModel.Title;
            automobileToEdit.Comment     = inputModel.Comment;
            automobileMapping.ModifiedOn = DateTime.UtcNow;

            if (automobileMapping.PrimaryProperties != null)
            {
                var primaryProperties = automobileMapping.PrimaryProperties;

                if (automobileToEdit.PrimaryProperties != null)
                {
                    primaryProperties.Id = (int)automobileToEdit.PrimaryPropertiesId;
                    this.dbContext.Entry(automobileToEdit.PrimaryProperties).CurrentValues.SetValues(automobileMapping.PrimaryProperties);
                }
                else
                {
                    automobileToEdit.PrimaryProperties = automobileMapping.PrimaryProperties;
                }
            }
            if (automobileMapping.Interiors != null)
            {
                var interiors = automobileMapping.Interiors;

                if (automobileToEdit.Interiors != null)
                {
                    interiors.Id = (int)automobileToEdit.InteriorsId;
                }
                else
                {
                    automobileToEdit.Interiors = automobileMapping.Interiors;
                }

                this.dbContext.Entry(automobileToEdit.Interiors).CurrentValues.SetValues(automobileMapping.Interiors);
            }
            if (automobileMapping.InteriorMaterials != null)
            {
                var interiorMaterials = automobileMapping.InteriorMaterials;

                if (automobileToEdit.InteriorMaterials != null)
                {
                    interiorMaterials.Id = (int)automobileToEdit.InteriorMaterialsId;
                }
                else
                {
                    automobileToEdit.InteriorMaterials = automobileMapping.InteriorMaterials;
                }

                this.dbContext.Entry(automobileToEdit.InteriorMaterials).CurrentValues.SetValues(automobileMapping.InteriorMaterials);
            }
            if (automobileMapping.Suspensions != null)
            {
                var suspensions = automobileMapping.Suspensions;

                if (automobileToEdit.Suspensions != null)
                {
                    suspensions.Id = (int)automobileToEdit.SuspensionsId;
                    this.dbContext.Entry(automobileToEdit.Suspensions).CurrentValues.SetValues(automobileMapping.Suspensions);
                }
                else
                {
                    automobileToEdit.Suspensions = automobileMapping.Suspensions;
                }
            }
            if (automobileMapping.ExtraFeatures != null)
            {
                var extraFeatures = automobileMapping.ExtraFeatures;

                if (automobileToEdit.ExtraFeatures != null)
                {
                    extraFeatures.Id = (int)automobileToEdit.ExtraFeaturesId;
                    this.dbContext.Entry(automobileToEdit.ExtraFeatures).CurrentValues.SetValues(automobileMapping.ExtraFeatures);
                }
                else
                {
                    automobileToEdit.ExtraFeatures = automobileMapping.ExtraFeatures;
                }
            }
            if (automobileMapping.SpecializedFeatures != null)
            {
                var specializedFeatures = automobileMapping.SpecializedFeatures;

                if (automobileToEdit.SpecializedFeatures != null)
                {
                    specializedFeatures.Id = (int)automobileToEdit.SpecializedFeaturesId;
                    this.dbContext.Entry(automobileToEdit.SpecializedFeatures).CurrentValues.SetValues(automobileMapping.SpecializedFeatures);
                }
                else
                {
                    automobileToEdit.SpecializedFeatures = automobileMapping.SpecializedFeatures;
                }
            }
            if (automobileMapping.Images != null)
            {
                var images = automobileMapping.Images;

                if (automobileToEdit.Images != null)
                {
                    images.Id = (int)automobileToEdit.ImagesId;
                    this.dbContext.Entry(automobileToEdit.Images).CurrentValues.SetValues(automobileMapping.Images); //TODO fix images they are not uploading
                }
                else
                {
                    automobileToEdit.Images = automobileMapping.Images;
                }
            }

            this.dbContext.Update(automobileToEdit);
            await this.dbContext.SaveChangesAsync();
        }
        public async Task <IActionResult> Edit(int id, EditAutomobileInputModel inputModel)
        {
            await this.autoService.EditAutomobileAsync(id, inputModel);

            return(this.Redirect($"/Automobile/Index/{id}"));
        }