1
0
mirror of https://github.com/bitwarden/server.git synced 2025-05-23 04:21:05 -05:00

logic tweaks for group assignments

This commit is contained in:
Kyle Spearrin 2017-05-15 16:37:56 -04:00
parent fc12d73aae
commit 6958a3fda5
3 changed files with 26 additions and 14 deletions

View File

@ -239,8 +239,12 @@ namespace Bit.Api.Controllers
} }
var userId = _userService.GetProperUserId(User); var userId = _userService.GetProperUserId(User);
await _organizationService.ImportAsync(orgIdGuid, userId.Value, model.Groups.Select(g => g.ToGroupTuple(orgIdGuid)), await _organizationService.ImportAsync(
model.NewUsers.Select(u => u.Email), model.RemoveUsers.Select(u => u.Email)); orgIdGuid,
userId.Value,
model.Groups.Select(g => g.ToGroupTuple(orgIdGuid)),
model.Users.Where(u => !u.Disabled).Select(u => u.Email),
model.Users.Where(u => u.Disabled).Select(u => u.Email));
} }
} }
} }

View File

@ -8,8 +8,7 @@ namespace Bit.Core.Models.Api
public class ImportOrganizationUsersRequestModel public class ImportOrganizationUsersRequestModel
{ {
public Group[] Groups { get; set; } public Group[] Groups { get; set; }
public User[] NewUsers { get; set; } public User[] Users { get; set; }
public User[] RemoveUsers { get; set; }
public class Group public class Group
{ {
@ -37,6 +36,7 @@ namespace Bit.Core.Models.Api
[Required] [Required]
[EmailAddress] [EmailAddress]
public string Email { get; set; } public string Email { get; set; }
public bool Disabled { get; set; }
} }
} }
} }

View File

@ -981,9 +981,6 @@ namespace Bit.Core.Services
var newGroups = groups var newGroups = groups
.Where(g => !existingGroupsDict.ContainsKey(g.Item1.ExternalId)) .Where(g => !existingGroupsDict.ContainsKey(g.Item1.ExternalId))
.Select(g => g.Item1); .Select(g => g.Item1);
var updateGroups = existingGroups
.Where(eg => groups.Any(g => g.Item1.ExternalId == eg.ExternalId && g.Item1.Name != eg.Name))
.ToList();
foreach(var group in newGroups) foreach(var group in newGroups)
{ {
@ -993,20 +990,30 @@ namespace Bit.Core.Services
await UpdateUsersAsync(group, groupsDict[group.ExternalId].Item2, existingUsersIdDict); await UpdateUsersAsync(group, groupsDict[group.ExternalId].Item2, existingUsersIdDict);
} }
var updateGroups = existingGroups
.Where(g => groupsDict.ContainsKey(g.ExternalId))
.ToList();
if(updateGroups.Any()) if(updateGroups.Any())
{ {
var existingGroupUsers = (await _groupRepository.GetManyGroupUsersByOrganizationIdAsync(organizationId)) var groupUsers = await _groupRepository.GetManyGroupUsersByOrganizationIdAsync(organizationId);
var existingGroupUsers = groupUsers
.GroupBy(gu => gu.GroupId) .GroupBy(gu => gu.GroupId)
.ToDictionary(g => g.Key, g => new HashSet<Guid>(g.Select(g => g.OrganizationUserId))); .ToDictionary(g => g.Key, g => new HashSet<Guid>(g.Select(gr => gr.OrganizationUserId)));
foreach(var group in updateGroups) foreach(var group in updateGroups)
{ {
group.RevisionDate = DateTime.UtcNow; var updatedGroup = groupsDict[group.ExternalId].Item1;
group.Name = existingGroupsDict[group.ExternalId].Name; if(group.Name != updatedGroup.Name)
{
group.RevisionDate = DateTime.UtcNow;
group.Name = updatedGroup.Name;
await _groupRepository.ReplaceAsync(group);
}
await _groupRepository.ReplaceAsync(group);
await UpdateUsersAsync(group, groupsDict[group.ExternalId].Item2, existingUsersIdDict, await UpdateUsersAsync(group, groupsDict[group.ExternalId].Item2, existingUsersIdDict,
existingGroupUsers[group.Id]); existingGroupUsers.ContainsKey(group.Id) ? existingGroupUsers[group.Id] : null);
} }
} }
} }
@ -1015,7 +1022,8 @@ namespace Bit.Core.Services
private async Task UpdateUsersAsync(Group group, HashSet<string> groupUsers, private async Task UpdateUsersAsync(Group group, HashSet<string> groupUsers,
Dictionary<string, Guid> existingUsersIdDict, HashSet<Guid> existingUsers = null) Dictionary<string, Guid> existingUsersIdDict, HashSet<Guid> existingUsers = null)
{ {
var users = new HashSet<Guid>(groupUsers.Union(existingUsersIdDict.Keys).Select(u => existingUsersIdDict[u])); var availableUsers = groupUsers.Intersect(existingUsersIdDict.Keys);
var users = new HashSet<Guid>(availableUsers.Select(u => existingUsersIdDict[u]));
if(existingUsers != null && existingUsers.Count == users.Count && users.SetEquals(existingUsers)) if(existingUsers != null && existingUsers.Count == users.Count && users.SetEquals(existingUsers))
{ {
return; return;