public async Task <PreviewRestoreModel> PreviewBackup(string backupId) { var previewModel = new PreviewRestoreModel(); var backup = await _backupRepository.GetOneAsync(backupId); var zipFile = await _fileSeviceProvider.DownloadFileAsync(backup.FileId); var fileNameWithoutExt = FileUtil.GetFileNameWithoutExt(zipFile.FileName); var restoreFilePath = Path.Combine(_backupOptions.CurrentValue.RestoreFolderPath, zipFile.FileName); Directory.CreateDirectory(_backupOptions.CurrentValue.RestoreFolderPath); using (var fileStream = File.Create(restoreFilePath)) { fileStream.Write(zipFile.FileBytes, 0, zipFile.FileBytes.Length); } // Release file in memory zipFile.FileBytes = null; var folderExtractingPath = Path.Combine(_backupOptions.CurrentValue.RestoreFolderPath, fileNameWithoutExt); if (Directory.Exists(folderExtractingPath)) { Directory.Delete(folderExtractingPath, true); } ZipFile.ExtractToDirectory(restoreFilePath, folderExtractingPath); var jsonBackupFilePath = Path.Combine(folderExtractingPath, fileNameWithoutExt + ".json"); var jsonBackupString = File.ReadAllText(jsonBackupFilePath); var backupFlatternModel = ConvertUtil.DeserializeObject <BackupFlatternFileModel>(jsonBackupString); foreach (var chainingFile in backupFlatternModel.ChainingFiles) { switch (chainingFile) { case APP_FILE: var appFilePath = Path.Combine(folderExtractingPath, APP_FILE); var appsListString = File.ReadAllText(appFilePath); var appsList = ConvertUtil.DeserializeObject <IEnumerable <App> >(appsListString); previewModel.Apps = await _appServiceProvider.CompareEntities(appsList); break; case STANDARD_FILE: var standardFilePath = Path.Combine(folderExtractingPath, STANDARD_FILE); var standardsString = File.ReadAllText(standardFilePath); var standarsList = ConvertUtil.DeserializeObject <IEnumerable <StandardComponent> >(standardsString); previewModel.Standards = await _standardServiceProvider.CompareStandardComponent(standarsList); break; case TREE_FILE: var treeFilePath = Path.Combine(folderExtractingPath, TREE_FILE); var treeString = File.ReadAllText(treeFilePath); var treeList = ConvertUtil.DeserializeObject <IEnumerable <StandardComponent> >(treeString); previewModel.Tree = await _standardServiceProvider.CompareStandardComponent(treeList); break; case ARRAY_FILE: var arrayFilePath = Path.Combine(folderExtractingPath, ARRAY_FILE); var arrayString = File.ReadAllText(arrayFilePath); var arrayList = ConvertUtil.DeserializeObject <IEnumerable <StandardComponent> >(arrayString); previewModel.Array = await _standardServiceProvider.CompareStandardComponent(arrayList); break; case CHART_FILE: var chartFilePath = Path.Combine(folderExtractingPath, CHART_FILE); var chartsString = File.ReadAllText(chartFilePath); var chartsList = ConvertUtil.DeserializeObject <IEnumerable <Chart> >(chartsString); previewModel.Charts = await _chartServiceProvider.CompareCharts(chartsList); break; case DATABASE_FILE: var databaseFilePath = Path.Combine(folderExtractingPath, DATABASE_FILE); var databasesString = File.ReadAllText(databaseFilePath); var databasesList = ConvertUtil.DeserializeObject <IEnumerable <DatabaseConnection> >(databasesString); previewModel.Databases = await _databaseServiceProvider.CompareDatabases(databasesList); break; case PAGE_FILE: var pageFilePath = Path.Combine(folderExtractingPath, PAGE_FILE); var pagesString = File.ReadAllText(pageFilePath); var pagesList = ConvertUtil.DeserializeObject <IEnumerable <Page> >(pagesString); previewModel.Pages = await _pageServiceProvider.ComparePages(pagesList); break; case DYNAMICLIST_FILE: var dynamicListFilePath = Path.Combine(folderExtractingPath, DYNAMICLIST_FILE); var dynamicListString = File.ReadAllText(dynamicListFilePath); var dynamicListsList = ConvertUtil.DeserializeObject <IEnumerable <DynamicList> >(dynamicListString); previewModel.DynamicLists = await _dynamicListServiceProvider.CompareDynamicLists(dynamicListsList); break; case COMPOSITE_CONTROL_FILE: var compositeFilePath = Path.Combine(folderExtractingPath, COMPOSITE_CONTROL_FILE); var compositeString = File.ReadAllText(compositeFilePath); var compositeControlsList = ConvertUtil.DeserializeObject <IEnumerable <CompositeControl> >(compositeString); previewModel.CompositeControls = await _compositeControlServiceProvider.Compare(compositeControlsList); break; default: break; } } Directory.Delete(folderExtractingPath, true); File.Delete(restoreFilePath); previewModel.TotalObjects = (previewModel.Apps != null ? previewModel.Apps.Count() : 0) + (previewModel.Charts != null ? previewModel.Charts.Count() : 0) + (previewModel.Databases != null ? previewModel.Databases.Count() : 0) + (previewModel.DynamicLists != null ? previewModel.DynamicLists.Count() : 0) + (previewModel.Pages != null ? previewModel.Pages.Count() : 0) + (previewModel.Standards != null ? previewModel.Standards.Count() : 0) + (previewModel.Tree != null ? previewModel.Tree.Count() : 0) + (previewModel.Array != null ? previewModel.Array.Count() : 0) + (previewModel.CompositeControls != null ? previewModel.CompositeControls.Count() : 0); previewModel.TotalNewObjects = (previewModel.Apps != null ? previewModel.Apps.Count(a => a.IsTotallyNew) : 0) + (previewModel.Charts != null ? previewModel.Charts.Count(a => a.IsTotallyNew) : 0) + (previewModel.Databases != null ? previewModel.Databases.Count(a => a.IsTotallyNew) : 0) + (previewModel.DynamicLists != null ? previewModel.DynamicLists.Count(a => a.IsTotallyNew) : 0) + (previewModel.Pages != null ? previewModel.Pages.Count(a => a.IsTotallyNew) : 0) + (previewModel.Standards != null ? previewModel.Standards.Count(a => a.IsTotallyNew) : 0) + (previewModel.Tree != null ? previewModel.Tree.Count(a => a.IsTotallyNew) : 0) + (previewModel.Array != null ? previewModel.Array.Count(a => a.IsTotallyNew) : 0) + (previewModel.CompositeControls != null ? previewModel.CompositeControls.Count(a => a.IsTotallyNew) : 0); previewModel.TotalUnchangedObjects = (previewModel.Apps != null ? previewModel.Apps.Count(a => a.IsUnchanged) : 0) + (previewModel.Charts != null ? previewModel.Charts.Count(a => a.IsUnchanged) : 0) + (previewModel.Databases != null ? previewModel.Databases.Count(a => a.IsUnchanged) : 0) + (previewModel.DynamicLists != null ? previewModel.DynamicLists.Count(a => a.IsUnchanged) : 0) + (previewModel.Pages != null ? previewModel.Pages.Count(a => a.IsUnchanged) : 0) + (previewModel.Standards != null ? previewModel.Standards.Count(a => a.IsUnchanged) : 0) + (previewModel.Tree != null ? previewModel.Tree.Count(a => a.IsUnchanged) : 0) + (previewModel.Array != null ? previewModel.Array.Count(a => a.IsUnchanged) : 0) + (previewModel.CompositeControls != null ? previewModel.CompositeControls.Count(a => a.IsUnchanged) : 0); previewModel.TotalChangedObjects = previewModel.TotalObjects - previewModel.TotalNewObjects - previewModel.TotalUnchangedObjects; return(previewModel); }