public Task <bool> UpdatePermissionsAsync(GametekiUser user, GametekiPermissions newPermissions) { if (user == null) { throw new ArgumentNullException(nameof(user)); } if (newPermissions == null) { throw new ArgumentNullException(nameof(newPermissions)); } return(UpdatePermissionsInternalAsync(user, newPermissions)); }
private async Task <bool> UpdatePermissionsInternalAsync(GametekiUser user, GametekiPermissions newPermissions) { var existingPermissions = user.ToApiUser().Permissions; var toAdd = new List <string>(); var toRemove = new List <string>(); ProcessPermission(newPermissions.CanEditNews, existingPermissions.CanEditNews, Roles.NewsManager, toRemove, toAdd); ProcessPermission(newPermissions.CanManageGames, existingPermissions.CanManageGames, Roles.GameManager, toRemove, toAdd); ProcessPermission(newPermissions.CanManageNodes, existingPermissions.CanManageNodes, Roles.NodeManager, toRemove, toAdd); ProcessPermission(newPermissions.CanManagePermissions, existingPermissions.CanManagePermissions, Roles.PermissionsManager, toRemove, toAdd); ProcessPermission(newPermissions.CanManageUsers, existingPermissions.CanManageUsers, Roles.UserManager, toRemove, toAdd); ProcessPermission(newPermissions.CanModerateChat, existingPermissions.CanModerateChat, Roles.ChatManager, toRemove, toAdd); ProcessPermission(newPermissions.IsSupporter, existingPermissions.IsSupporter, Roles.Supporter, toRemove, toAdd); ProcessPermission(newPermissions.IsContributor, existingPermissions.IsContributor, Roles.Contributor, toRemove, toAdd); ProcessPermission(newPermissions.IsAdmin, existingPermissions.IsAdmin, Roles.Admin, toRemove, toAdd); foreach (var roleToAdd in toAdd) { var role = await context.Roles.SingleOrDefaultAsync(r => r.Name == roleToAdd).ConfigureAwait(false); if (role == null) { continue; } user.UserRoles.Add(new GametekiUserRole { Role = role, User = user }); } foreach (var userRole in toRemove.Select(roleToRemove => user.UserRoles.Single(ur => ur.Role.Name == roleToRemove))) { user.UserRoles.Remove(userRole); } try { await context.SaveChangesAsync().ConfigureAwait(false); } catch (DbUpdateException exception) { #pragma warning disable CA1303 // Do not pass literals as localized parameters logger.LogError(exception, "Failed updating permissions"); #pragma warning restore CA1303 // Do not pass literals as localized parameters return(false); } return(true); }