public async Task <IActionResult> RemoveUpgrade(AnimalUpgrade upgrade) { _db.AnimalUpgrades.Remove(upgrade); await _db.SaveChangesAsync(); return(RedirectToAction("Edit", new { upgrade.AnimalId })); }
public async Task <IActionResult> AnimalUpgrade(int id, StoreAnimalUpgradeViewModel upgradeVm) { ApplicationUser user = await _userManager.GetUserAsync(User); Upgrade upgrade = await _db.Upgrades.SingleOrDefaultAsync(x => x.Id == id); Animal animal = await _db.Animals .Include(a => a.AnimalUpgrades) .Include(a => a.Building) .SingleOrDefaultAsync(a => a.Id == upgradeVm.AnimalId); // Check whether record exists if (upgrade == null) { return(NotFound()); } // Check whether this upgrade is stackable, and if it is not, if it is already applied if (animal != null && !upgrade.IsStackable && animal.AnimalUpgrades.Any(au => au.UpgradeId == id)) { ModelState.SetModelValue(nameof(upgradeVm.AnimalId), "You already upgraded this animal with that upgrade!"); } // If the modelstate is invalid, show view with errors displayed if (!ModelState.IsValid) { ApplicationUser viewUser = await _db.Users .Include(u => u.Buildings).ThenInclude(b => b.Animals).ThenInclude(a => a.Type) .SingleOrDefaultAsync(u => u.Id == user.Id); return(View(new StoreAnimalUpgradeViewModel { Animals = _mapper.Map <IEnumerable <Animal>, IEnumerable <AnimalViewModel> >(viewUser.Animals), Upgrade = _mapper.Map <Upgrade, UpgradeViewModel>(upgrade) })); } // Check for requests that should not be possible if (animal.Building.UserId != user.Id) { return(StatusCode((int)HttpStatusCode.Forbidden)); } if (user.Currency < upgrade.Price) { return(BadRequest()); } // At this point all should be well, set up the model and update database AnimalUpgrade animalUpgrade = _mapper.Map <StoreAnimalUpgradeViewModel, AnimalUpgrade>(upgradeVm); animalUpgrade.UpgradeId = id; _db.Users.Attach(user); user.Currency -= upgrade.Price; _db.Entry(user).Property(x => x.Currency).IsModified = true; _db.Add(animalUpgrade); _db.Add(new Notification { Message = $"You upgraded your animal!", Title = "New upgrade!", Image = "upgrades/" + upgrade.SpritePath, Link = "/animal/details/" + animalUpgrade.AnimalId, UserId = user.Id }); await _db.SaveChangesAsync(); return(RedirectToAction("Details", "Animal", new { id = animalUpgrade.AnimalId })); }