示例#1
0
        public async Task <IActionResult> RemoveUpgrade(AnimalUpgrade upgrade)
        {
            _db.AnimalUpgrades.Remove(upgrade);
            await _db.SaveChangesAsync();

            return(RedirectToAction("Edit", new { upgrade.AnimalId }));
        }
示例#2
0
        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 }));
        }