diff --git a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/BackUpLogic.cs b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/BackUpLogic.cs new file mode 100644 index 0000000..d530176 --- /dev/null +++ b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/BackUpLogic.cs @@ -0,0 +1,99 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.BusinessLogicsContracts; +using FlowerShopContracts.StoragesContracts; +using FlowerShopDataModels; +using Microsoft.Extensions.Logging; +using System.IO.Compression; +using System.Reflection; +using System.Runtime.Serialization.Json; + +namespace FlowerShopBusinessLogic.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(BackUpSaveBinidngModel model) + { + if (_backUpInfo == null) + { + return; + } + try + { + _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"); + string 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("Сборка не найдена", 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($"Не найден класc-модель для { 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); + } + catch (Exception) + { + throw; + } + } + 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(string.Format("{0}/{1}.json", folderName, typeof(T).Name), FileMode.OpenOrCreate); + jsonFormatter.WriteObject(fs, records); + } + } + +} diff --git a/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs b/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs index f2007f6..bff74c3 100644 --- a/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs +++ b/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs @@ -18,7 +18,7 @@ namespace FlowerShopContracts.ViewModels public string FlowerName { get; set; } = string.Empty; [Column(title: "ФИО клиента", width: 120)] public string ClientFIO { get; set; } = string.Empty; - [Column(title: "Почта клиента", width: 190] + [Column(title: "Почта клиента", width: 190)] public string ClientEmail { get; set; } = string.Empty; [Column(title: "ФИО исполнителя", width: 120)] public string ImplementerFIO { get; set; }=string.Empty; diff --git a/FlowerShop/FlowerShopDataModels/Models/IMessageInfoModel.cs b/FlowerShop/FlowerShopDataModels/Models/IMessageInfoModel.cs index 1c244fe..1decfd2 100644 --- a/FlowerShop/FlowerShopDataModels/Models/IMessageInfoModel.cs +++ b/FlowerShop/FlowerShopDataModels/Models/IMessageInfoModel.cs @@ -1,6 +1,6 @@ namespace FlowerShopDataModels.Models { - public interface IMessageInfoModel + public interface IMessageInfoModel : IId { string MessageId { get; } int? ClientId { get; } diff --git a/FlowerShop/FlowerShopDatabaseImplement/Implements/BackUpInfo.cs b/FlowerShop/FlowerShopDatabaseImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..c5da7ae --- /dev/null +++ b/FlowerShop/FlowerShopDatabaseImplement/Implements/BackUpInfo.cs @@ -0,0 +1,26 @@ +using FlowerShopContracts.StoragesContracts; + +namespace FlowerShopDatabaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new FlowerShopDatabase(); + return context.Set().ToList(); + } + public Type? GetTypeByModelInterface(string modelInterfaceName) + { + var assembly = typeof(BackUpInfo).Assembly; + var types = assembly.GetTypes(); + foreach (var type in types) + { + if (type.IsClass && type.GetInterface(modelInterfaceName) != null) + { + return type; + } + } + return null; + } + } +} diff --git a/FlowerShop/FlowerShopDatabaseImplement/Models/Client.cs b/FlowerShop/FlowerShopDatabaseImplement/Models/Client.cs index 7471d66..e068d83 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Models/Client.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Models/Client.cs @@ -3,17 +3,23 @@ using FlowerShopContracts.ViewModels; using FlowerShopDataModels.Models; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace FlowerShopDatabaseImplement.Models { - public class Client : IClientModel + [DataContract] + public class Client : IClientModel { - public int Id { get; private set; } - [Required] + [DataMember] + public int Id { get; private set; } + [DataMember] + [Required] public string ClientFIO { get; private set; } = string.Empty; - [Required] + [DataMember] + [Required] public string Email { get; private set; } = string.Empty; - [Required] + [DataMember] + [Required] public string Password { get; private set; } = string.Empty; public static Client? Create(ClientBindingModel model) { diff --git a/FlowerShop/FlowerShopDatabaseImplement/Models/Component.cs b/FlowerShop/FlowerShopDatabaseImplement/Models/Component.cs index 79e9af3..da53e7d 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Models/Component.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Models/Component.cs @@ -3,15 +3,20 @@ using FlowerShopContracts.ViewModels; using FlowerShopDataModels.Models; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace FlowerShopDatabaseImplement.Models { + [DataContract] public class Component : IComponentModel { + [DataMember] public int Id { get; private set; } - [Required] + [DataMember] + [Required] public string ComponentName { get; private set; } = string.Empty; - [Required] + [DataMember] + [Required] public double Cost { get; set; } [ForeignKey("ComponentId")] public virtual List FlowerComponents { get; set; } = diff --git a/FlowerShop/FlowerShopDatabaseImplement/Models/Flower.cs b/FlowerShop/FlowerShopDatabaseImplement/Models/Flower.cs index eea7e07..0c6dd0b 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Models/Flower.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Models/Flower.cs @@ -3,18 +3,24 @@ using FlowerShopContracts.ViewModels; using FlowerShopContracts.BindingModels; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace FlowerShopDatabaseImplement.Models { + [DataContract] public class Flower : IFlowerModel { - public int Id { get; set; } - [Required] + [DataMember] + public int Id { get; set; } + [DataMember] + [Required] public string FlowerName { get; set; } = string.Empty; - [Required] + [DataMember] + [Required] public double Price { get; set; } private Dictionary? _FlowerComponents = null; - [NotMapped] + [DataMember] + [NotMapped] public Dictionary FlowerComponents { get diff --git a/FlowerShop/FlowerShopDatabaseImplement/Models/Implementer.cs b/FlowerShop/FlowerShopDatabaseImplement/Models/Implementer.cs index 98d68f1..61189c8 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Models/Implementer.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Models/Implementer.cs @@ -3,18 +3,25 @@ using FlowerShopContracts.ViewModels; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; using FlowerShopDataModels.Models; +using System.Runtime.Serialization; namespace FlowerShopDatabaseImplement.Models { + [DataContract] public class Implementer : IImplementerModel { + [DataMember] public int Id { get; set; } + [DataMember] [Required] public string ImplementerFIO { get; set; } = string.Empty; + [DataMember] [Required] public string Password { get; set; } = string.Empty; + [DataMember] [Required] public int WorkExperience { get; set; } + [DataMember] [Required] public int Qualification { get; set; } [ForeignKey("ImplementerId")] diff --git a/FlowerShop/FlowerShopDatabaseImplement/Models/MessageInfo.cs b/FlowerShop/FlowerShopDatabaseImplement/Models/MessageInfo.cs index 0721a80..67d12ee 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Models/MessageInfo.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Models/MessageInfo.cs @@ -2,18 +2,28 @@ using FlowerShopContracts.ViewModels; using FlowerShopDataModels.Models; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace FlowerShopDatabaseImplement.Models { + [DataContract] public class MessageInfo : IMessageInfoModel { - [Key] + [DataMember] + public int Id { get; set; } + [DataMember] + [Key] public string MessageId { get; set; } = string.Empty; - public int? ClientId { get; set; } - public string SenderName { get; set; } = string.Empty; - public DateTime DateDelivery { get; set; } - public string Subject { get; set; } = string.Empty; - public string Body { get; set; } = string.Empty; + [DataMember] + public int? ClientId { get; set; } + [DataMember] + public string SenderName { get; set; } = string.Empty; + [DataMember] + public DateTime DateDelivery { get; set; } + [DataMember] + public string Subject { get; set; } = string.Empty; + [DataMember] + public string Body { get; set; } = string.Empty; public static MessageInfo? Create(MessageInfoBindingModel? model) { diff --git a/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs b/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs index 424413a..ea533e9 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs @@ -3,27 +3,40 @@ using FlowerShopContracts.ViewModels; using FlowerShopDataModels.Enums; using FlowerShopDataModels.Models; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace FlowerShopDatabaseImplement.Models { + [DataContract] public class Order : IOrderModel { - public int Id { get; private set; } - public int FlowerId { get; private set; } + [DataMember] + public int Id { get; private set; } + [DataMember] + [Required] + public int FlowerId { get; private set; } public virtual Flower Flower { get; set; } - public int ClientId { get; private set; } + [DataMember] + [Required] + public int ClientId { get; private set; } public virtual Client Client { get; set; } - public int? ImplementerId { get; private set; } + [DataMember] + public int? ImplementerId { get; private set; } public virtual Implementer? Implementer { get; set; } - [Required] + [DataMember] + [Required] public int Count { get; set; } - [Required] + [DataMember] + [Required] public double Sum { get; private set; } - [Required] + [DataMember] + [Required] public OrderStatus Status { get; private set; } - [Required] + [DataMember] + [Required] public DateTime DateCreate { get; private set; } - public DateTime? DateImplement { get; private set; } + [DataMember] + public DateTime? DateImplement { get; private set; } public static Order? Create(OrderBindingModel? model) { if (model == null) diff --git a/FlowerShop/FlowerShopFileImplement/Implements/BackUpInfo.cs b/FlowerShop/FlowerShopFileImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..f2896cc --- /dev/null +++ b/FlowerShop/FlowerShopFileImplement/Implements/BackUpInfo.cs @@ -0,0 +1,42 @@ +using FlowerShopContracts.StoragesContracts; +using System.Reflection; + +namespace FlowerShopFileImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + private readonly DataFileSingleton _source; + private readonly PropertyInfo[] _sourceProperties; + + public BackUpInfo() + { + _source = DataFileSingleton.GetInstance(); + _sourceProperties = _source.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public); + } + + public List? GetList() where T : class, new() + { + var RequredType = typeof(T); + + return (List?)_sourceProperties + .FirstOrDefault(x => x.PropertyType.IsGenericType && x.PropertyType.GetGenericArguments()[0] == RequredType) + ?.GetValue(_source); + } + + public Type? GetTypeByModelInterface(string ModelInterfaceName) + { + var Assembly = typeof(BackUpInfo).Assembly; + var Types = Assembly.GetTypes(); + + foreach (var Type in Types) + { + if (Type.IsClass && Type.GetInterface(ModelInterfaceName) != null) + { + return Type; + } + } + + return null; + } + } +} diff --git a/FlowerShop/FlowerShopFileImplement/Models/Client.cs b/FlowerShop/FlowerShopFileImplement/Models/Client.cs index d35e7be..3a5149e 100644 --- a/FlowerShop/FlowerShopFileImplement/Models/Client.cs +++ b/FlowerShop/FlowerShopFileImplement/Models/Client.cs @@ -1,16 +1,22 @@ using FlowerShopContracts.BindingModels; using FlowerShopContracts.ViewModels; using FlowerShopDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace FlowerShopFileImplement.Models { + [DataContract] public class Client : IClientModel { - public int Id { get; private set; } - public string ClientFIO { get; private set; } = string.Empty; - public string Email { get; private set; } = string.Empty; - public string Password { get; private set; } = string.Empty; + [DataMember] + public int Id { get; private set; } + [DataMember] + public string ClientFIO { get; private set; } = string.Empty; + [DataMember] + public string Email { get; private set; } = string.Empty; + [DataMember] + public string Password { get; private set; } = string.Empty; public static Client? Create(ClientBindingModel model) { if (model == null) diff --git a/FlowerShop/FlowerShopFileImplement/Models/Component.cs b/FlowerShop/FlowerShopFileImplement/Models/Component.cs index 5a34388..96dc2c1 100644 --- a/FlowerShop/FlowerShopFileImplement/Models/Component.cs +++ b/FlowerShop/FlowerShopFileImplement/Models/Component.cs @@ -1,14 +1,19 @@ using FlowerShopContracts.BindingModels; using FlowerShopContracts.ViewModels; using FlowerShopDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace FlowerShopFileImplement.Models { + [DataContract] public class Component : IComponentModel { + [DataMember] public int Id { get; private set; } + [DataMember] public string ComponentName { get; private set; } = string.Empty; + [DataMember] public double Cost { get; set; } public static Component? Create(ComponentBindingModel model) { diff --git a/FlowerShop/FlowerShopFileImplement/Models/Flower.cs b/FlowerShop/FlowerShopFileImplement/Models/Flower.cs index 77046c8..63f84eb 100644 --- a/FlowerShop/FlowerShopFileImplement/Models/Flower.cs +++ b/FlowerShop/FlowerShopFileImplement/Models/Flower.cs @@ -1,18 +1,24 @@ using FlowerShopContracts.BindingModels; using FlowerShopContracts.ViewModels; using FlowerShopDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace FlowerShopFileImplement.Models { + [DataContract] public class Flower : IFlowerModel { + [DataMember] public int Id { get; private set; } - public string FlowerName { get; private set; } = string.Empty; - public double Price { get; private set; } + [DataMember] + public string FlowerName { get; private set; } = string.Empty; + [DataMember] + public double Price { get; private set; } public Dictionary Components { get; private set; } = new(); private Dictionary? _flowerComponents = null; - public Dictionary FlowerComponents + [DataMember] + public Dictionary FlowerComponents { get { diff --git a/FlowerShop/FlowerShopFileImplement/Models/Implementer.cs b/FlowerShop/FlowerShopFileImplement/Models/Implementer.cs index 290e43a..daf5ec3 100644 --- a/FlowerShop/FlowerShopFileImplement/Models/Implementer.cs +++ b/FlowerShop/FlowerShopFileImplement/Models/Implementer.cs @@ -1,16 +1,23 @@ using FlowerShopContracts.BindingModels; using FlowerShopContracts.ViewModels; using FlowerShopDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace FlowerShopFileImplement.Models { + [DataContract] public class Implementer : IImplementerModel { + [DataMember] public int Id { get; private set; } + [DataMember] public string ImplementerFIO { get; private set; } = string.Empty; + [DataMember] public string Password { get; private set; } = string.Empty; + [DataMember] public int WorkExperience { get; private set; } + [DataMember] public int Qualification { get; private set; } public static Implementer? Create(ImplementerBindingModel Model) { diff --git a/FlowerShop/FlowerShopFileImplement/Models/MessageInfo.cs b/FlowerShop/FlowerShopFileImplement/Models/MessageInfo.cs index 225d467..3e88cec 100644 --- a/FlowerShop/FlowerShopFileImplement/Models/MessageInfo.cs +++ b/FlowerShop/FlowerShopFileImplement/Models/MessageInfo.cs @@ -1,23 +1,28 @@ using FlowerShopContracts.BindingModels; using FlowerShopContracts.ViewModels; using FlowerShopDataModels.Models; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Runtime.Serialization; using System.Xml.Linq; namespace FlowerShopFileImplement.Models { + [DataContract] public class MessageInfo : IMessageInfoModel { - public string MessageId { get; set; } = string.Empty; - public int? ClientId { get; set; } - public string SenderName { get; set; } = string.Empty; - public DateTime DateDelivery { get; set; } - public string Subject { get; set; } = string.Empty; - public string Body { get; set; } = string.Empty; + [DataMember] + public int Id { get; set; } + [DataMember] + public string MessageId { get; set; } = string.Empty; + [DataMember] + public int? ClientId { get; set; } + [DataMember] + public string SenderName { get; set; } = string.Empty; + [DataMember] + public DateTime DateDelivery { get; set; } + [DataMember] + public string Subject { get; set; } = string.Empty; + [DataMember] + public string Body { get; set; } = string.Empty; public static MessageInfo? Create(MessageInfoBindingModel? model) { diff --git a/FlowerShop/FlowerShopFileImplement/Models/Order.cs b/FlowerShop/FlowerShopFileImplement/Models/Order.cs index 594dec8..353615a 100644 --- a/FlowerShop/FlowerShopFileImplement/Models/Order.cs +++ b/FlowerShop/FlowerShopFileImplement/Models/Order.cs @@ -2,21 +2,32 @@ using FlowerShopContracts.ViewModels; using FlowerShopDataModels.Enums; using FlowerShopDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace FlowerShopFileImplement.Models { + [DataContract] public class Order : IOrderModel { - public int Id { get; private set; } - public int FlowerId { get; private set; } - public int ClientId { get; private set; } - public int? ImplementerId { get; private set; } - public int Count { get; private set; } - public double Sum { get; set; } - public OrderStatus Status { get; set; } - public DateTime DateCreate { get; set; } - public DateTime? DateImplement { get; set; } + [DataMember] + public int Id { get; private set; } + [DataMember] + public int FlowerId { get; private set; } + [DataMember] + public int ClientId { get; private set; } + [DataMember] + public int? ImplementerId { get; private set; } + [DataMember] + public int Count { get; private set; } + [DataMember] + public double Sum { get; set; } + [DataMember] + public OrderStatus Status { get; set; } + [DataMember] + public DateTime DateCreate { get; set; } + [DataMember] + public DateTime? DateImplement { get; set; } public static Order? Create(OrderBindingModel model) { if (model == null) diff --git a/FlowerShop/FlowerShopListImplement/Models/MessageInfo.cs b/FlowerShop/FlowerShopListImplement/Models/MessageInfo.cs index 1cb185c..5676d65 100644 --- a/FlowerShop/FlowerShopListImplement/Models/MessageInfo.cs +++ b/FlowerShop/FlowerShopListImplement/Models/MessageInfo.cs @@ -6,6 +6,7 @@ namespace FlowerShopListImplement.Models { public class MessageInfo : IMessageInfoModel { + public int Id { get; set; } public string MessageId { get; set; } = string.Empty; public int? ClientId { get; set; } public string SenderName { get; set; } = string.Empty;