using System.IO.Compression; using System.Reflection; using System.Runtime.Serialization.Json; using Microsoft.Extensions.Logging; using SushiBarContracts.BindingModels; using SushiBarContracts.BusinessLogicsContracts; using SushiBarContracts.StoragesContracts; using SushiBarDataModels; namespace SushiBarBusinessLogic.BusinessLogics; public class BackUpLogic : IBackUpLogic { private readonly ILogger _logger; private readonly IBackUpInfo _backUpInfo; public BackUpLogic(ILogger logger, IBackUpInfo backUpInfo) { _logger = logger; _backUpInfo = backUpInfo; } public void CreateBackUp(BackUpSaveBindingModel model) { _logger.LogDebug("Clear folder"); var dirInfo = new DirectoryInfo(model.FolderName); if (dirInfo.Exists) { foreach (var file in dirInfo.GetFiles()) { file.Delete(); } } _logger.LogDebug("Delete archive"); var fileName = $"{model.FolderName}.zip"; if (File.Exists(fileName)) File.Delete(fileName); _logger.LogDebug("Get assembly"); var typeIId = typeof(IId); var assembly = typeIId.Assembly; if (assembly == null) { throw new ArgumentNullException("Not 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) continue; var modelType = _backUpInfo.GetTypeByModelInterface(type.Name); if (modelType == null) { throw new InvalidOperationException($"Not fount model {type.Name}"); } _logger.LogDebug("Call SaveToFile method for {name} type", type.Name); method?.MakeGenericMethod(modelType).Invoke(this, new object[] { model.FolderName }); } _logger.LogDebug("Create zip and remove folder"); ZipFile.CreateFromDirectory(model.FolderName, fileName); dirInfo.Delete(true); } private void SaveToFile(string folderName) where T : class, new() { var records = _backUpInfo.GetList(); if (records == null) { _logger.LogWarning("{type} type get null list", typeof(T).Name); return; } var jsonFormatter = new DataContractJsonSerializer(typeof(List)); using var fs = new FileStream($"{folderName}/{typeof(T).Name}.json", FileMode.OpenOrCreate); jsonFormatter.WriteObject(fs, records); } }