public virtual async Task <ActionResult <UserViewModel> > ChangeRoles([FromRoute] string id, [FromBody] Dictionary <string, object> roles) { var asMod = !UserFromClaims.HasRole("Admin"); var userManager = ServiceProvider.GetRequiredService <UserManager <User> >(); var user = await Repo.GetOneOrThrow(id); var allRoles = await ServiceProvider.GetRequiredService <RoleManager <Role> >().Roles.Select(role => role.Name) .ToListAsync(); var existingRoles = await userManager.GetRolesAsync(user); var newRoles = allRoles.Where(roles.ContainsKey) .ToList(); var toDeleteRoles = existingRoles.Except(newRoles).ToList(); if (UserFromClaims.Id == id) { toDeleteRoles = toDeleteRoles.Where(r => r != (asMod ? "Moderator" : "Admin")).ToList(); } var toAddRoles = newRoles.Except(existingRoles).ToList(); if (asMod) { if (toAddRoles.Contains("Admin")) { toAddRoles.RemoveAll(r => r == "Admin"); } if (toDeleteRoles.Contains("Admin")) { toDeleteRoles.RemoveAll(r => r == "Admin"); } } await userManager.AddToRolesAsync(user, toAddRoles); await userManager.RemoveFromRolesAsync(user, toDeleteRoles); return(Ok(new { reloadTable = true })); }
private async Task <List <CategoryEntity> > GetAvailableCategories() { var isMod = UserFromClaims.HasRole("Moderator"); List <CategoryEntity> categories; if (isMod) { categories = await CatsRepo.GetAll(); } else { var judgeProfile = await GetJudgeProfileOrThrow(); categories = new List <CategoryEntity> { judgeProfile.Category }; } return(categories); }