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; } }
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); }
public abstract Task Migrate(MigrationApiInfo migrationInfo);
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); }