public async Task <IActionResult> Edit(long id, [Bind("UserId,BackingId,TransactionId,Amount")] UserBacking userBacking)
        {
            if (id != userBacking.UserId)
            {
                return(NotFound());
            }

            if (ModelState.IsValid)
            {
                try
                {
                    _context.Update(userBacking);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!UserBackingExists(userBacking.UserId))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                return(RedirectToAction(nameof(Index)));
            }
            ViewData["BackingId"] = new SelectList(_context.BackingPackage, "Id", "Name", userBacking.BackingId);
            ViewData["UserId"]    = new SelectList(_context.User, "Id", "Email", userBacking.UserId);
            return(View(userBacking));
        }
        public async Task <IActionResult> Create(long?projectId)
        {
            var userBacking = new UserBacking();

            if (!projectId.HasValue)
            {
                return(NotFound());
            }
            else
            {
                var projectContext = await _context.Project
                                     .Include(p => p.BackingPackages)
                                     .FirstOrDefaultAsync(p => p.Id == projectId);

                if (projectContext.BackingPackages == null)
                {
                    return(NotFound());
                }

                var authorizationResult = await _authorizationService.AuthorizeAsync(User, projectContext, "ProjectCreator");

                if (authorizationResult.Succeeded)
                {
                    return(new ForbidResult());
                }
                else if (User.Identity.IsAuthenticated)
                {
                    var userBackingQuery = from ub in _context.UserBacking
                                           join bp in projectContext.BackingPackages on ub.BackingId equals bp.Id
                                           where ub.UserId == User.GetUserId()
                                           select ub;

                    await userBackingQuery.LoadAsync();

                    if (userBackingQuery.Any())
                    {
                        return(new ForbidResult());
                    }

                    userBacking.Backing         = new BackingPackage();
                    userBacking.Backing.Project = projectContext;

                    userBacking.UserId = User.GetUserId().Value;
                    return(View(userBacking));
                }
                else
                {
                    return(new ChallengeResult());
                }
            }
        }
        public async Task <IActionResult> Create([Bind("UserId,BackingId,TransactionId,Amount")] UserBacking userBacking)
        {
            var backingPackage = await _context.BackingPackage
                                 .Include(bp => bp.Project)
                                 .FirstOrDefaultAsync(bp => bp.Id == userBacking.BackingId);

            if (backingPackage == null)
            {
                return(NotFound());
            }
            var authorizationResult = await _authorizationService.AuthorizeAsync(User, backingPackage, "ProjectCreator");

            if (authorizationResult.Succeeded)
            {
                return(new ForbidResult());
            }
            else if (User.Identity.IsAuthenticated)
            {
                if (ModelState.IsValid)
                {
                    userBacking.UserId = User.GetUserId().Value;
                    userBacking.Amount = backingPackage.BackingAmount;
                    backingPackage.Project.AmountGathered += backingPackage.BackingAmount;

                    _context.Add(userBacking);
                    _context.Update(backingPackage.Project);
                    await _context.SaveChangesAsync();

                    return(RedirectToAction(nameof(Details), "Projects", new { Id = backingPackage.ProjectId }));
                }
                ViewData["BackingId"] = userBacking.BackingId;
                return(View(userBacking.Backing.Project));
            }
            else
            {
                return(new ChallengeResult());
            }
        }