public ActionResult CreateRole(RoleViewModel model)
        {
            if (ModelState.IsValid)
            {
                if (_roleRepository.First(item => item.Name == model.Name) != null)
                    SetError("Role name is a duplicate");
            }

            if (IsModelValidAndPersistErrors())
            {
                Role role = new Role()
                {
                    IsGroup = model.IsGroup,
                    Name = model.Name,
                    RankID = model.RankID,
                    SpecialPermissions = model.SpecialPermissions,
                };
                _roleRepository.Add(role);
                SetSuccess("Role added");
            }

            return RedirectToAction("Roles");
        }
 public ActionResult RoleDetails(int RoleID)
 {
     IEnumerable<User> users = _inRoleRepository.Where(item => item.RoleID.Equals(RoleID)).Select(item => item.User).ToList();
     Role role = _roleRepository.Get(RoleID);
     RoleViewModel model = new RoleViewModel()
     {
         IsGroup = role.IsGroup,
         Name = role.Name,
         RankID = role.RankID,
         RoleID = role.RoleID,
         Ranks = _rankRepository.Where(x => x.IsRoleRank == true).ToList(),
         SpecialPermissions = role.SpecialPermissions,
         Users = users
     };
     return View(model);
 }
        public ActionResult EditRole(RoleViewModel model)
        {
            Role roleTest = _roleRepository.First(item => item.Name.Equals(model.Name));

            if (ModelState.IsValid)
            {
                if (roleTest != null && roleTest.RoleID != model.RoleID)
                    ModelState.AddModelError("Name", "A role with that name already exists");

                // If the edit will lower special permissions from admin,
                // make sure that the user doesn't remove admin permissions from themself
                if (roleTest.SpecialPermissions == (byte)SpecialPermissionValue.Administrator && model.SpecialPermissions != (byte)SpecialPermissionValue.Administrator)
                {
                    // Get all the roles that grant the user administrator permissions
                    IEnumerable<Role> administratorRoles = _currentUser.InRoles.Where(item => item.Role.SpecialPermissions == (byte)SpecialPermissionValue.Administrator).Select(item => item.Role);

                    // If there are multiple roles, the user can still access the admin cp
                    if (administratorRoles.Count() == 1)
                    {
                        Role administratorRole = administratorRoles.FirstOrDefault();
                        // If it's only one role that grants the user admin permission,
                        // make sure it's not the one being edited
                        if (administratorRole.RoleID == roleTest.RoleID)
                        {
                            ModelState.AddModelError("SpecialPermissions", "");
                            SetError("You can't remove administrator permissions from the ONLY role that is allowing you to access the administrator control panel");
                        }
                    }
                }
            }

            if (IsModelValidAndPersistErrors())
            {
                Role role = _roleRepository.Get(model.RoleID);
                role.IsGroup = model.IsGroup;
                role.Name = model.Name;
                role.RankID = model.RankID;
                role.SpecialPermissions = model.SpecialPermissions;
                _roleRepository.Update(role);
                SetSuccess("Role updated");
            }

            return RedirectToAction("RoleDetails", new { RoleID = model.RoleID });
        }