public Models.UserDetail CreateUser(Models.UserToCreate user) { WAAD.DirectoryDataService graphService = DirectoryDataServiceFactory.GetInstance(_authConfig); // Note here that if tenant has multiple domains, the domain to use would need // to be specified on the request to us instead WAAD.User waadUser = user.ToWaadUser(_authConfig.DirectoryDomain); graphService.AddTousers(waadUser); var allGroups = graphService.directoryObjects.OfType<WAAD.Group>().ToList(); foreach (var groupId in user.DesiredRoleIds) { graphService.AddLink(allGroups.First(x => x.objectId == groupId), "members", waadUser); } graphService.SaveChanges(); return waadUser.ToUserDetail(Enumerable.Empty<WAAD.Group>()); }
public Models.UserDetail UpdateUser(Models.UserToUpdate user) { WAAD.DirectoryDataService graphService = DirectoryDataServiceFactory.GetInstance(_authConfig); WAAD.User waadUser = graphService.users.Where(x => x.objectId == user.Id).SingleOrDefault(); if (waadUser == null) { return null; } // Load user's current groups so we know what we have to do to have things reflect desired state graphService.LoadProperty(waadUser, "memberOf"); var userCurrentGroupIds = waadUser.memberOf.OfType<WAAD.Group>().Select(x => x.objectId).ToList(); // Load all groups var allGroups = graphService.directoryObjects.OfType<WAAD.Group>().ToList(); // See which groups user has now but no longer wants foreach (var groupIdToRemove in userCurrentGroupIds.Except(user.DesiredRoleIds)) { var groupToRemoveLinkFrom = allGroups.FirstOrDefault(x => x.objectId == groupIdToRemove); if (groupToRemoveLinkFrom != null) { graphService.DeleteLink(groupToRemoveLinkFrom, "members", waadUser); } } // See which new groups user wants foreach (var groupIdToAdd in user.DesiredRoleIds.Except(userCurrentGroupIds)) { var groupToAddLinkTo = allGroups.FirstOrDefault(x => x.objectId == groupIdToAdd); if (groupToAddLinkTo != null) { graphService.AddLink(groupToAddLinkTo, "members", waadUser); } } waadUser.displayName = user.Name; graphService.UpdateObject(waadUser); graphService.SaveChanges(); // At this point, does waadUser reflect updated links in its memberOf prop that we previously loaded? return waadUser.ToUserDetail(allGroups.Where(x => user.DesiredRoleIds.Contains(x.objectId))); }