implement backup

This commit is contained in:
DavidMakarov 2024-05-16 17:38:35 +04:00
parent 596402e69e
commit 9e39f2944b
18 changed files with 310 additions and 55 deletions

View File

@ -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<BackUpLogic> 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<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);
}
}
}

View File

@ -18,7 +18,7 @@ namespace FlowerShopContracts.ViewModels
public string FlowerName { get; set; } = string.Empty; public string FlowerName { get; set; } = string.Empty;
[Column(title: "ФИО клиента", width: 120)] [Column(title: "ФИО клиента", width: 120)]
public string ClientFIO { get; set; } = string.Empty; public string ClientFIO { get; set; } = string.Empty;
[Column(title: "Почта клиента", width: 190] [Column(title: "Почта клиента", width: 190)]
public string ClientEmail { get; set; } = string.Empty; public string ClientEmail { get; set; } = string.Empty;
[Column(title: "ФИО исполнителя", width: 120)] [Column(title: "ФИО исполнителя", width: 120)]
public string ImplementerFIO { get; set; }=string.Empty; public string ImplementerFIO { get; set; }=string.Empty;

View File

@ -1,6 +1,6 @@
namespace FlowerShopDataModels.Models namespace FlowerShopDataModels.Models
{ {
public interface IMessageInfoModel public interface IMessageInfoModel : IId
{ {
string MessageId { get; } string MessageId { get; }
int? ClientId { get; } int? ClientId { get; }

View File

@ -0,0 +1,26 @@
using FlowerShopContracts.StoragesContracts;
namespace FlowerShopDatabaseImplement.Implements
{
public class BackUpInfo : IBackUpInfo
{
public List<T>? GetList<T>() where T : class, new()
{
using var context = new FlowerShopDatabase();
return context.Set<T>().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;
}
}
}

View File

@ -3,17 +3,23 @@ using FlowerShopContracts.ViewModels;
using FlowerShopDataModels.Models; using FlowerShopDataModels.Models;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization;
namespace FlowerShopDatabaseImplement.Models namespace FlowerShopDatabaseImplement.Models
{ {
public class Client : IClientModel [DataContract]
public class Client : IClientModel
{ {
public int Id { get; private set; } [DataMember]
[Required] public int Id { get; private set; }
[DataMember]
[Required]
public string ClientFIO { get; private set; } = string.Empty; public string ClientFIO { get; private set; } = string.Empty;
[Required] [DataMember]
[Required]
public string Email { get; private set; } = string.Empty; public string Email { get; private set; } = string.Empty;
[Required] [DataMember]
[Required]
public string Password { get; private set; } = string.Empty; public string Password { get; private set; } = string.Empty;
public static Client? Create(ClientBindingModel model) public static Client? Create(ClientBindingModel model)
{ {

View File

@ -3,15 +3,20 @@ using FlowerShopContracts.ViewModels;
using FlowerShopDataModels.Models; using FlowerShopDataModels.Models;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization;
namespace FlowerShopDatabaseImplement.Models namespace FlowerShopDatabaseImplement.Models
{ {
[DataContract]
public class Component : IComponentModel public class Component : IComponentModel
{ {
[DataMember]
public int Id { get; private set; } public int Id { get; private set; }
[Required] [DataMember]
[Required]
public string ComponentName { get; private set; } = string.Empty; public string ComponentName { get; private set; } = string.Empty;
[Required] [DataMember]
[Required]
public double Cost { get; set; } public double Cost { get; set; }
[ForeignKey("ComponentId")] [ForeignKey("ComponentId")]
public virtual List<FlowerComponent> FlowerComponents { get; set; } = public virtual List<FlowerComponent> FlowerComponents { get; set; } =

View File

@ -3,18 +3,24 @@ using FlowerShopContracts.ViewModels;
using FlowerShopContracts.BindingModels; using FlowerShopContracts.BindingModels;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization;
namespace FlowerShopDatabaseImplement.Models namespace FlowerShopDatabaseImplement.Models
{ {
[DataContract]
public class Flower : IFlowerModel public class Flower : IFlowerModel
{ {
public int Id { get; set; } [DataMember]
[Required] public int Id { get; set; }
[DataMember]
[Required]
public string FlowerName { get; set; } = string.Empty; public string FlowerName { get; set; } = string.Empty;
[Required] [DataMember]
[Required]
public double Price { get; set; } public double Price { get; set; }
private Dictionary<int, (IComponentModel, int)>? _FlowerComponents = null; private Dictionary<int, (IComponentModel, int)>? _FlowerComponents = null;
[NotMapped] [DataMember]
[NotMapped]
public Dictionary<int, (IComponentModel, int)> FlowerComponents public Dictionary<int, (IComponentModel, int)> FlowerComponents
{ {
get get

View File

@ -3,18 +3,25 @@ using FlowerShopContracts.ViewModels;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using FlowerShopDataModels.Models; using FlowerShopDataModels.Models;
using System.Runtime.Serialization;
namespace FlowerShopDatabaseImplement.Models namespace FlowerShopDatabaseImplement.Models
{ {
[DataContract]
public class Implementer : IImplementerModel public class Implementer : IImplementerModel
{ {
[DataMember]
public int Id { get; set; } public int Id { get; set; }
[DataMember]
[Required] [Required]
public string ImplementerFIO { get; set; } = string.Empty; public string ImplementerFIO { get; set; } = string.Empty;
[DataMember]
[Required] [Required]
public string Password { get; set; } = string.Empty; public string Password { get; set; } = string.Empty;
[DataMember]
[Required] [Required]
public int WorkExperience { get; set; } public int WorkExperience { get; set; }
[DataMember]
[Required] [Required]
public int Qualification { get; set; } public int Qualification { get; set; }
[ForeignKey("ImplementerId")] [ForeignKey("ImplementerId")]

View File

@ -2,18 +2,28 @@
using FlowerShopContracts.ViewModels; using FlowerShopContracts.ViewModels;
using FlowerShopDataModels.Models; using FlowerShopDataModels.Models;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization;
namespace FlowerShopDatabaseImplement.Models namespace FlowerShopDatabaseImplement.Models
{ {
[DataContract]
public class MessageInfo : IMessageInfoModel public class MessageInfo : IMessageInfoModel
{ {
[Key] [DataMember]
public int Id { get; set; }
[DataMember]
[Key]
public string MessageId { get; set; } = string.Empty; public string MessageId { get; set; } = string.Empty;
public int? ClientId { get; set; } [DataMember]
public string SenderName { get; set; } = string.Empty; public int? ClientId { get; set; }
public DateTime DateDelivery { get; set; } [DataMember]
public string Subject { get; set; } = string.Empty; public string SenderName { get; set; } = string.Empty;
public string Body { 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) public static MessageInfo? Create(MessageInfoBindingModel? model)
{ {

View File

@ -3,27 +3,40 @@ using FlowerShopContracts.ViewModels;
using FlowerShopDataModels.Enums; using FlowerShopDataModels.Enums;
using FlowerShopDataModels.Models; using FlowerShopDataModels.Models;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization;
namespace FlowerShopDatabaseImplement.Models namespace FlowerShopDatabaseImplement.Models
{ {
[DataContract]
public class Order : IOrderModel public class Order : IOrderModel
{ {
public int Id { get; private set; } [DataMember]
public int FlowerId { get; private set; } public int Id { get; private set; }
[DataMember]
[Required]
public int FlowerId { get; private set; }
public virtual Flower Flower { get; 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 virtual Client Client { get; set; }
public int? ImplementerId { get; private set; } [DataMember]
public int? ImplementerId { get; private set; }
public virtual Implementer? Implementer { get; set; } public virtual Implementer? Implementer { get; set; }
[Required] [DataMember]
[Required]
public int Count { get; set; } public int Count { get; set; }
[Required] [DataMember]
[Required]
public double Sum { get; private set; } public double Sum { get; private set; }
[Required] [DataMember]
[Required]
public OrderStatus Status { get; private set; } public OrderStatus Status { get; private set; }
[Required] [DataMember]
[Required]
public DateTime DateCreate { get; private set; } 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) public static Order? Create(OrderBindingModel? model)
{ {
if (model == null) if (model == null)

View File

@ -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<T>? GetList<T>() where T : class, new()
{
var RequredType = typeof(T);
return (List<T>?)_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;
}
}
}

View File

@ -1,16 +1,22 @@
using FlowerShopContracts.BindingModels; using FlowerShopContracts.BindingModels;
using FlowerShopContracts.ViewModels; using FlowerShopContracts.ViewModels;
using FlowerShopDataModels.Models; using FlowerShopDataModels.Models;
using System.Runtime.Serialization;
using System.Xml.Linq; using System.Xml.Linq;
namespace FlowerShopFileImplement.Models namespace FlowerShopFileImplement.Models
{ {
[DataContract]
public class Client : IClientModel public class Client : IClientModel
{ {
public int Id { get; private set; } [DataMember]
public string ClientFIO { get; private set; } = string.Empty; public int Id { get; private set; }
public string Email { get; private set; } = string.Empty; [DataMember]
public string Password { get; private set; } = string.Empty; 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) public static Client? Create(ClientBindingModel model)
{ {
if (model == null) if (model == null)

View File

@ -1,14 +1,19 @@
using FlowerShopContracts.BindingModels; using FlowerShopContracts.BindingModels;
using FlowerShopContracts.ViewModels; using FlowerShopContracts.ViewModels;
using FlowerShopDataModels.Models; using FlowerShopDataModels.Models;
using System.Runtime.Serialization;
using System.Xml.Linq; using System.Xml.Linq;
namespace FlowerShopFileImplement.Models namespace FlowerShopFileImplement.Models
{ {
[DataContract]
public class Component : IComponentModel public class Component : IComponentModel
{ {
[DataMember]
public int Id { get; private set; } public int Id { get; private set; }
[DataMember]
public string ComponentName { get; private set; } = string.Empty; public string ComponentName { get; private set; } = string.Empty;
[DataMember]
public double Cost { get; set; } public double Cost { get; set; }
public static Component? Create(ComponentBindingModel model) public static Component? Create(ComponentBindingModel model)
{ {

View File

@ -1,18 +1,24 @@
using FlowerShopContracts.BindingModels; using FlowerShopContracts.BindingModels;
using FlowerShopContracts.ViewModels; using FlowerShopContracts.ViewModels;
using FlowerShopDataModels.Models; using FlowerShopDataModels.Models;
using System.Runtime.Serialization;
using System.Xml.Linq; using System.Xml.Linq;
namespace FlowerShopFileImplement.Models namespace FlowerShopFileImplement.Models
{ {
[DataContract]
public class Flower : IFlowerModel public class Flower : IFlowerModel
{ {
[DataMember]
public int Id { get; private set; } public int Id { get; private set; }
public string FlowerName { get; private set; } = string.Empty; [DataMember]
public double Price { get; private set; } public string FlowerName { get; private set; } = string.Empty;
[DataMember]
public double Price { get; private set; }
public Dictionary<int, int> Components { get; private set; } = new(); public Dictionary<int, int> Components { get; private set; } = new();
private Dictionary<int, (IComponentModel, int)>? _flowerComponents = null; private Dictionary<int, (IComponentModel, int)>? _flowerComponents = null;
public Dictionary<int, (IComponentModel, int)> FlowerComponents [DataMember]
public Dictionary<int, (IComponentModel, int)> FlowerComponents
{ {
get get
{ {

View File

@ -1,16 +1,23 @@
using FlowerShopContracts.BindingModels; using FlowerShopContracts.BindingModels;
using FlowerShopContracts.ViewModels; using FlowerShopContracts.ViewModels;
using FlowerShopDataModels.Models; using FlowerShopDataModels.Models;
using System.Runtime.Serialization;
using System.Xml.Linq; using System.Xml.Linq;
namespace FlowerShopFileImplement.Models namespace FlowerShopFileImplement.Models
{ {
[DataContract]
public class Implementer : IImplementerModel public class Implementer : IImplementerModel
{ {
[DataMember]
public int Id { get; private set; } public int Id { get; private set; }
[DataMember]
public string ImplementerFIO { get; private set; } = string.Empty; public string ImplementerFIO { get; private set; } = string.Empty;
[DataMember]
public string Password { get; private set; } = string.Empty; public string Password { get; private set; } = string.Empty;
[DataMember]
public int WorkExperience { get; private set; } public int WorkExperience { get; private set; }
[DataMember]
public int Qualification { get; private set; } public int Qualification { get; private set; }
public static Implementer? Create(ImplementerBindingModel Model) public static Implementer? Create(ImplementerBindingModel Model)
{ {

View File

@ -1,23 +1,28 @@
using FlowerShopContracts.BindingModels; using FlowerShopContracts.BindingModels;
using FlowerShopContracts.ViewModels; using FlowerShopContracts.ViewModels;
using FlowerShopDataModels.Models; using FlowerShopDataModels.Models;
using System; using System.Runtime.Serialization;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq; using System.Xml.Linq;
namespace FlowerShopFileImplement.Models namespace FlowerShopFileImplement.Models
{ {
[DataContract]
public class MessageInfo : IMessageInfoModel public class MessageInfo : IMessageInfoModel
{ {
public string MessageId { get; set; } = string.Empty; [DataMember]
public int? ClientId { get; set; } public int Id { get; set; }
public string SenderName { get; set; } = string.Empty; [DataMember]
public DateTime DateDelivery { get; set; } public string MessageId { get; set; } = string.Empty;
public string Subject { get; set; } = string.Empty; [DataMember]
public string Body { get; set; } = string.Empty; 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) public static MessageInfo? Create(MessageInfoBindingModel? model)
{ {

View File

@ -2,21 +2,32 @@
using FlowerShopContracts.ViewModels; using FlowerShopContracts.ViewModels;
using FlowerShopDataModels.Enums; using FlowerShopDataModels.Enums;
using FlowerShopDataModels.Models; using FlowerShopDataModels.Models;
using System.Runtime.Serialization;
using System.Xml.Linq; using System.Xml.Linq;
namespace FlowerShopFileImplement.Models namespace FlowerShopFileImplement.Models
{ {
[DataContract]
public class Order : IOrderModel public class Order : IOrderModel
{ {
public int Id { get; private set; } [DataMember]
public int FlowerId { get; private set; } public int Id { get; private set; }
public int ClientId { get; private set; } [DataMember]
public int? ImplementerId { get; private set; } public int FlowerId { get; private set; }
public int Count { get; private set; } [DataMember]
public double Sum { get; set; } public int ClientId { get; private set; }
public OrderStatus Status { get; set; } [DataMember]
public DateTime DateCreate { get; set; } public int? ImplementerId { get; private set; }
public DateTime? DateImplement { get; 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) public static Order? Create(OrderBindingModel model)
{ {
if (model == null) if (model == null)

View File

@ -6,6 +6,7 @@ namespace FlowerShopListImplement.Models
{ {
public class MessageInfo : IMessageInfoModel public class MessageInfo : IMessageInfoModel
{ {
public int Id { get; set; }
public string MessageId { get; set; } = string.Empty; public string MessageId { get; set; } = string.Empty;
public int? ClientId { get; set; } public int? ClientId { get; set; }
public string SenderName { get; set; } = string.Empty; public string SenderName { get; set; } = string.Empty;