From 3db1002d0ffb8274c72c9c03b02437ac49ad5f31 Mon Sep 17 00:00:00 2001 From: Viltskaa Date: Sun, 23 Apr 2023 19:30:07 +0400 Subject: [PATCH] Edit logics files --- .../BusinessLogics/ClientLogic.cs | 27 ++++---- .../BusinessLogics/OrderLogic.cs | 29 +++++++- .../DataFileSingleton.cs | 12 +++- .../Implements/MessageInfoStorage.cs | 53 ++++++++++++++ .../SushiBarFileImplement/Models/Message.cs | 69 +++++++++++++++++++ .../DataListSingleton.cs | 2 + .../Implements/MessageInfoStorage.cs | 62 +++++++++++++++++ .../SushibarListImplement/Models/Message.cs | 42 +++++++++++ 8 files changed, 278 insertions(+), 18 deletions(-) create mode 100644 SushiBar/SushiBarFileImplement/Implements/MessageInfoStorage.cs create mode 100644 SushiBar/SushiBarFileImplement/Models/Message.cs create mode 100644 SushiBar/SushibarListImplement/Implements/MessageInfoStorage.cs create mode 100644 SushiBar/SushibarListImplement/Models/Message.cs diff --git a/SushiBar/SushiBarBusinessLogic/BusinessLogics/ClientLogic.cs b/SushiBar/SushiBarBusinessLogic/BusinessLogics/ClientLogic.cs index e5b1d79..092962b 100644 --- a/SushiBar/SushiBarBusinessLogic/BusinessLogics/ClientLogic.cs +++ b/SushiBar/SushiBarBusinessLogic/BusinessLogics/ClientLogic.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Logging; +using System.Text.RegularExpressions; +using Microsoft.Extensions.Logging; using SushiBarContracts.BindingModels; using SushiBarContracts.BusinessLogicsContracts; using SushiBarContracts.SearchModels; @@ -73,35 +74,33 @@ public class ClientLogic : IClientLogic private void CheckModel(ClientBindingModel? model, bool withParams = true) { if (model == null) - { throw new ArgumentNullException(nameof(model)); - } if (!withParams) - { return; - } if (string.IsNullOrEmpty(model.ClientFio)) - { throw new ArgumentNullException(nameof(model.ClientFio), "FIO must be not null"); - } + if (string.IsNullOrEmpty(model.Email)) - { throw new ArgumentNullException(nameof(model.Email), "EMAIL must be not null"); - } + if (string.IsNullOrEmpty(model.Password)) - { throw new ArgumentNullException(nameof(model.Password), "PASSWORD must be not null"); - } + + if (!Regex.IsMatch(model.Email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$", RegexOptions.IgnoreCase)) + throw new ArgumentException("Invalid format for email", nameof(model.Email)); + + if (!Regex.IsMatch(model.Password, @"^^((\w+\d+\W+)|(\w+\W+\d+)|(\d+\w+\W+)|(\d+\W+\w+)|(\W+\w+\d+)|(\W+\d+\w+))[\w\d\W]*$", RegexOptions.IgnoreCase)) + throw new ArgumentException("Invalid format for email", nameof(model.Password)); + _logger.LogInformation("Client .FIO:{ClientFio} .EMAIL:{Email} .Password:{Password} .Id:{Id}", model.ClientFio, model.Email, model.Password, model.Id); - var client = _clientStorage.GetElement(new ClientSearchModel() + var client = _clientStorage.GetElement(new ClientSearchModel { Email = model.Email }); + if (client != null && client.Id != model.Id) - { throw new InvalidOperationException("Email is already exists"); - } } } \ No newline at end of file diff --git a/SushiBar/SushiBarBusinessLogic/BusinessLogics/OrderLogic.cs b/SushiBar/SushiBarBusinessLogic/BusinessLogics/OrderLogic.cs index 54bee68..ed734a7 100644 --- a/SushiBar/SushiBarBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/SushiBar/SushiBarBusinessLogic/BusinessLogics/OrderLogic.cs @@ -1,5 +1,6 @@ using DocumentFormat.OpenXml.EMMA; using Microsoft.Extensions.Logging; +using SushiBarBusinessLogic.MailWorker; using SushiBarContracts.BindingModels; using SushiBarContracts.BusinessLogicsContracts; using SushiBarContracts.SearchModels; @@ -13,11 +14,18 @@ namespace SushiBarBusinessLogic.BusinessLogics { private readonly ILogger _logger; private readonly IOrderStorage _orderStorage; + private readonly AbstractMailWorker _mailWorker; + private readonly IClientLogic _clientLogic; - public OrderLogic(ILogger logger, IOrderStorage orderStorage) + public OrderLogic(ILogger logger, + IOrderStorage orderStorage, + AbstractMailWorker mailWorker, + IClientLogic clientLogic) { _logger = logger; _orderStorage = orderStorage; + _mailWorker = mailWorker; + _clientLogic = clientLogic; } public OrderViewModel? ReadElement(OrderSearchModel model) @@ -138,5 +146,24 @@ namespace SushiBarBusinessLogic.BusinessLogics throw new InvalidOperationException("This name is already exists"); } } + + private bool SendOrderMessage(int clientId, string subject, string text) + { + var client = _clientLogic.ReadElement(new ClientSearchModel { Id = clientId }); + + if (client == null) + { + return false; + } + + _mailWorker.MailSendAsync(new MailSendInfoBindingModel + { + MailAddress = client.Email, + Subject = subject, + Text = text + }); + + return true; + } } } \ No newline at end of file diff --git a/SushiBar/SushiBarFileImplement/DataFileSingleton.cs b/SushiBar/SushiBarFileImplement/DataFileSingleton.cs index ea43f81..2b2b058 100644 --- a/SushiBar/SushiBarFileImplement/DataFileSingleton.cs +++ b/SushiBar/SushiBarFileImplement/DataFileSingleton.cs @@ -10,10 +10,13 @@ namespace SushiBarFileImplement private readonly string OrderFileName = "Order.xml"; private readonly string SushiFileName = "Sushi.xml"; private readonly string ImplementerFileName = "Implementer.xml"; + private readonly string MessageFileName = "Message.xml"; public List Components { get; private set; } public List Orders { get; private set; } public List Sushis { get; private set; } public List Implementers { get; set; } + public List Messages { get; set; } + public static DataFileSingleton GetInstance() { instance ??= new DataFileSingleton(); @@ -23,13 +26,16 @@ namespace SushiBarFileImplement public void SaveSushis() => SaveData(Sushis, SushiFileName, "Sushis", x => x.GetXElement); public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); public void SaveImplementers() => SaveData(Implementers, ImplementerFileName, "Implementers", x => x.GetXElement); + public void SaveMessages() => SaveData(Messages, MessageFileName, "Messages", x => x.GetXElement); + private DataFileSingleton() { - Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!; - Sushis = LoadData(SushiFileName, "Sushi", x => Sushi.Create(x)!)!; - Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; + Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!; + Sushis = LoadData(SushiFileName, "Sushi", x => Sushi.Create(x)!)!; + Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!; + Messages = LoadData(MessageFileName, "Messages", x => Message.Create(x)!)!; } private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) { diff --git a/SushiBar/SushiBarFileImplement/Implements/MessageInfoStorage.cs b/SushiBar/SushiBarFileImplement/Implements/MessageInfoStorage.cs new file mode 100644 index 0000000..a108445 --- /dev/null +++ b/SushiBar/SushiBarFileImplement/Implements/MessageInfoStorage.cs @@ -0,0 +1,53 @@ +using SushiBarContracts.BindingModels; +using SushiBarContracts.SearchModels; +using SushiBarContracts.StoragesContracts; +using SushiBarContracts.ViewModels; +using SushiBarFileImplement.Models; + +namespace SushiBarFileImplement.Implements; + +public class MessageInfoStorage : IMessageInfoStorage +{ + private readonly DataFileSingleton source; + public MessageInfoStorage() + { + source = DataFileSingleton.GetInstance(); + } + public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) + { + return model.MessageId == null ? + null : + source.Messages + .FirstOrDefault(x => x.MessageId == model.MessageId) + ?.GetViewModel; + } + + public List GetFilteredList(MessageInfoSearchModel model) + { + if (!model.ClientId.HasValue) + return new List(); + return source.Messages + .Where(x => x.ClientId == model.ClientId) + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFullList() + { + return source.Messages + .Select(x => x.GetViewModel) + .ToList(); + } + + public MessageInfoViewModel? Insert(MessageInfoBindingModel model) + { + var newMessage = Message.Create(model); + if (newMessage == null) + { + return null; + } + source.Messages.Add(newMessage); + source.SaveMessages(); + return newMessage.GetViewModel; + } +} \ No newline at end of file diff --git a/SushiBar/SushiBarFileImplement/Models/Message.cs b/SushiBar/SushiBarFileImplement/Models/Message.cs new file mode 100644 index 0000000..3f2314f --- /dev/null +++ b/SushiBar/SushiBarFileImplement/Models/Message.cs @@ -0,0 +1,69 @@ +using System.Xml.Linq; +using SushiBarContracts.BindingModels; +using SushiBarContracts.ViewModels; +using SushiBarDataModels.Models; + +namespace SushiBarFileImplement.Models; + +public class Message : IMessageInfoModel +{ + public string MessageId { get; private set; } = string.Empty; + public int? ClientId { get; private set; } + public string SenderName { get; private set; } = string.Empty; + public DateTime DateDelivery { get; private set; } = DateTime.Now; + public string Subject { get; private set; } = string.Empty; + public string Body { get; private set; } = string.Empty; + + public static Message? Create(MessageInfoBindingModel? model) + { + if (model == null) + { + return null; + } + return new Message + { + Body = model.Body, + Subject = model.Subject, + DateDelivery = model.DateDelivery, + SenderName = model.SenderName, + ClientId = model.ClientId, + MessageId = model.MessageId + }; + } + + public static Message? Create(XElement? element) + { + if (element == null) + { + return null; + } + return new Message + { + Body = element.Attribute("Body")!.Value, + Subject = element.Attribute("Subject")!.Value, + DateDelivery = Convert.ToDateTime(element.Attribute("DateDelivery")!.Value), + SenderName = element.Attribute("SenderName")!.Value, + ClientId = Convert.ToInt32(element.Attribute("ClientId")!.Value), + MessageId = element.Attribute("MessageId")!.Value, + }; + } + + public MessageInfoViewModel GetViewModel => new() + { + Body = Body, + Subject = Subject, + DateDelivery = DateDelivery, + SenderName = SenderName, + ClientId = ClientId, + MessageId = MessageId + }; + + public XElement GetXElement => new("MessageInfo", + new XAttribute("Subject", Subject), + new XAttribute("Body", Body), + new XAttribute("ClientId", ClientId), + new XAttribute("MessageId", MessageId), + new XAttribute("SenderName", SenderName), + new XAttribute("DateDelivery", DateDelivery) + ); +} \ No newline at end of file diff --git a/SushiBar/SushibarListImplement/DataListSingleton.cs b/SushiBar/SushibarListImplement/DataListSingleton.cs index fe4b45b..0ff341f 100644 --- a/SushiBar/SushibarListImplement/DataListSingleton.cs +++ b/SushiBar/SushibarListImplement/DataListSingleton.cs @@ -9,6 +9,7 @@ namespace SushibarListImplement public List Orders { get; set; } public List Sushi { get; set; } public List Implementers { get; set; } + public List Messages { get; set; } private DataListSingleton() { @@ -16,6 +17,7 @@ namespace SushibarListImplement Orders = new List(); Sushi = new List(); Implementers = new List(); + Messages = new List(); } public static DataListSingleton GetInstance() { diff --git a/SushiBar/SushibarListImplement/Implements/MessageInfoStorage.cs b/SushiBar/SushibarListImplement/Implements/MessageInfoStorage.cs new file mode 100644 index 0000000..27f4802 --- /dev/null +++ b/SushiBar/SushibarListImplement/Implements/MessageInfoStorage.cs @@ -0,0 +1,62 @@ +using SushiBarContracts.BindingModels; +using SushiBarContracts.SearchModels; +using SushiBarContracts.StoragesContracts; +using SushiBarContracts.ViewModels; +using SushibarListImplement.Models; + +namespace SushibarListImplement.Implements; + +public class MessageInfoStorage : IMessageInfoStorage +{ + private readonly DataListSingleton _source; + public MessageInfoStorage() + { + _source = DataListSingleton.GetInstance(); + } + public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) + { + if (model.MessageId == null) return null; + foreach (var message in _source.Messages) + { + if (model.MessageId.Equals(message.MessageId)) + return message.GetViewModel; + } + + return null; + } + + public List GetFilteredList(MessageInfoSearchModel model) + { + if (!model.ClientId.HasValue) + { + return new List(); + } + var result = new List(); + foreach (var item in _source.Messages) + { + if (item.ClientId == model.ClientId) + { + result.Add(item.GetViewModel); + } + } + return result; + } + + public List GetFullList() + { + var result = new List(); + foreach (var item in _source.Messages) + { + result.Add(item.GetViewModel); + } + return result; + } + + public MessageInfoViewModel? Insert(MessageInfoBindingModel model) + { + var newMessage = Message.Create(model); + if (newMessage == null) return null; + _source.Messages.Add(newMessage); + return newMessage.GetViewModel; + } +} \ No newline at end of file diff --git a/SushiBar/SushibarListImplement/Models/Message.cs b/SushiBar/SushibarListImplement/Models/Message.cs new file mode 100644 index 0000000..2f2ce2d --- /dev/null +++ b/SushiBar/SushibarListImplement/Models/Message.cs @@ -0,0 +1,42 @@ +using SushiBarContracts.BindingModels; +using SushiBarContracts.ViewModels; +using SushiBarDataModels.Models; + +namespace SushibarListImplement.Models; + +public class Message : IMessageInfoModel +{ + public string MessageId { get; private set; } = string.Empty; + public int? ClientId { get; private set; } + public string SenderName { get; private set; } = string.Empty; + public DateTime DateDelivery { get; private set; } = DateTime.Now; + public string Subject { get; private set; } = string.Empty; + public string Body { get; private set; } = string.Empty; + + public static Message? Create(MessageInfoBindingModel? model) + { + if (model == null) + { + return null; + } + return new Message + { + Body = model.Body, + Subject = model.Subject, + DateDelivery = model.DateDelivery, + SenderName = model.SenderName, + ClientId = model.ClientId, + MessageId = model.MessageId + }; + } + + public MessageInfoViewModel GetViewModel => new() + { + Body = Body, + Subject = Subject, + DateDelivery = DateDelivery, + SenderName = SenderName, + ClientId = ClientId, + MessageId = MessageId + }; +} \ No newline at end of file