diff --git a/FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/ClientLogic.cs b/FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/ClientLogic.cs index ddd7420..b437a61 100644 --- a/FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/ClientLogic.cs +++ b/FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/ClientLogic.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace AbstractFoodOrdersBusinessLogic.BusinessLogics @@ -16,8 +17,10 @@ namespace AbstractFoodOrdersBusinessLogic.BusinessLogics { private readonly ILogger _logger; private readonly IClientStorage _clientStorage; + private Regex validateEmailRegex = new Regex("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"); + private Regex validatePasswordRegex = new Regex("^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).(?=.*?[#?!@$%^&*-]).{10,50}$"); - public ClientLogic(ILogger logger, IClientStorage clientStorage) + public ClientLogic(ILogger logger, IClientStorage clientStorage) { _logger = logger; _clientStorage = clientStorage; @@ -108,11 +111,20 @@ namespace AbstractFoodOrdersBusinessLogic.BusinessLogics { throw new ArgumentNullException("Нет электронной почты клиента", nameof(model.Email)); } - _logger.LogInformation("Client. ClientFIO:{ClientFIO}. Password:{Password}. Email:{Email}. Id:{Id}", model.ClientFIO, model.Password, model.Email, model.Id); + if (!validateEmailRegex.IsMatch(model.Email)) + { + throw new InvalidOperationException("Почта введена некорректно!"); + } + if (!validatePasswordRegex.IsMatch(model.Password)) + { + throw new InvalidOperationException("Пароль не удовлетворяет требованиям"); + } + _logger.LogInformation("Client. ClientFIO:{ClientFIO}. Password:{Password}. Email:{Email}. Id:{Id}", model.ClientFIO, model.Password, model.Email, model.Id); var element = _clientStorage.GetElement(new ClientSearchModel { Email = model.Email }); + if (element != null && element.Id != model.Id) { throw new InvalidOperationException("Клиент с таким логином уже зарегистрирован"); diff --git a/FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/MessageInfoLogic.cs b/FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/MessageInfoLogic.cs new file mode 100644 index 0000000..b7116b5 --- /dev/null +++ b/FoodOrders/AbstractFoodOrdersBusinessLogic/BusinessLogics/MessageInfoLogic.cs @@ -0,0 +1,82 @@ +using AbstractFoodOrdersContracts.BindingModels; +using AbstractFoodOrdersContracts.BusinessLogicsContracts; +using AbstractFoodOrdersContracts.SearchModels; +using AbstractFoodOrdersContracts.StoragesContracts; +using AbstractFoodOrdersContracts.ViewModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractFoodOrdersBusinessLogic.BusinessLogics +{ + public class MessageInfoLogic: IMessageInfoLogic + { + private readonly ILogger _logger; + private readonly IMessageInfoStorage _messageStorage; + private readonly IClientLogic _clientLogic; + + public MessageInfoLogic(ILogger logger, IMessageInfoStorage logic, IClientLogic clientLogic) + { + _logger = logger; + _messageStorage = logic; + _clientLogic = clientLogic; + } + + public List? ReadList(MessageInfoSearchModel? model) + { + _logger.LogInformation("ReadList. MessageId:{MessageId}. ClientId:{ClientId}.", model?.MessageId, model?.ClientId); + var list = model == null ? _messageStorage.GetFullList() : _messageStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; + } + + public bool Create(MessageInfoBindingModel model) + { + CheckModel(model); + model.ClientId = _clientLogic.ReadElement(new ClientSearchModel() { Email = model.SenderName })?.Id; + if (_messageStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + + private void CheckModel(MessageInfoBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.MessageId)) + { + throw new ArgumentNullException("Нет id письма", nameof(model.MessageId)); + } + if (string.IsNullOrEmpty(model.SenderName)) + { + throw new ArgumentNullException("Нет отправителя", nameof(model.SenderName)); + } + if (string.IsNullOrEmpty(model.Subject)) + { + throw new ArgumentNullException("Нет темы", nameof(model.Subject)); + } + if (string.IsNullOrEmpty(model.Body)) + { + throw new ArgumentNullException("Нет текста письма", nameof(model.Subject)); + } + _logger.LogInformation("MessageInfo. MessageId:{MessageId}. SenderName:{SenderName}. Subject:{Subject}. Body:{Body}", model.MessageId, model.SenderName, model.Subject, model.Body); + } + } +} diff --git a/FoodOrders/AbstractFoodOrdersContracts/BindingModels/MessageInfoBindingModel.cs b/FoodOrders/AbstractFoodOrdersContracts/BindingModels/MessageInfoBindingModel.cs new file mode 100644 index 0000000..5ec9cd6 --- /dev/null +++ b/FoodOrders/AbstractFoodOrdersContracts/BindingModels/MessageInfoBindingModel.cs @@ -0,0 +1,19 @@ +using AbstractFoodOrdersDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractFoodOrdersContracts.BindingModels +{ + public class MessageInfoBindingModel: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; + } +} diff --git a/FoodOrders/AbstractFoodOrdersContracts/BusinessLogicsContracts/IMessageInfoLogic.cs b/FoodOrders/AbstractFoodOrdersContracts/BusinessLogicsContracts/IMessageInfoLogic.cs new file mode 100644 index 0000000..a16c752 --- /dev/null +++ b/FoodOrders/AbstractFoodOrdersContracts/BusinessLogicsContracts/IMessageInfoLogic.cs @@ -0,0 +1,18 @@ +using AbstractFoodOrdersContracts.BindingModels; +using AbstractFoodOrdersContracts.SearchModels; +using AbstractFoodOrdersContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractFoodOrdersContracts.BusinessLogicsContracts +{ + public interface IMessageInfoLogic + { + List? ReadList(MessageInfoSearchModel? model); + bool Create(MessageInfoBindingModel model); + + } +} diff --git a/FoodOrders/AbstractFoodOrdersContracts/SearchModels/MessageInfoSearchModel.cs b/FoodOrders/AbstractFoodOrdersContracts/SearchModels/MessageInfoSearchModel.cs new file mode 100644 index 0000000..4ca4aa9 --- /dev/null +++ b/FoodOrders/AbstractFoodOrdersContracts/SearchModels/MessageInfoSearchModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractFoodOrdersContracts.SearchModels +{ + public class MessageInfoSearchModel + { + public string? MessageId { get; set; } + public int? ClientId { get; set; } + } +} diff --git a/FoodOrders/AbstractFoodOrdersContracts/StoragesContracts/IMessageInfoStorage.cs b/FoodOrders/AbstractFoodOrdersContracts/StoragesContracts/IMessageInfoStorage.cs new file mode 100644 index 0000000..849e923 --- /dev/null +++ b/FoodOrders/AbstractFoodOrdersContracts/StoragesContracts/IMessageInfoStorage.cs @@ -0,0 +1,19 @@ +using AbstractFoodOrdersContracts.BindingModels; +using AbstractFoodOrdersContracts.SearchModels; +using AbstractFoodOrdersContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractFoodOrdersContracts.StoragesContracts +{ + public interface IMessageInfoStorage + { + List GetFullList(); + List GetFilteredList(MessageInfoSearchModel model); + MessageInfoViewModel? GetElement(MessageInfoSearchModel model); + MessageInfoViewModel? Insert(MessageInfoBindingModel model); + } +} diff --git a/FoodOrders/AbstractFoodOrdersContracts/ViewModels/MessageInfoViewModel.cs b/FoodOrders/AbstractFoodOrdersContracts/ViewModels/MessageInfoViewModel.cs new file mode 100644 index 0000000..37be3df --- /dev/null +++ b/FoodOrders/AbstractFoodOrdersContracts/ViewModels/MessageInfoViewModel.cs @@ -0,0 +1,24 @@ +using AbstractFoodOrdersDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractFoodOrdersContracts.ViewModels +{ + public class MessageInfoViewModel:IMessageInfoModel + { + public string MessageId { get; set; } = string.Empty; + public int? ClientId { get; set; } + [DisplayName("Отправитель")] + public string SenderName { get; set; } = string.Empty; + [DisplayName("Доставлено")] + public DateTime DateDelivery { get; set; } + [DisplayName("Заголовок")] + public string Subject { get; set; } = string.Empty; + [DisplayName("Текст")] + public string Body { get; set; } = string.Empty; + } +} diff --git a/FoodOrders/AbstractFoodOrdersContracts/ViewModels/OrderViewModel.cs b/FoodOrders/AbstractFoodOrdersContracts/ViewModels/OrderViewModel.cs index fd0e73a..994623e 100644 --- a/FoodOrders/AbstractFoodOrdersContracts/ViewModels/OrderViewModel.cs +++ b/FoodOrders/AbstractFoodOrdersContracts/ViewModels/OrderViewModel.cs @@ -22,7 +22,8 @@ namespace AbstractFoodOrdersContracts.ViewModels public int ClientId { get; set; } [DisplayName("ФИО клиента")] public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Количество")] + public string ClientEmail { get; set; } = string.Empty; + [DisplayName("Количество")] public int Count { get; set; } [DisplayName("Сумма")] public double Sum { get; set; } diff --git a/FoodOrders/AbstractFoodOrdersDataModels/Models/IMessageInfoModel.cs b/FoodOrders/AbstractFoodOrdersDataModels/Models/IMessageInfoModel.cs new file mode 100644 index 0000000..668b834 --- /dev/null +++ b/FoodOrders/AbstractFoodOrdersDataModels/Models/IMessageInfoModel.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractFoodOrdersDataModels.Models +{ + public interface IMessageInfoModel + { + string MessageId { get; } + int? ClientId { get; } + string SenderName { get; } + DateTime DateDelivery { get; } + string Subject { get; } + string Body { get; } + } +} diff --git a/FoodOrders/AbstractFoodOrdersDatabaseImplement/AbstractFoodOrdersDatabase.cs b/FoodOrders/AbstractFoodOrdersDatabaseImplement/AbstractFoodOrdersDatabase.cs index 4c3a7f0..bda2253 100644 --- a/FoodOrders/AbstractFoodOrdersDatabaseImplement/AbstractFoodOrdersDatabase.cs +++ b/FoodOrders/AbstractFoodOrdersDatabaseImplement/AbstractFoodOrdersDatabase.cs @@ -27,5 +27,6 @@ namespace AbstractFoodOrdersDatabaseImplement public virtual DbSet Orders { set; get; } public virtual DbSet Clients { set; get; } public virtual DbSet Implementers { set; get; } + public virtual DbSet MessageInfos { set; get; } } } diff --git a/FoodOrders/AbstractFoodOrdersDatabaseImplement/Implements/MessageInfoStorage.cs b/FoodOrders/AbstractFoodOrdersDatabaseImplement/Implements/MessageInfoStorage.cs new file mode 100644 index 0000000..e5dd61c --- /dev/null +++ b/FoodOrders/AbstractFoodOrdersDatabaseImplement/Implements/MessageInfoStorage.cs @@ -0,0 +1,59 @@ +using AbstractFoodOrdersContracts.BindingModels; +using AbstractFoodOrdersContracts.SearchModels; +using AbstractFoodOrdersContracts.StoragesContracts; +using AbstractFoodOrdersContracts.ViewModels; +using AbstractFoodOrdersDatabaseImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractFoodOrdersDatabaseImplement.Implements +{ + public class MessageInfoStorage:IMessageInfoStorage + { + public List GetFullList() + { + using var context = new AbstractFoodOrdersDatabase(); + return context.MessageInfos + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(MessageInfoSearchModel model) + { + if (string.IsNullOrEmpty(model.MessageId) && !model.ClientId.HasValue) + { + return new(); + } + using var context = new AbstractFoodOrdersDatabase(); + return context.MessageInfos + .Where(x => x.ClientId == model.ClientId) + .Select(x => x.GetViewModel) + .ToList(); + } + public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) + { + if (string.IsNullOrEmpty(model.MessageId) && !model.ClientId.HasValue) + { + return new(); + } + using var context = new AbstractFoodOrdersDatabase(); + return context.MessageInfos + .FirstOrDefault(x => x.MessageId.Equals(model.MessageId) && x.ClientId == model.ClientId) + ?.GetViewModel; + } + public MessageInfoViewModel? Insert(MessageInfoBindingModel model) + { + var newMessageInfo = MessageInfo.Create(model); + if (newMessageInfo == null) + { + return null; + } + using var context = new AbstractFoodOrdersDatabase(); + context.MessageInfos.Add(newMessageInfo); + context.SaveChanges(); + return newMessageInfo.GetViewModel; + } + } +} diff --git a/FoodOrders/AbstractFoodOrdersDatabaseImplement/Models/MessageInfo.cs b/FoodOrders/AbstractFoodOrdersDatabaseImplement/Models/MessageInfo.cs new file mode 100644 index 0000000..a677df4 --- /dev/null +++ b/FoodOrders/AbstractFoodOrdersDatabaseImplement/Models/MessageInfo.cs @@ -0,0 +1,56 @@ +using AbstractFoodOrdersContracts.BindingModels; +using AbstractFoodOrdersContracts.ViewModels; +using AbstractFoodOrdersDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractFoodOrdersDatabaseImplement.Models +{ + public class MessageInfo:IMessageInfoModel + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.None)] + public string MessageId { get; set; } = string.Empty; + public int? ClientId { get; set; } + [Required] + public string SenderName { get; set; } = string.Empty; + [Required] + public DateTime DateDelivery { get; set; } + [Required] + public string Subject { get; set; } = string.Empty; + [Required] + public string Body { get; set; } = string.Empty; + + public static MessageInfo? Create(MessageInfoBindingModel model) + { + if (model == null) + { + return null; + } + return new MessageInfo() + { + MessageId = model.MessageId, + ClientId = model.ClientId, + SenderName = model.SenderName, + Body = model.Body, + Subject = model.Subject, + DateDelivery = model.DateDelivery + }; + } + + public MessageInfoViewModel GetViewModel => new() + { + MessageId = MessageId, + ClientId = ClientId, + SenderName = SenderName, + Body = Body, + Subject = Subject, + DateDelivery = DateDelivery + }; + } +} diff --git a/FoodOrders/AbstractFoodOrdersDatabaseImplement/Models/Order.cs b/FoodOrders/AbstractFoodOrdersDatabaseImplement/Models/Order.cs index 59b50bf..d6b4958 100644 --- a/FoodOrders/AbstractFoodOrdersDatabaseImplement/Models/Order.cs +++ b/FoodOrders/AbstractFoodOrdersDatabaseImplement/Models/Order.cs @@ -70,6 +70,7 @@ namespace AbstractFoodOrdersDatabaseImplement.Models DishId = DishId, ClientId = ClientId, ClientFIO = Client.ClientFIO, + ClientEmail = Client.Email, Count = Count, Sum = Sum, Status = Status, diff --git a/FoodOrders/AbstractFoodOrdersListImplement/DataListSingleton.cs b/FoodOrders/AbstractFoodOrdersListImplement/DataListSingleton.cs index 18a42b5..2b583e9 100644 --- a/FoodOrders/AbstractFoodOrdersListImplement/DataListSingleton.cs +++ b/FoodOrders/AbstractFoodOrdersListImplement/DataListSingleton.cs @@ -15,6 +15,7 @@ namespace AbstractFoodOrdersListImplement public List Dishes { get; set; } public List Clients { get; set; } public List Implementers { get; set; } + public List MessageInfos { get; set; } private DataListSingleton() { Components = new List(); @@ -22,6 +23,7 @@ namespace AbstractFoodOrdersListImplement Dishes = new List(); Clients = new List(); Implementers = new List(); + MessageInfos = new List(); } public static DataListSingleton GetInstance() { diff --git a/FoodOrders/AbstractShopFileImplement/DataFileSingleton.cs b/FoodOrders/AbstractShopFileImplement/DataFileSingleton.cs index e0e100c..06c2bfb 100644 --- a/FoodOrders/AbstractShopFileImplement/DataFileSingleton.cs +++ b/FoodOrders/AbstractShopFileImplement/DataFileSingleton.cs @@ -16,11 +16,13 @@ namespace AbstractFoodOrdersFileImplement private readonly string DishFileName = "Dish.xml"; private readonly string ClientFileName = "Client.xml"; private readonly string ImplementerFileName = "Implementer.xml"; + private readonly string MessageInfoFileName = "MessageInfo.xml"; public List Components { get; private set; } public List Orders { get; private set; } public List Dishes { get; private set; } public List Clients { get; private set; } public List Implementers { get; private set; } + public List MessageInfos { get; private set; } public static DataFileSingleton GetInstance() { if (instance == null) @@ -34,6 +36,7 @@ namespace AbstractFoodOrdersFileImplement public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); public void SaveClients() => SaveData(Clients, ClientFileName, "Clients", x => x.GetXElement); public void SaveImplementers() => SaveData(Implementers, ImplementerFileName, "Implementers", x => x.GetXElement); + public void SaveMessageInfos() => SaveData(MessageInfos, MessageInfoFileName, "MessageInfos", x => x.GetXElement); private DataFileSingleton() { Components = LoadData(ComponentFileName, "Component", x => @@ -45,6 +48,7 @@ namespace AbstractFoodOrdersFileImplement Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!; Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!; + MessageInfos = LoadData(MessageInfoFileName, "MessageInfo", x => MessageInfo.Create(x)!)!; } private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) diff --git a/FoodOrders/AbstractShopFileImplement/Implements/MessageInfoStorage.cs b/FoodOrders/AbstractShopFileImplement/Implements/MessageInfoStorage.cs new file mode 100644 index 0000000..a829928 --- /dev/null +++ b/FoodOrders/AbstractShopFileImplement/Implements/MessageInfoStorage.cs @@ -0,0 +1,61 @@ +using AbstractFoodOrdersContracts.BindingModels; +using AbstractFoodOrdersContracts.SearchModels; +using AbstractFoodOrdersContracts.StoragesContracts; +using AbstractFoodOrdersContracts.ViewModels; +using AbstractFoodOrdersFileImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractFoodOrdersFileImplement.Implements +{ + public class MessageInfoStorage:IMessageInfoStorage + { + private readonly DataFileSingleton source; + public MessageInfoStorage() + { + source = DataFileSingleton.GetInstance(); + } + public List GetFullList() + { + return source.MessageInfos + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(MessageInfoSearchModel model) + { + if (string.IsNullOrEmpty(model.MessageId) && !model.ClientId.HasValue) + { + return new(); + } + return source.MessageInfos + .Where(x => x.ClientId == model.ClientId) + .Select(x => x.GetViewModel) + .ToList(); + } + public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) + { + if (string.IsNullOrEmpty(model.MessageId) && !model.ClientId.HasValue) + { + return new(); + } + return source.MessageInfos + .FirstOrDefault(x => x.MessageId.Equals(model.MessageId) && x.ClientId == model.ClientId) + ?.GetViewModel; + } + + public MessageInfoViewModel? Insert(MessageInfoBindingModel model) + { + var newMessageInfo = MessageInfo.Create(model); + if (newMessageInfo == null) + { + return null; + } + source.MessageInfos.Add(newMessageInfo); + source.SaveMessageInfos(); + return newMessageInfo.GetViewModel; + } + } +} diff --git a/FoodOrders/AbstractShopFileImplement/Models/MessageInfo.cs b/FoodOrders/AbstractShopFileImplement/Models/MessageInfo.cs new file mode 100644 index 0000000..1cf1c5e --- /dev/null +++ b/FoodOrders/AbstractShopFileImplement/Models/MessageInfo.cs @@ -0,0 +1,74 @@ +using AbstractFoodOrdersContracts.BindingModels; +using AbstractFoodOrdersContracts.ViewModels; +using AbstractFoodOrdersDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; + +namespace AbstractFoodOrdersFileImplement.Models +{ + 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; + + public static MessageInfo? Create(MessageInfoBindingModel model) + { + if (model == null) + { + return null; + } + return new MessageInfo() + { + MessageId = model.MessageId, + ClientId = model.ClientId, + SenderName = model.SenderName, + Body = model.Body, + Subject = model.Subject, + DateDelivery = model.DateDelivery + }; + } + + public static MessageInfo? Create(XElement element) + { + if (element == null) + { + return null; + } + return new MessageInfo() + { + MessageId = element.Attribute("MessageId")!.Value, + ClientId = Convert.ToInt32(element.Element("ClientId")!.Value), + SenderName = element.Element("SenderName")!.Value, + Body = element.Element("Body")!.Value, + Subject = element.Element("Subject")!.Value, + DateDelivery = Convert.ToDateTime(element.Element("DateDelivery")!.Value) + }; + } + + public MessageInfoViewModel GetViewModel => new() + { + MessageId = MessageId, + ClientId = ClientId, + SenderName = SenderName, + Body = Body, + Subject = Subject, + DateDelivery = DateDelivery + }; + + public XElement GetXElement => new("MessageInfo", + new XAttribute("MessageId", MessageId), + new XElement("ClientId", ClientId.ToString()), + new XElement("SenderName", SenderName), + new XElement("Subject", Subject), + new XElement("Body", Body), + new XElement("DateDelivery", DateDelivery.ToString())); + } +} diff --git a/FoodOrders/FoodOrders/FormMails.Designer.cs b/FoodOrders/FoodOrders/FormMails.Designer.cs new file mode 100644 index 0000000..8de5b4a --- /dev/null +++ b/FoodOrders/FoodOrders/FormMails.Designer.cs @@ -0,0 +1,67 @@ +namespace FoodOrders +{ + partial class FormMails + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView + // + this.dataGridView.BackgroundColor = System.Drawing.Color.White; + this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dataGridView.Location = new System.Drawing.Point(2, 1); + this.dataGridView.MultiSelect = false; + this.dataGridView.Name = "dataGridView"; + this.dataGridView.RowHeadersVisible = false; + this.dataGridView.RowHeadersWidth = 51; + this.dataGridView.RowTemplate.Height = 29; + this.dataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dataGridView.Size = new System.Drawing.Size(809, 292); + this.dataGridView.TabIndex = 6; + // + // FormMails + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(812, 298); + this.Controls.Add(this.dataGridView); + this.Name = "FormMails"; + this.Text = "Письма"; + this.Load += new System.EventHandler(this.FormMails_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private DataGridView dataGridView; + } +} \ No newline at end of file diff --git a/FoodOrders/FoodOrders/FormMails.cs b/FoodOrders/FoodOrders/FormMails.cs new file mode 100644 index 0000000..d1ed859 --- /dev/null +++ b/FoodOrders/FoodOrders/FormMails.cs @@ -0,0 +1,47 @@ +using AbstractFoodOrdersContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace FoodOrders +{ + public partial class FormMails : Form + { + private readonly ILogger _logger; + private readonly IMessageInfoLogic _logic; + public FormMails(ILogger logger, IMessageInfoLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + } + + private void FormMails_Load(object sender, EventArgs e) + { + try + { + var list = _logic.ReadList(null); + if (list != null) + { + dataGridView.DataSource = list; + dataGridView.Columns["MessageId"].Visible = false; + dataGridView.Columns["ClientId"].Visible = false; + dataGridView.Columns["Body"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + } + _logger.LogInformation("Загрузка писем"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки писем"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/FoodOrders/FoodOrders/FormMails.resx b/FoodOrders/FoodOrders/FormMails.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/FoodOrders/FoodOrders/FormMails.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file