public async Task <IActionResult> ManagePermissions()
        {
            var vm   = new ManagePermissionsViewModel();
            var user = await GetCurrentUserAsync();

            var permissions = await _dbContext.UserPermissions
                              .Where(up => up.ApplicationUserId == user.Id)
                              .Select(up => up.Permission)
                              .ToListAsync();

            _logger.LogDebug("Retrieved user {0} with {1} permissions", user.UserName, user.Permissions?.Count ?? 0);

            vm.Permissions           = permissions.Any() ? permissions : new List <Permission>();
            vm.PermissionSelectItems = new[]
            {
                new SelectListItem {
                    Value = ((int)Permission.Permission1).ToString(), Text = "Permission 1"
                },
                new SelectListItem {
                    Value = ((int)Permission.Permission2).ToString(), Text = "Permission 2"
                },
                new SelectListItem {
                    Value = ((int)Permission.Permission3).ToString(), Text = "Permission 3"
                }
            };

            return(View(vm));
        }
        public ManagePermissionsView(ManagePermissionsViewModel vm) : base(vm)
        {
            InitializeComponent();

            vm.CreatedItemInList.RegisterHandler(interaction =>
            {
                ManageDataGrid.ScrollIntoView(interaction.Input);
                ManageDataGrid.SelectedItem = interaction.Input;
                interaction.SetOutput(Unit.Default);
            });
        }
        public async Task <IActionResult> ManagePermissions(ManagePermissionsViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (model.Permissions.HasValue())
            {
                var user = await GetCurrentUserAsync();

                if (user.Permissions == null)
                {
                    user.Permissions = new List <UserPermission>(
                        model.Permissions.Select(p => new UserPermission {
                        ApplicationUserId = user.Id, Permission = p
                    }));
                }

                else
                {
                    user.Permissions.Clear();
                    user.Permissions.AddRange(
                        model.Permissions.Select(p => new UserPermission {
                        ApplicationUserId = user.Id, Permission = p
                    }));
                }

                _logger.LogDebug("storing {0} permission with user", user.Permissions.Count);

                await _userManager.UpdateAsync(user);

                await _signInManager.SignInAsync(user, isPersistent : false);
            }

            return(RedirectToAction(nameof(Index)));
        }