diff --git a/DepartmentPortal/Common/DatabaseCore/Scripts/SecureMigrationScript.cs b/DepartmentPortal/Common/DatabaseCore/Scripts/SecureMigrationScript.cs
index be16bc8..4d06d6e 100644
--- a/DepartmentPortal/Common/DatabaseCore/Scripts/SecureMigrationScript.cs
+++ b/DepartmentPortal/Common/DatabaseCore/Scripts/SecureMigrationScript.cs
@@ -24,8 +24,8 @@ GO";
SELECT Id, RoleName, RolePriority, DateCreate, DateDelete, IsDeleted FROM DepartmentDatabaseContext.dbo.DepartmentRoles";
private static readonly string userMigration =
-@"INSERT INTO DepartmentDatabasePortal.dbo.Users(Id, UserName, PasswordHash, StudentId, LecturerId, Avatar, DateLastVisit, IsBanned, DateBanned, CountAttempt, DateCreate, DateDelete, IsDeleted)
-SELECT Id, UserName, PasswordHash, StudentId, LecturerId, Avatar, DateLastVisit, IsLocked, DateBanned, CountAttempt, DateCreate, DateDelete, IsDeleted FROM DepartmentDatabaseContext.dbo.DepartmentUsers";
+@"INSERT INTO DepartmentDatabasePortal.dbo.Users(Id, UserName, PasswordHash, Avatar, DateLastVisit, IsBanned, DateBanned, CountAttempt, DateCreate, DateDelete, IsDeleted)
+SELECT Id, UserName, PasswordHash, Avatar, DateLastVisit, IsLocked, DateBanned, CountAttempt, DateCreate, DateDelete, IsDeleted FROM DepartmentDatabaseContext.dbo.DepartmentUsers";
private static readonly string userroleMigration =
@"INSERT INTO DepartmentDatabasePortal.dbo.UserRoles(Id, UserId, RoleId, DateCreate, DateDelete, IsDeleted)
diff --git a/DepartmentPortal/Security/SecurityBusinessLogic/BindingModels/BackupBindingModel.cs b/DepartmentPortal/Security/SecurityBusinessLogic/BindingModels/BackupBindingModel.cs
index 36bc449..405e1c3 100644
--- a/DepartmentPortal/Security/SecurityBusinessLogic/BindingModels/BackupBindingModel.cs
+++ b/DepartmentPortal/Security/SecurityBusinessLogic/BindingModels/BackupBindingModel.cs
@@ -19,5 +19,10 @@
/// Создать архив с выгрузкой
///
public bool CreateArchive { get; set; }
+
+ ///
+ /// Имя файла для архива
+ ///
+ public string ArchiveFileName { get; set; }
}
}
\ No newline at end of file
diff --git a/DepartmentPortal/Security/SecurityBusinessLogic/BusinessLogics/BackupBusinessLogic.cs b/DepartmentPortal/Security/SecurityBusinessLogic/BusinessLogics/BackupBusinessLogic.cs
index fed97cf..916bc94 100644
--- a/DepartmentPortal/Security/SecurityBusinessLogic/BusinessLogics/BackupBusinessLogic.cs
+++ b/DepartmentPortal/Security/SecurityBusinessLogic/BusinessLogics/BackupBusinessLogic.cs
@@ -1,14 +1,13 @@
using ModuleTools.BusinessLogics;
using ModuleTools.Enums;
+using ModuleTools.Extensions;
using ModuleTools.Interfaces;
using ModuleTools.Models;
using SecurityBusinessLogic.BindingModels;
using SecurityBusinessLogic.Interfaces;
using System;
using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.IO;
namespace SecurityBusinessLogic.BusinessLogics
{
@@ -17,18 +16,25 @@ namespace SecurityBusinessLogic.BusinessLogics
///
public class BackupBusinessLogic
{
- private IBackupService _service;
+ ///
+ /// Серивс для работы с бекапом
+ ///
+ private readonly IBackupService _service;
///
/// Менеджер безопасности
///
- private ISecurityManager _security;
+ private readonly ISecurityManager _security;
///
/// Перечень ошибок при выполнении операции
///
public List<(string Title, string Message)> Errors { get; protected set; }
+ ///
+ /// Логика работы с бекапом
+ ///
+ ///
public BackupBusinessLogic(IBackupService service)
{
_service = service;
@@ -36,19 +42,80 @@ namespace SecurityBusinessLogic.BusinessLogics
Errors = new();
}
+ ///
+ /// Создание бекапа с данными
+ ///
+ ///
+ ///
public bool CreateBackUp(BackupBindingModel model)
{
- if (NoAccess())
+ if (model.FolderName.IsEmpty())
{
+ Errors.Add(("Ошибка", "Путь до папки не указан"));
return false;
}
- var result = _service.CreateBackUp(model);
- if (!result.IsSucceeded)
+ try
{
- Errors.AddRange(result.Errors);
+ if (NoAccess())
+ {
+ return false;
+ }
+ var result = _service.CreateBackUp(model);
+ if (!result.IsSucceeded)
+ {
+ Errors.AddRange(result.Errors);
+ return false;
+ }
+ return true;
+ }
+ catch (Exception ex)
+ {
+ Errors.Add(("Ошибка", ex.Message));
+ return false;
+ }
+ }
+
+ ///
+ /// Восстанволение данных через бекап
+ ///
+ ///
+ ///
+ public bool RestoreBackUp(BackupBindingModel model)
+ {
+ if (model.FolderName.IsEmpty() && model.ArchiveFileName.IsEmpty())
+ {
+ Errors.Add(("Ошибка", "Путь до папки/архива не указан"));
+ return false;
+ }
+ if (model.ArchiveFileName.IsNotEmpty() && !File.Exists(model.ArchiveFileName))
+ {
+ Errors.Add(("Ошибка", "Файл с архивом не найден"));
+ return false;
+ }
+ if (model.ArchiveFileName.IsEmpty() && !Directory.Exists(model.FolderName))
+ {
+ Errors.Add(("Ошибка", "Папка с даными не найдена"));
+ return false;
+ }
+ try
+ {
+ if (NoAccess())
+ {
+ return false;
+ }
+ var result = _service.RestoreBackUp(model);
+ if (!result.IsSucceeded)
+ {
+ Errors.AddRange(result.Errors);
+ return false;
+ }
+ return true;
+ }
+ catch (Exception ex)
+ {
+ Errors.Add(("Ошибка", ex.Message));
return false;
}
- return true;
}
///
@@ -57,7 +124,7 @@ namespace SecurityBusinessLogic.BusinessLogics
///
private bool NoAccess()
{
- if (_security.CheckAccess(new SecurityManagerCheckAccessModel(null, AccessOperation.РаботасБекапом, AccessType.View, "бекап")))
+ if (_security.CheckAccess(new SecurityManagerCheckAccessModel(null, AccessOperation.РаботасБекапом, AccessType.Delete, "бекап")))
{
return false;
}
diff --git a/DepartmentPortal/Security/SecurityBusinessLogic/Interfaces/IBackupService.cs b/DepartmentPortal/Security/SecurityBusinessLogic/Interfaces/IBackupService.cs
index 4eb339d..9b67b80 100644
--- a/DepartmentPortal/Security/SecurityBusinessLogic/Interfaces/IBackupService.cs
+++ b/DepartmentPortal/Security/SecurityBusinessLogic/Interfaces/IBackupService.cs
@@ -8,6 +8,18 @@ namespace SecurityBusinessLogic.Interfaces
///
public interface IBackupService
{
+ ///
+ /// Создание бекапа с данными
+ ///
+ ///
+ ///
OperationResultModel CreateBackUp(BackupBindingModel model);
+
+ ///
+ /// Восстанволение данных через бекап
+ ///
+ ///
+ ///
+ OperationResultModel RestoreBackUp(BackupBindingModel model);
}
}
\ No newline at end of file
diff --git a/DepartmentPortal/Security/SecurityDatabaseImplementation/Implementations/BackupJsonContractService.cs b/DepartmentPortal/Security/SecurityDatabaseImplementation/Implementations/BackupJsonContractService.cs
new file mode 100644
index 0000000..6a5276f
--- /dev/null
+++ b/DepartmentPortal/Security/SecurityDatabaseImplementation/Implementations/BackupJsonContractService.cs
@@ -0,0 +1,201 @@
+using DatabaseCore;
+using ModuleTools.Attributes;
+using ModuleTools.Extensions;
+using ModuleTools.Interfaces;
+using ModuleTools.Models;
+using SecurityBusinessLogic.BindingModels;
+using SecurityBusinessLogic.Interfaces;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.IO.Compression;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.Serialization.Json;
+
+namespace SecurityDatabaseImplementation.Implementations
+{
+ ///
+ /// Реализация IBackupService для сохранения в JSON через JsonContract
+ ///
+ public class BackupJsonContractService : IBackupService
+ {
+ public OperationResultModel CreateBackUp(BackupBindingModel model)
+ {
+ try
+ {
+ var asm = typeof(DatabaseManager).Assembly;
+ MethodInfo method = GetType().GetTypeInfo().GetDeclaredMethod("SaveToFile");
+ foreach (var t in asm.GetExportedTypes())
+ {
+ if (t.IsClass && t.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEntitySecurityExtenstion<>)) &&
+ t.GetCustomAttribute() != null)
+ {
+ MethodInfo generic = method.MakeGenericMethod(t);
+ generic.Invoke(this, new object[] { model.FolderName, model.FullData, t });
+ }
+ }
+ if (model.CreateArchive)
+ {
+ var fileName = $"{model.FolderName}.zip";
+ if (File.Exists(fileName))
+ {
+ File.Delete($"{model.FolderName}.zip");
+ }
+ ZipFile.CreateFromDirectory(model.FolderName, fileName);
+ }
+ }
+ catch (Exception ex)
+ {
+ return OperationResultModel.Error(ex);
+ }
+ return OperationResultModel.Success(null);
+ }
+
+ public OperationResultModel RestoreBackUp(BackupBindingModel model)
+ {
+ try
+ {
+ if (model.ArchiveFileName.IsNotEmpty())
+ {
+ if(model.FolderName.IsEmpty())
+ {
+ model.FolderName = $"{Path.GetDirectoryName(model.ArchiveFileName)}{Path.GetFileNameWithoutExtension(model.ArchiveFileName)}";
+ }
+ ZipFile.ExtractToDirectory(model.ArchiveFileName, model.FolderName);
+ }
+ var asm = typeof(DatabaseManager).Assembly;
+ #region вытаскиваем все типы-сущности (они должны быть унаследованы от IEntitySecurityExtenstion и иметь атрибут EntityDescription)
+ List types = new();
+ foreach (var t in asm.GetExportedTypes())
+ {
+ if (t.IsClass && t.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEntitySecurityExtenstion<>)) &&
+ t.GetCustomAttribute() != null)
+ {
+ types.Add(t);
+ }
+ }
+ #endregion
+
+ #region формиурем зависимости (в каком порядке загружать данные)
+ Dictionary typesWithLevel = new();
+ while (types.Count > 0)
+ {
+ for (int i = 0; i < types.Count; ++i)
+ {
+ var depends = types[i].GetCustomAttributes();
+ if ((depends == null || !depends.Any()) && !typesWithLevel.ContainsKey(types[i]))
+ {
+ typesWithLevel.Add(types[i], 0);
+ types.RemoveAt(i--);
+ continue;
+ }
+
+ int? level = null;
+ foreach (var depend in depends)
+ {
+ var type = typesWithLevel.Keys.FirstOrDefault(x => x.Name == depend.ClassName);
+ if (type != null)
+ {
+ if (!level.HasValue)
+ {
+ level = typesWithLevel[type];
+ }
+ else if (level < typesWithLevel[type])
+ {
+ level = typesWithLevel[type];
+ }
+ }
+ else
+ {
+ level = null;
+ break;
+ }
+ }
+
+ if (level.HasValue)
+ {
+ typesWithLevel.Add(types[i], level.Value + 1);
+ types.RemoveAt(i--);
+ continue;
+ }
+ }
+ }
+ #endregion
+
+ #region Удаляем записи сначала из тех, на которые никкто не ссылается и в последнюю оередь, те, на которые все ссылаются
+ var deleteOrder = typesWithLevel.OrderByDescending(x => x.Value);
+ MethodInfo delMethod = GetType().GetTypeInfo().GetDeclaredMethod("DeleteFromDB");
+ foreach (var delElem in deleteOrder)
+ {
+ if (File.Exists(string.Format("{0}/{1}.json", model.FolderName, delElem.Key.Name)))
+ {
+ MethodInfo generic = delMethod.MakeGenericMethod(delElem.Key);
+ generic.Invoke(this, null);
+ }
+ }
+ #endregion
+
+ #region Заполняем в порядке - сначала те, у которых нет родителей, потом их потомство
+ MethodInfo method = GetType().GetTypeInfo().GetDeclaredMethod("LoadFromFile");
+ foreach (var delElem in typesWithLevel.OrderBy(x => x.Value))
+ {
+ MethodInfo generic = method.MakeGenericMethod(delElem.Key);
+ generic.Invoke(this, new object[] { model.FolderName, delElem.Key });
+ }
+ #endregion
+ }
+ catch (Exception ex)
+ {
+ return OperationResultModel.Error(ex);
+ }
+ return OperationResultModel.Success(null);
+ }
+
+ ///
+ /// Сохранение списка сущности из БД в файл (вызывается через рефлексию)
+ ///
+ ///
+ ///
+ ///
+ ///
+ private void SaveToFile(string folderName, bool allowFullData, Type t) where T : class, IEntitySecurityExtenstion, new()
+ {
+ using var context = DatabaseManager.GetContext;
+ var records = context.Set().Select(x => x.SecurityCheck(x, allowFullData));
+ DataContractJsonSerializer jsonFormatter = new(typeof(List));
+ using FileStream fs = new(string.Format("{0}/{1}.json", folderName, t.Name), FileMode.OpenOrCreate);
+ jsonFormatter.WriteObject(fs, records);
+ }
+
+ ///
+ /// Отчистка записей сущности в БД (вызывается через рефлексию)
+ ///
+ ///
+ private void DeleteFromDB() where T : class, new()
+ {
+ using var context = DatabaseManager.GetContext;
+ context.Set().RemoveRange(context.Set());
+ context.SaveChanges();
+ }
+
+ ///
+ /// Загрузка списка сущности из файла в БД (вызывается через рефлексию)
+ ///
+ ///
+ ///
+ ///
+ private void LoadFromFile(string folderName, Type t) where T : class, new()
+ {
+ using var context = DatabaseManager.GetContext;
+ if (File.Exists(string.Format("{0}/{1}.json", folderName, t.Name)))
+ {
+ DataContractJsonSerializer jsonFormatter = new(typeof(List));
+ using FileStream fs = new(string.Format("{0}/{1}.json", folderName, t.Name), FileMode.Open);
+ List records = (List)jsonFormatter.ReadObject(fs);
+ context.Set().AddRange(records);
+ context.SaveChanges();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Security/SecurityDatabaseImplementation/Implementations/BackupService.cs b/DepartmentPortal/Security/SecurityDatabaseImplementation/Implementations/BackupService.cs
deleted file mode 100644
index a7f799b..0000000
--- a/DepartmentPortal/Security/SecurityDatabaseImplementation/Implementations/BackupService.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using DatabaseCore;
-using ModuleTools.Interfaces;
-using ModuleTools.Models;
-using SecurityBusinessLogic.BindingModels;
-using SecurityBusinessLogic.Interfaces;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.IO.Compression;
-using System.Linq;
-using System.Reflection;
-using System.Runtime.Serialization.Json;
-
-namespace SecurityDatabaseImplementation.Implementations
-{
- public class BackupService : IBackupService
- {
- public OperationResultModel CreateBackUp(BackupBindingModel model)
- {
- try
- {
- var asm = typeof(DatabaseManager).Assembly;
- MethodInfo method = GetType().GetTypeInfo().GetDeclaredMethod("SaveToFile");
- foreach (var t in asm.GetExportedTypes())
- {
- if (t.IsClass && t.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEntitySecurityExtenstion<>)))
- {
- var elem = asm.CreateInstance(t.FullName);
- MethodInfo generic = method.MakeGenericMethod(elem.GetType());
- generic.Invoke(this, new object[] { model.FolderName, model.FullData, t });
- }
- }
- if (model.CreateArchive)
- {
- ZipFile.CreateFromDirectory(model.FolderName, $"{model.FolderName}.zip");
- }
- }
- catch (Exception ex)
- {
- return OperationResultModel.Error(ex);
- }
- return OperationResultModel.Success(null);
- }
-
- private void SaveToFile(string folderName, bool allowFullData, Type t) where T : class, IEntitySecurityExtenstion, new()
- {
- using var context = DatabaseManager.GetContext;
- var records = context.Set().Select(x => x.SecurityCheck(x, allowFullData));
- DataContractJsonSerializer jsonFormatter = new(typeof(List));
- using FileStream fs = new(string.Format("{0}/{1}.json", folderName, t.Name), FileMode.OpenOrCreate);
- jsonFormatter.WriteObject(fs, records);
- }
- }
-}
\ No newline at end of file
diff --git a/DepartmentPortal/Security/SecurityDatabaseImplementation/SecurityImplementationExtensions.cs b/DepartmentPortal/Security/SecurityDatabaseImplementation/SecurityImplementationExtensions.cs
index 4c12d2b..dbb1deb 100644
--- a/DepartmentPortal/Security/SecurityDatabaseImplementation/SecurityImplementationExtensions.cs
+++ b/DepartmentPortal/Security/SecurityDatabaseImplementation/SecurityImplementationExtensions.cs
@@ -15,7 +15,7 @@ namespace SecurityDatabaseImplementation
DependencyManager.Instance.RegisterType();
DependencyManager.Instance.RegisterType();
- DependencyManager.Instance.RegisterType();
+ DependencyManager.Instance.RegisterType();
}
}
}
\ No newline at end of file
diff --git a/DepartmentPortal/Security/SecurityWindowsDesktop/SpecialControls/BackupControl.Designer.cs b/DepartmentPortal/Security/SecurityWindowsDesktop/SpecialControls/BackupControl.Designer.cs
index c14102e..5074b61 100644
--- a/DepartmentPortal/Security/SecurityWindowsDesktop/SpecialControls/BackupControl.Designer.cs
+++ b/DepartmentPortal/Security/SecurityWindowsDesktop/SpecialControls/BackupControl.Designer.cs
@@ -33,13 +33,22 @@ namespace SecurityWindowsDesktop.SpecialControls
this.buttonCreateBackup = new System.Windows.Forms.Button();
this.checkBoxCreateArchive = new System.Windows.Forms.CheckBox();
this.checkBoxFullLoad = new System.Windows.Forms.CheckBox();
- this.buttonSelectFolder = new System.Windows.Forms.Button();
- this.textBoxFolderName = new System.Windows.Forms.TextBox();
- this.labelFolderName = new System.Windows.Forms.Label();
+ this.buttonSaveSelectFolder = new System.Windows.Forms.Button();
+ this.textBoxSaveFolderName = new System.Windows.Forms.TextBox();
+ this.labelSaveFolderName = new System.Windows.Forms.Label();
this.toolStripHeader = new System.Windows.Forms.ToolStrip();
this.toolStripButtonClose = new System.Windows.Forms.ToolStripButton();
+ this.groupBoxLoadBackup = new System.Windows.Forms.GroupBox();
+ this.buttonRestoreBackup = new System.Windows.Forms.Button();
+ this.buttonLoadArchiveSelect = new System.Windows.Forms.Button();
+ this.textBoxLoadArchiveName = new System.Windows.Forms.TextBox();
+ this.labelLoadArchiveName = new System.Windows.Forms.Label();
+ this.buttonLoadSelectFolder = new System.Windows.Forms.Button();
+ this.textBoxLoadFolderName = new System.Windows.Forms.TextBox();
+ this.labelLoadFolderName = new System.Windows.Forms.Label();
this.groupBoxSaveBackup.SuspendLayout();
this.toolStripHeader.SuspendLayout();
+ this.groupBoxLoadBackup.SuspendLayout();
this.SuspendLayout();
//
// groupBoxSaveBackup
@@ -47,9 +56,9 @@ namespace SecurityWindowsDesktop.SpecialControls
this.groupBoxSaveBackup.Controls.Add(this.buttonCreateBackup);
this.groupBoxSaveBackup.Controls.Add(this.checkBoxCreateArchive);
this.groupBoxSaveBackup.Controls.Add(this.checkBoxFullLoad);
- this.groupBoxSaveBackup.Controls.Add(this.buttonSelectFolder);
- this.groupBoxSaveBackup.Controls.Add(this.textBoxFolderName);
- this.groupBoxSaveBackup.Controls.Add(this.labelFolderName);
+ this.groupBoxSaveBackup.Controls.Add(this.buttonSaveSelectFolder);
+ this.groupBoxSaveBackup.Controls.Add(this.textBoxSaveFolderName);
+ this.groupBoxSaveBackup.Controls.Add(this.labelSaveFolderName);
this.groupBoxSaveBackup.Location = new System.Drawing.Point(0, 28);
this.groupBoxSaveBackup.Name = "groupBoxSaveBackup";
this.groupBoxSaveBackup.Size = new System.Drawing.Size(496, 100);
@@ -87,31 +96,31 @@ namespace SecurityWindowsDesktop.SpecialControls
this.checkBoxFullLoad.Text = "Полная выгрузка";
this.checkBoxFullLoad.UseVisualStyleBackColor = true;
//
- // buttonSelectFolder
+ // buttonSaveSelectFolder
//
- this.buttonSelectFolder.Location = new System.Drawing.Point(385, 26);
- this.buttonSelectFolder.Name = "buttonSelectFolder";
- this.buttonSelectFolder.Size = new System.Drawing.Size(99, 23);
- this.buttonSelectFolder.TabIndex = 2;
- this.buttonSelectFolder.Text = "Выбрать папку";
- this.buttonSelectFolder.UseVisualStyleBackColor = true;
- this.buttonSelectFolder.Click += new System.EventHandler(this.ButtonSelectFolder_Click);
+ this.buttonSaveSelectFolder.Location = new System.Drawing.Point(385, 26);
+ this.buttonSaveSelectFolder.Name = "buttonSaveSelectFolder";
+ this.buttonSaveSelectFolder.Size = new System.Drawing.Size(99, 23);
+ this.buttonSaveSelectFolder.TabIndex = 2;
+ this.buttonSaveSelectFolder.Text = "Выбрать папку";
+ this.buttonSaveSelectFolder.UseVisualStyleBackColor = true;
+ this.buttonSaveSelectFolder.Click += new System.EventHandler(this.ButtonSaveSelectFolder_Click);
//
- // textBoxFolderName
+ // textBoxSaveFolderName
//
- this.textBoxFolderName.Location = new System.Drawing.Point(107, 26);
- this.textBoxFolderName.Name = "textBoxFolderName";
- this.textBoxFolderName.Size = new System.Drawing.Size(272, 23);
- this.textBoxFolderName.TabIndex = 1;
+ this.textBoxSaveFolderName.Location = new System.Drawing.Point(110, 26);
+ this.textBoxSaveFolderName.Name = "textBoxSaveFolderName";
+ this.textBoxSaveFolderName.Size = new System.Drawing.Size(269, 23);
+ this.textBoxSaveFolderName.TabIndex = 1;
//
- // labelFolderName
+ // labelSaveFolderName
//
- this.labelFolderName.AutoSize = true;
- this.labelFolderName.Location = new System.Drawing.Point(16, 29);
- this.labelFolderName.Name = "labelFolderName";
- this.labelFolderName.Size = new System.Drawing.Size(85, 15);
- this.labelFolderName.TabIndex = 0;
- this.labelFolderName.Text = "Путь до папки";
+ this.labelSaveFolderName.AutoSize = true;
+ this.labelSaveFolderName.Location = new System.Drawing.Point(16, 29);
+ this.labelSaveFolderName.Name = "labelSaveFolderName";
+ this.labelSaveFolderName.Size = new System.Drawing.Size(85, 15);
+ this.labelSaveFolderName.TabIndex = 0;
+ this.labelSaveFolderName.Text = "Путь до папки";
//
// toolStripHeader
//
@@ -134,10 +143,89 @@ namespace SecurityWindowsDesktop.SpecialControls
this.toolStripButtonClose.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonClose.Text = "Закрыть";
//
+ // groupBoxLoadBackup
+ //
+ this.groupBoxLoadBackup.Controls.Add(this.buttonRestoreBackup);
+ this.groupBoxLoadBackup.Controls.Add(this.buttonLoadArchiveSelect);
+ this.groupBoxLoadBackup.Controls.Add(this.textBoxLoadArchiveName);
+ this.groupBoxLoadBackup.Controls.Add(this.labelLoadArchiveName);
+ this.groupBoxLoadBackup.Controls.Add(this.buttonLoadSelectFolder);
+ this.groupBoxLoadBackup.Controls.Add(this.textBoxLoadFolderName);
+ this.groupBoxLoadBackup.Controls.Add(this.labelLoadFolderName);
+ this.groupBoxLoadBackup.Location = new System.Drawing.Point(0, 134);
+ this.groupBoxLoadBackup.Name = "groupBoxLoadBackup";
+ this.groupBoxLoadBackup.Size = new System.Drawing.Size(496, 137);
+ this.groupBoxLoadBackup.TabIndex = 2;
+ this.groupBoxLoadBackup.TabStop = false;
+ this.groupBoxLoadBackup.Text = "Загрузка из бекапа";
+ //
+ // buttonRestoreBackup
+ //
+ this.buttonRestoreBackup.Location = new System.Drawing.Point(383, 99);
+ this.buttonRestoreBackup.Name = "buttonRestoreBackup";
+ this.buttonRestoreBackup.Size = new System.Drawing.Size(99, 23);
+ this.buttonRestoreBackup.TabIndex = 9;
+ this.buttonRestoreBackup.Text = "Загрузить";
+ this.buttonRestoreBackup.UseVisualStyleBackColor = true;
+ this.buttonRestoreBackup.Click += new System.EventHandler(this.ButtonRestoreBackup_Click);
+ //
+ // buttonLoadArchiveSelect
+ //
+ this.buttonLoadArchiveSelect.Location = new System.Drawing.Point(383, 64);
+ this.buttonLoadArchiveSelect.Name = "buttonLoadArchiveSelect";
+ this.buttonLoadArchiveSelect.Size = new System.Drawing.Size(99, 23);
+ this.buttonLoadArchiveSelect.TabIndex = 8;
+ this.buttonLoadArchiveSelect.Text = "Выбрать файл";
+ this.buttonLoadArchiveSelect.UseVisualStyleBackColor = true;
+ this.buttonLoadArchiveSelect.Click += new System.EventHandler(this.ButtonLoadArchiveSelect_Click);
+ //
+ // textBoxLoadArchiveName
+ //
+ this.textBoxLoadArchiveName.Location = new System.Drawing.Point(110, 64);
+ this.textBoxLoadArchiveName.Name = "textBoxLoadArchiveName";
+ this.textBoxLoadArchiveName.Size = new System.Drawing.Size(267, 23);
+ this.textBoxLoadArchiveName.TabIndex = 7;
+ //
+ // labelLoadArchiveName
+ //
+ this.labelLoadArchiveName.AutoSize = true;
+ this.labelLoadArchiveName.Location = new System.Drawing.Point(14, 67);
+ this.labelLoadArchiveName.Name = "labelLoadArchiveName";
+ this.labelLoadArchiveName.Size = new System.Drawing.Size(90, 15);
+ this.labelLoadArchiveName.TabIndex = 6;
+ this.labelLoadArchiveName.Text = "Путь до архива";
+ //
+ // buttonLoadSelectFolder
+ //
+ this.buttonLoadSelectFolder.Location = new System.Drawing.Point(385, 28);
+ this.buttonLoadSelectFolder.Name = "buttonLoadSelectFolder";
+ this.buttonLoadSelectFolder.Size = new System.Drawing.Size(99, 23);
+ this.buttonLoadSelectFolder.TabIndex = 5;
+ this.buttonLoadSelectFolder.Text = "Выбрать папку";
+ this.buttonLoadSelectFolder.UseVisualStyleBackColor = true;
+ this.buttonLoadSelectFolder.Click += new System.EventHandler(this.ButtonLoadSelectFolder_Click);
+ //
+ // textBoxLoadFolderName
+ //
+ this.textBoxLoadFolderName.Location = new System.Drawing.Point(110, 28);
+ this.textBoxLoadFolderName.Name = "textBoxLoadFolderName";
+ this.textBoxLoadFolderName.Size = new System.Drawing.Size(269, 23);
+ this.textBoxLoadFolderName.TabIndex = 4;
+ //
+ // labelLoadFolderName
+ //
+ this.labelLoadFolderName.AutoSize = true;
+ this.labelLoadFolderName.Location = new System.Drawing.Point(16, 31);
+ this.labelLoadFolderName.Name = "labelLoadFolderName";
+ this.labelLoadFolderName.Size = new System.Drawing.Size(85, 15);
+ this.labelLoadFolderName.TabIndex = 3;
+ this.labelLoadFolderName.Text = "Путь до папки";
+ //
// BackupControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.groupBoxLoadBackup);
this.Controls.Add(this.toolStripHeader);
this.Controls.Add(this.groupBoxSaveBackup);
this.Name = "BackupControl";
@@ -146,6 +234,8 @@ namespace SecurityWindowsDesktop.SpecialControls
this.groupBoxSaveBackup.PerformLayout();
this.toolStripHeader.ResumeLayout(false);
this.toolStripHeader.PerformLayout();
+ this.groupBoxLoadBackup.ResumeLayout(false);
+ this.groupBoxLoadBackup.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
@@ -154,13 +244,21 @@ namespace SecurityWindowsDesktop.SpecialControls
#endregion
private System.Windows.Forms.GroupBox groupBoxSaveBackup;
- private System.Windows.Forms.Label labelFolderName;
- private System.Windows.Forms.TextBox textBoxFolderName;
- private System.Windows.Forms.Button buttonSelectFolder;
+ private System.Windows.Forms.Label labelSaveFolderName;
+ private System.Windows.Forms.TextBox textBoxSaveFolderName;
+ private System.Windows.Forms.Button buttonSaveSelectFolder;
private System.Windows.Forms.CheckBox checkBoxCreateArchive;
private System.Windows.Forms.Button buttonCreateBackup;
private System.Windows.Forms.CheckBox checkBoxFullLoad;
private System.Windows.Forms.ToolStrip toolStripHeader;
private System.Windows.Forms.ToolStripButton toolStripButtonClose;
+ private System.Windows.Forms.GroupBox groupBoxLoadBackup;
+ private System.Windows.Forms.TextBox textBoxLoadFolderName;
+ private System.Windows.Forms.Label labelLoadFolderName;
+ private System.Windows.Forms.Button buttonLoadSelectFolder;
+ private System.Windows.Forms.Label labelLoadArchiveName;
+ private System.Windows.Forms.TextBox textBoxLoadArchiveName;
+ private System.Windows.Forms.Button buttonLoadArchiveSelect;
+ private System.Windows.Forms.Button buttonRestoreBackup;
}
}
diff --git a/DepartmentPortal/Security/SecurityWindowsDesktop/SpecialControls/BackupControl.cs b/DepartmentPortal/Security/SecurityWindowsDesktop/SpecialControls/BackupControl.cs
index fa577d3..7717bf1 100644
--- a/DepartmentPortal/Security/SecurityWindowsDesktop/SpecialControls/BackupControl.cs
+++ b/DepartmentPortal/Security/SecurityWindowsDesktop/SpecialControls/BackupControl.cs
@@ -7,11 +7,18 @@ using SecurityBusinessLogic.BindingModels;
using SecurityBusinessLogic.BusinessLogics;
using System;
using System.Windows.Forms;
+using System.Xml.Linq;
namespace SecurityWindowsDesktop.SpecialControls
{
+ ///
+ /// Контрол для работы с бекапом
+ ///
public partial class BackupControl : UserControl, IControl
{
+ ///
+ /// Класс с бизнес-лоникой работы с бекапом
+ ///
private readonly BackupBusinessLogic _businessLogic;
///
@@ -19,6 +26,9 @@ namespace SecurityWindowsDesktop.SpecialControls
///
private event Action CloseEvent;
+ ///
+ /// Контрол для работы с бекапом
+ ///
public BackupControl()
{
InitializeComponent();
@@ -28,6 +38,7 @@ namespace SecurityWindowsDesktop.SpecialControls
AccessOperation = AccessOperation.РаботасБекапом;
}
+ #region IControl
public Guid ControlId { get; private set; }
public string Title { get; private set; }
@@ -36,10 +47,6 @@ namespace SecurityWindowsDesktop.SpecialControls
public IControl GetInstance() => new BackupControl() { ControlId = Guid.NewGuid() };
- public void LoadFromXml(string xml)
- {
- }
-
public void Open(ControlOpenModel model)
{
if (model.CloseList != null)
@@ -49,25 +56,58 @@ namespace SecurityWindowsDesktop.SpecialControls
Dock = DockStyle.Fill;
}
- public string SaveToXml()
+ public string SaveToXml() => new XElement("Control",
+ new XAttribute("Type", GetType().FullName),
+ new XAttribute("ControlId", ControlId),
+ new XAttribute("Title", Title),
+ new XAttribute("AccessOperation", AccessOperation)).ToString();
+
+ public void LoadFromXml(string xml)
{
- return string.Empty;
+ var control = XElement.Parse(xml);
+ ControlId = new Guid(control.Attribute("ControlId").Value.ToString());
+ Title = control.Attribute("Title").Value.ToString();
+ AccessOperation = (AccessOperation)Enum.Parse(typeof(AccessOperation), control.Attribute("AccessOperation").Value.ToString());
+ }
+ #endregion
+
+ ///
+ /// Закрытие контрола
+ ///
+ ///
+ ///
+ private void ToolStripHeader_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
+ {
+ CloseEvent?.Invoke(ControlId);
+ Dispose();
}
- private void ButtonSelectFolder_Click(object sender, EventArgs e)
+ ///
+ /// Выбор пути для папки сохранения бекапа
+ ///
+ ///
+ ///
+ private void ButtonSaveSelectFolder_Click(object sender, EventArgs e)
{
var fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() == DialogResult.OK)
{
- textBoxFolderName.Text = fbd.SelectedPath;
+ textBoxSaveFolderName.Text = fbd.SelectedPath;
}
}
+ ///
+ /// Создание бекапа
+ ///
+ ///
+ ///
private void ButtonCreateBackup_Click(object sender, EventArgs e)
{
+ var cursor = Cursor.Current;
+ Cursor.Current = Cursors.WaitCursor;
if (_businessLogic.CreateBackUp(new BackupBindingModel
{
- FolderName = textBoxFolderName.Text,
+ FolderName = textBoxSaveFolderName.Text,
FullData = checkBoxFullLoad.Checked,
CreateArchive = checkBoxCreateArchive.Checked
}))
@@ -78,12 +118,59 @@ namespace SecurityWindowsDesktop.SpecialControls
{
DialogHelper.MessageException(_businessLogic.Errors, "Ошибки при сохранении");
}
+ Cursor.Current = cursor;
}
- private void ToolStripHeader_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
+ ///
+ /// Выбор пути для папки восстановления бекапа
+ ///
+ ///
+ ///
+ private void ButtonLoadSelectFolder_Click(object sender, EventArgs e)
{
- CloseEvent?.Invoke(ControlId);
- Dispose();
+ var fbd = new FolderBrowserDialog();
+ if (fbd.ShowDialog() == DialogResult.OK)
+ {
+ textBoxLoadFolderName.Text = fbd.SelectedPath;
+ }
+ }
+
+ ///
+ /// Выбор пути для файла-архива с бекапом
+ ///
+ ///
+ ///
+ private void ButtonLoadArchiveSelect_Click(object sender, EventArgs e)
+ {
+ var ofd = new OpenFileDialog();
+ if (ofd.ShowDialog() == DialogResult.OK)
+ {
+ textBoxLoadArchiveName.Text = ofd.FileName;
+ }
+ }
+
+ ///
+ /// Восстановление
+ ///
+ ///
+ ///
+ private void ButtonRestoreBackup_Click(object sender, EventArgs e)
+ {
+ var cursor = Cursor.Current;
+ Cursor.Current = Cursors.WaitCursor;
+ if (_businessLogic.RestoreBackUp(new BackupBindingModel
+ {
+ FolderName = textBoxLoadFolderName.Text,
+ ArchiveFileName = textBoxLoadArchiveName.Text
+ }))
+ {
+ DialogHelper.MessageInformation("Сохранение прошло успешно", "Результат");
+ }
+ else
+ {
+ DialogHelper.MessageException(_businessLogic.Errors, "Ошибки при сохранении");
+ }
+ Cursor.Current = cursor;
}
}
}
\ No newline at end of file