Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }