Пример #1
0
        public virtual void Merge(MigrationApiInfo apiInfo)
        {
            foreach (var apiUser in apiInfo.Users)
            {
                if (!Users.ContainsKey(apiUser.Key))
                {
                    continue;
                }

                var user = Users[apiUser.Key];
                user.ShouldImport = apiUser.ShouldImport;

                user.MigratingCalendar.ShouldImport = apiUser.MigratingCalendar.ShouldImport;
                user.MigratingContacts.ShouldImport = apiUser.MigratingContacts.ShouldImport;
                user.MigratingFiles.ShouldImport    = apiUser.MigratingFiles.ShouldImport;
                user.MigratingMail.ShouldImport     = apiUser.MigratingMail.ShouldImport;
            }
            foreach (var apiGroup in apiInfo.Groups)
            {
                if (!Groups.Exists(g => apiGroup.GroupName == g.GroupName))
                {
                    continue;
                }
                var group = Groups.Find(g => apiGroup.GroupName == g.GroupName);
                group.ShouldImport = apiGroup.ShouldImport;
            }
        }
Пример #2
0
        public void Migrate(MigrationApiInfo info)
        {
            if (!CoreContext.Configuration.Standalone || !CoreContext.UserManager.GetUsers(SecurityContext.CurrentAccount.ID).IsAdmin())
            {
                throw new System.Security.SecurityException();
            }
            var ongoingMigration = GetOngoingMigration();

            if (ongoingMigration == null)
            {
                throw new Exception("No migration is in progress");
            }
            else if (!ongoingMigration.ParseTask.IsCompleted)
            {
                throw new Exception("Parsing is still in progress");
            }

            ongoingMigration.MigrationTask = ongoingMigration.Migration.Migrate(info);
        }
Пример #3
0
 public abstract Task Migrate(MigrationApiInfo migrationInfo);
Пример #4
0
        public override Task Migrate(MigrationApiInfo migrationApiInfo)
        {
            ReportProgress(0, MigrationResource.PreparingForMigration);
            migrationInfo.Merge(migrationApiInfo);

            var usersForImport = migrationInfo.Users
                                 .Where(u => u.Value.ShouldImport)
                                 .Select(u => u.Value);

            importedUsers = new List <Guid>();
            var failedUsers  = new List <NCMigratingUser>();
            var usersCount   = usersForImport.Count();
            var progressStep = 25 / usersCount;
            var i            = 1;

            foreach (var user in usersForImport)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    ReportProgress(100, MigrationResource.MigrationCanceled); return(null);
                }
                ReportProgress(GetProgress() + progressStep, String.Format(MigrationResource.UserMigration, user.DisplayName, i++, usersCount));
                try
                {
                    user.dataСhange(migrationApiInfo.Users.Find(element => element.Key == user.Key));
                    user.Migrate();
                    importedUsers.Add(user.Guid);
                }
                catch (Exception ex)
                {
                    failedUsers.Add(user);
                    Log($"Couldn't migrate user {user.DisplayName} ({user.Email})", ex);
                }
            }

            var groupsForImport = migrationInfo.Groups
                                  .Where(g => g.ShouldImport)
                                  .Select(g => g);
            var groupsCount = groupsForImport.Count();

            if (groupsCount != 0)
            {
                progressStep = 25 / groupsForImport.Count();
                //Create all groups
                i = 1;
                foreach (var group in groupsForImport)
                {
                    if (cancellationToken.IsCancellationRequested)
                    {
                        ReportProgress(100, MigrationResource.MigrationCanceled); return(null);
                    }
                    ReportProgress(GetProgress() + progressStep, String.Format(MigrationResource.GroupMigration, group.GroupName, i++, groupsCount));
                    try
                    {
                        group.usersGuidList = migrationInfo.Users
                                              .Where(user => group.UserUidList.Exists(u => user.Key == u))
                                              .Select(u => u)
                                              .ToDictionary(k => k.Key, v => v.Value.Guid);
                        group.Migrate();
                    }
                    catch (Exception ex)
                    {
                        Log($"Couldn't migrate group {group.GroupName} ", ex);
                    }
                }
            }

            i = 1;
            foreach (var user in usersForImport)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    ReportProgress(100, MigrationResource.MigrationCanceled); return(null);
                }
                if (failedUsers.Contains(user))
                {
                    ReportProgress(GetProgress() + progressStep, String.Format(MigrationResource.UserSkipped, user.DisplayName, i, usersCount));
                    continue;
                }

                var smallStep = progressStep / 3;

                try
                {
                    user.MigratingContacts.Migrate();
                }
                catch (Exception ex)
                {
                    Log($"Couldn't migrate user {user.DisplayName} ({user.Email}) contacts", ex);
                }
                finally
                {
                    ReportProgress(GetProgress() + smallStep, String.Format(MigrationResource.MigratingUserContacts, user.DisplayName, i, usersCount));
                }

                /*try
                 * {
                 *  user.MigratingCalendar.Migrate();
                 * }
                 * catch (Exception ex)
                 * {
                 *  Log($"Couldn't migrate user {user.DisplayName} ({user.Email}) calendar", ex);
                 * }
                 * finally
                 * {
                 *  ReportProgress(GetProgress() + smallStep, String.Format(MigrationResource.UserCalendarMigration, user.DisplayName, i, usersCount));
                 * }*/

                try
                {
                    var currentUser = SecurityContext.CurrentAccount;
                    SecurityContext.AuthenticateMe(user.Guid);
                    user.MigratingFiles.SetUsersDict(usersForImport.Except(failedUsers));
                    user.MigratingFiles.SetGroupsDict(groupsForImport);
                    user.MigratingFiles.Migrate();
                    SecurityContext.AuthenticateMe(currentUser.ID);
                }
                catch (Exception ex)
                {
                    Log($"Couldn't migrate user {user.DisplayName} ({user.Email}) files", ex);
                }
                finally
                {
                    ReportProgress(GetProgress() + smallStep, String.Format(MigrationResource.MigratingUserFiles, user.DisplayName, i, usersCount));
                }
                i++;
            }

            if (Directory.Exists(tmpFolder))
            {
                Directory.Delete(tmpFolder, true);
            }
            ReportProgress(100, MigrationResource.MigrationCompleted);
            return(Task.CompletedTask);
        }