99 lines
4.6 KiB
C#
99 lines
4.6 KiB
C#
using DressAtelierContracts.BindingModels;
|
|
using DressAtelierContracts.BusinessLogicContracts;
|
|
using DressAtelierContracts.StorageContracts;
|
|
using DressAtelierDataModels;
|
|
using Microsoft.Extensions.Logging;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO.Compression;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Runtime.Serialization.Json;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace DressAtelierBusinessLogic.BusinessLogic
|
|
{
|
|
public class BackupLogic : IBackupLogic
|
|
{
|
|
private readonly ILogger _logger;
|
|
private readonly IBackupInfo _backupInfo;
|
|
public BackupLogic(ILogger<BackupLogic> logger, IBackupInfo backupInfo)
|
|
{
|
|
_logger = logger;
|
|
_backupInfo = backupInfo;
|
|
}
|
|
public void CreateBackup(BackupSaveBindingModel model)
|
|
{
|
|
if (_backupInfo == null) { return; }
|
|
|
|
try
|
|
{
|
|
_logger.LogDebug("Clear folder");
|
|
// removing data from dir and old archive deletion
|
|
var dirInfo = new DirectoryInfo(model.FolderName);
|
|
if (dirInfo.Exists)
|
|
{
|
|
foreach (var file in dirInfo.GetFiles())
|
|
{
|
|
file.Delete();
|
|
}
|
|
}
|
|
_logger.LogDebug("Delete archive");
|
|
string fileName = $"{model.FolderName}.zip";
|
|
|
|
if (File.Exists(fileName))
|
|
{
|
|
File.Delete(fileName);
|
|
}
|
|
// taking method for saving
|
|
_logger.LogDebug("Get assembly");
|
|
var typeIID = typeof(IID);
|
|
var assembly = typeIID.Assembly;
|
|
if (assembly == null)
|
|
{
|
|
throw new ArgumentNullException("Assembly wasn't found", nameof(assembly));
|
|
}
|
|
var types = assembly.GetTypes();
|
|
var method = GetType().GetMethod("SaveToFile", BindingFlags.NonPublic | BindingFlags.Instance);
|
|
_logger.LogDebug("Find {count} types", types.Length);
|
|
foreach (var type in types)
|
|
{
|
|
if (type.IsInterface && type.GetInterface(typeIID.Name) != null)
|
|
{
|
|
var modelType = _backupInfo.GetTypeByModelInterface(type.Name);
|
|
if (modelType == null)
|
|
{
|
|
throw new InvalidOperationException($"Class-model wasn't found for {type.Name}");
|
|
}
|
|
_logger.LogDebug("Call SaveToFile method for {name} type", type.Name);
|
|
// call method to perform
|
|
method?.MakeGenericMethod(modelType).Invoke(this, new object[] { model.FolderName });
|
|
}
|
|
}
|
|
_logger.LogDebug("Create zip and remove folder");
|
|
// archive
|
|
ZipFile.CreateFromDirectory(model.FolderName, fileName);
|
|
// folder deletion
|
|
dirInfo.Delete(true);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
throw;
|
|
}
|
|
}
|
|
|
|
private void SaveToFile<T>(string folderName) where T : class, new()
|
|
{
|
|
var records = _backupInfo.GetList<T>();
|
|
if (records == null)
|
|
{
|
|
_logger.LogWarning("{type} type get null list", typeof(T).Name);
|
|
return;
|
|
}
|
|
var jsonFormatter = new DataContractJsonSerializer(typeof(List<T>));
|
|
using var fs = new FileStream(string.Format("{0}/{1}.json", folderName, typeof(T).Name), FileMode.OpenOrCreate);
|
|
jsonFormatter.WriteObject(fs, records); }
|
|
}
|
|
}
|