diff --git a/DressAtelierBusinessLogic/BusinessLogic/ClientLogic.cs b/DressAtelierBusinessLogic/BusinessLogic/ClientLogic.cs index ef9ab11..effe265 100644 --- a/DressAtelierBusinessLogic/BusinessLogic/ClientLogic.cs +++ b/DressAtelierBusinessLogic/BusinessLogic/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 DressAtelierBusinessLogic.BusinessLogic @@ -101,11 +102,11 @@ namespace DressAtelierBusinessLogic.BusinessLogic { throw new ArgumentNullException("Invalid fullname of user", nameof(model.FullName)); } - if (string.IsNullOrEmpty(model.Email)) + if (string.IsNullOrEmpty(model.Email) || !Regex.IsMatch(model.Email, @"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$", RegexOptions.IgnoreCase)) { throw new ArgumentNullException("Invalid email of user", nameof(model.Email)); } - if (string.IsNullOrEmpty(model.Password)) + if (string.IsNullOrEmpty(model.Password) || !Regex.IsMatch(model.Password, @"^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$", RegexOptions.IgnoreCase)) { throw new ArgumentNullException("Invalid password of user", nameof(model.Password)); } diff --git a/DressAtelierBusinessLogic/BusinessLogic/OrderLogic.cs b/DressAtelierBusinessLogic/BusinessLogic/OrderLogic.cs index a67c18a..d364bc4 100644 --- a/DressAtelierBusinessLogic/BusinessLogic/OrderLogic.cs +++ b/DressAtelierBusinessLogic/BusinessLogic/OrderLogic.cs @@ -1,4 +1,5 @@ -using DressAtelierContracts.BindingModels; +using DressAtelierBusinessLogic.MailEmployee; +using DressAtelierContracts.BindingModels; using DressAtelierContracts.BusinessLogicContracts; using DressAtelierContracts.SearchModels; using DressAtelierContracts.StorageContracts; @@ -18,11 +19,14 @@ namespace DressAtelierBusinessLogic.BusinessLogic private readonly ILogger _logger; private readonly IOrderStorage _orderStorage; - - public OrderLogic(ILogger logger, IOrderStorage orderStorage) + private readonly IClientStorage _clientStorage; + private readonly AbstractMailEmployee _mailLogic; + public OrderLogic(ILogger logger, IOrderStorage orderStorage, IClientStorage clientStorage, AbstractMailEmployee mailLogic) { _logger = logger; _orderStorage = orderStorage; + _clientStorage = clientStorage; + _mailLogic = mailLogic; } public bool CreateOrder(OrderBindingModel model) @@ -36,11 +40,19 @@ namespace DressAtelierBusinessLogic.BusinessLogic } model.Status = OrderStatus.Accepted; - if (_orderStorage.Insert(model) == null) + + var order = _orderStorage.Insert(model); + if (order == null) { _logger.LogWarning("Insert operation failed"); return false; } + + OrderViewModel orderViewModel = _orderStorage.GetElement(new OrderSearchModel { ID = order.ID}); + ClientViewModel clientViewModel = _clientStorage.GetElement(new ClientSearchModel { ID = orderViewModel.ClientID }); + + SendEmail(clientViewModel,orderViewModel); + return true; } @@ -55,8 +67,14 @@ namespace DressAtelierBusinessLogic.BusinessLogic { ID = model.ID }).EmployeeID; + _orderStorage.Update(model); + OrderViewModel orderViewModel = _orderStorage.GetElement(new OrderSearchModel { ID = model.ID }); + ClientViewModel clientViewModel = _clientStorage.GetElement(new ClientSearchModel { ID = orderViewModel.ClientID }); + + SendEmail(clientViewModel, orderViewModel); + return true; } @@ -69,7 +87,14 @@ namespace DressAtelierBusinessLogic.BusinessLogic { ID = model.ID }).EmployeeID; + _orderStorage.Update(model); + + OrderViewModel orderViewModel = _orderStorage.GetElement(new OrderSearchModel { ID = model.ID }); + ClientViewModel clientViewModel = _clientStorage.GetElement(new ClientSearchModel { ID = orderViewModel.ClientID }); + + SendEmail(clientViewModel, orderViewModel); + return true; } @@ -89,6 +114,12 @@ namespace DressAtelierBusinessLogic.BusinessLogic _logger.LogInformation("Update to in process status. ID:{ID}", model.ID); model.Status = OrderStatus.InProcess; _orderStorage.Update(model); + + OrderViewModel orderViewModel = _orderStorage.GetElement(new OrderSearchModel { ID = model.ID }); + ClientViewModel clientViewModel = _clientStorage.GetElement(new ClientSearchModel { ID = orderViewModel.ClientID }); + + SendEmail(clientViewModel, orderViewModel); + return true; } @@ -146,5 +177,37 @@ namespace DressAtelierBusinessLogic.BusinessLogic throw new InvalidOperationException("Order with such name already exists."); } } + + public void SendEmail(ClientViewModel clientModel ,OrderViewModel orderModel) + { + if(clientModel == null && orderModel == null) + { + return; + } + + MailSendInfoBindingModel mailModel; + + if (orderModel.Status == OrderStatus.Accepted) + { + mailModel = new MailSendInfoBindingModel + { + Address = clientModel.Email, + Subject = $"Order №{orderModel.ID}", + Text = $"Your order №{orderModel.ID} by {orderModel.DateCreate} on {orderModel.Sum} was accepted!" + }; + } + else + { + mailModel = new MailSendInfoBindingModel + { + Address = clientModel.Email, + Subject = $"Order №{orderModel.ID}", + Text = $"Order №{orderModel.ID} status was changed to {orderModel.Status}" + }; + } + + + _mailLogic.MailSendAsync(mailModel); + } } } diff --git a/DressAtelierBusinessLogic/MailEmployee/MailKitEmployee.cs b/DressAtelierBusinessLogic/MailEmployee/MailKitEmployee.cs index 41e6cd3..1e95fd1 100644 --- a/DressAtelierBusinessLogic/MailEmployee/MailKitEmployee.cs +++ b/DressAtelierBusinessLogic/MailEmployee/MailKitEmployee.cs @@ -9,8 +9,9 @@ using System.Net; using System.Security.Authentication; using System.Text; using System.Threading.Tasks; -using MailKit.Net.Pop3; +using MailKit.Net; using MailKit.Security; +using MailKit.Net.Pop3; namespace DressAtelierBusinessLogic.MailEmployee { @@ -45,7 +46,8 @@ namespace DressAtelierBusinessLogic.MailEmployee protected override async Task> ReceiveMailAsync() { - var list = new List(); using var client = new Pop3Client(); + var list = new List(); + using var client = new Pop3Client(); await Task.Run(() => { try { @@ -59,10 +61,10 @@ namespace DressAtelierBusinessLogic.MailEmployee list.Add(new MessageInfoBindingModel { DeliveryDate = message.Date.DateTime, - ID = message.MessageId, + ID = message.MessageId, SenderName = mail.Address, Subject = message.Subject, - Body = message.TextBody + Body = message.TextBody != null ? message.TextBody : message.HtmlBody }); } } diff --git a/DressAtelierClientApp/Controllers/HomeController.cs b/DressAtelierClientApp/Controllers/HomeController.cs index bfe971d..77d5de6 100644 --- a/DressAtelierClientApp/Controllers/HomeController.cs +++ b/DressAtelierClientApp/Controllers/HomeController.cs @@ -110,7 +110,7 @@ namespace DressAtelierClientApp.Controllers return count * (prod?.Price ?? 1); } - [HttpGet] public IActionResult Mails() + [HttpGet] public IActionResult Mail() { if (APIClient.Client == null) { diff --git a/DressAtelierClientApp/Views/Home/Mail.cshtml b/DressAtelierClientApp/Views/Home/Mail.cshtml index 035e170..fa896d6 100644 --- a/DressAtelierClientApp/Views/Home/Mail.cshtml +++ b/DressAtelierClientApp/Views/Home/Mail.cshtml @@ -1,7 +1,7 @@ @using DressAtelierContracts.ViewModels @model List @{ - ViewData["Title"] = "Mails"; + ViewData["Title"] = "Mail"; }

Orders

diff --git a/DressAtelierClientApp/Views/Shared/_Layout.cshtml b/DressAtelierClientApp/Views/Shared/_Layout.cshtml index 9d95cd2..e7d2d08 100644 --- a/DressAtelierClientApp/Views/Shared/_Layout.cshtml +++ b/DressAtelierClientApp/Views/Shared/_Layout.cshtml @@ -26,7 +26,7 @@ Personal data