public async Task <int> CreateMembersAsync(List <Models.Member> members) { int countAddinMembersInCurrentGroup = 0; await _serfer.AuthorizationAsync(_configuration); _membersLeftToAdd = members; // implement filter groups correspond to members will be add IList <string> addedGroups = members.GroupBy(u => u.GroupName) .Select(grp => grp.First().GroupName) .ToList(); _existGroups = _existGroups.Where(x => addedGroups.Contains(x.Name)).ToList(); foreach (var group in _existGroups) { countAddinMembersInCurrentGroup = 0; _serfer.AddMembersEvent += ((o, x) => { countAddinMembersInCurrentGroup = x; UniversalEvent?.BeginInvoke(this, String.Format("Add {0} members to {1} group.", _countAddingMembers + countAddinMembersInCurrentGroup, group.Name), null, null); }); List <string> membersInCurrentGroup = members.Where(m => m.GroupName == group.Name).Select(m => m.Name).ToList(); if (await _serfer.AddMembersToGroupAsync(membersInCurrentGroup, group.Id)) { // Save current state _membersLeftToAdd.RemoveAll(x => x.GroupName == group.Name); _existGroups.Remove(group); _countAddingMembers = _countAddingMembers + countAddinMembersInCurrentGroup; } else { if ((_availableRepeatConnection--) > 0) { _membersLeftToAdd.RemoveRange(0, countAddinMembersInCurrentGroup); await CreateMembersAsync(_membersLeftToAdd); } } //var request = service.Groups.Update(new Google.Apis.Admin.Directory.directory_v1.Data.Group() { Name = item.Name, Email = item.Name }); //await Task.Run(() => request.Execute()); // countAddingMembers++; // UniversalEvent?.BeginInvoke(this, String.Format("Add {0} members to {1} group.", countAddingMembers, group.Name), null, null); } return(_countAddingMembers); }
public async Task CreateUsersAsync(List <Models.Member> members) { int countAddingMembers = 0; bool isAccess = await _serfer.AccessAsync("https://admin.google.com", _configuration.GetLogin(), _configuration.GetPassword()); if (isAccess) { UniversalEvent?.BeginInvoke(this, "Page loaded", null, null); IList <string> groups = members.GroupBy(u => u.GroupName) .Select(grp => grp.First().GroupName) .ToList(); foreach (string group in groups) { int countAttempts = 0; // counter attempts re-entry to G Suite in case of session interruption List <string> usersInCurrentGroup = members.Where(u => u.GroupName == group).Select(u => u.Name).ToList(); while (usersInCurrentGroup.Count > 0) { // countAddingMembers = await _serfer.AddMembersToGroupAsync(usersInCurrentGroup, group); // Delete added members to next restore (like control point in transaction) usersInCurrentGroup.RemoveRange(0, countAddingMembers); UniversalEvent?.BeginInvoke(this, String.Format("Add {0} members to {1} group.", countAddingMembers, group), null, null); countAddingMembers = 0; if (usersInCurrentGroup.Count > 0) { await _serfer.CloseCurrentSession(); isAccess = await _serfer.AccessAsync("https://admin.google.com", _configuration.GetLogin(), _configuration.GetPassword()); if (!isAccess) { UniversalEvent?.BeginInvoke(this, "Can not access to G Suite Admin Console ", null, null); return; } } if (countAttempts++ > 5) { UniversalEvent?.BeginInvoke(this, String.Format("Can not add {0} members to {1} group. Service unavalible", usersInCurrentGroup.Count, group), null, null); break; } } } } else { UniversalEvent?.BeginInvoke(this, "Can not access to G Suite Admin Console ", null, null); } }
public async Task <bool> AddMembersToGroupAsync(IList <string> members, string groupId) { int countAddingMembers = 0; // Create Directory API service. var service = new DirectoryService(new BaseClientService.Initializer() { HttpClientInitializer = _credential, ApplicationName = "GSuiteGroups" }); // splitting the list into packages by 25 members for (int i = 0; i <= members.Count / 25; i++) { try { // Create a batch request. BatchRequest request = new BatchRequest(service); IEnumerable <string> top25members = members.Skip(i * 25).Take(25); int countRequestAttempt = 0; // for implement elivate algorrytm foreach (string member in top25members) { request.Queue <Member>(service.Members.Insert( new Member() { Email = member, Role = "MEMBER" } , groupId), (content, error, x, message) => { // Put your callback code here. if (error != null) { if (error.Code == 403 && countRequestAttempt >= 1) { return; } if (error.Code == 403 && countRequestAttempt < 1) { // implement elivate algorrytm countRequestAttempt++; Task.Delay(countRequestAttempt ^ 2 * 2000).Wait(); request.ExecuteAsync(); } else { UniversalEvent?.BeginInvoke(this, error.Message, null, null); } } }); countAddingMembers++; } countRequestAttempt = 0; await request.ExecuteAsync(); AddMembersEvent?.BeginInvoke(this, countAddingMembers, null, null); } catch (Exception e) { UniversalEvent?.BeginInvoke(this, String.Format("Error {0}", e.Message), null, this); return(false); } } return(true); }