diff --git a/SushiBar/SushiBar/App.config b/SushiBar/SushiBar/App.config
new file mode 100644
index 0000000..7d2b7c1
--- /dev/null
+++ b/SushiBar/SushiBar/App.config
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SushiBar/SushiBar/Program.cs b/SushiBar/SushiBar/Program.cs
index 3bef04e..877c933 100644
--- a/SushiBar/SushiBar/Program.cs
+++ b/SushiBar/SushiBar/Program.cs
@@ -4,8 +4,10 @@ using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using SushiBar.Forms;
using SushiBarBusinessLogic.BusinessLogics;
+using SushiBarBusinessLogic.MailWorker;
using SushiBarBusinessLogic.OfficePackage;
using SushiBarBusinessLogic.OfficePackage.Implements;
+using SushiBarContracts.BindingModels;
using SushiBarContracts.BusinessLogicsContracts;
using SushiBarContracts.StoragesContracts;
using SushiBarDatabaseImplement.Implements;
@@ -28,6 +30,21 @@ namespace SushiBar
var services = new ServiceCollection();
ConfigureServices(services);
_serviceProvider = services.BuildServiceProvider();
+ try
+ {
+ var mailSender = _serviceProvider.GetService();
+ mailSender?.MailConfig(new MailConfigBindingModel
+ {
+ MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty,
+ MailPassword = System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? string.Empty,
+ SmtpClientHost = System.Configuration.ConfigurationManager.AppSettings["SmtpClientHost"] ?? string.Empty,
+ SmtpClientPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SmtpClientPort"]),
+ PopHost = System.Configuration.ConfigurationManager.AppSettings["PopHost"] ?? string.Empty,
+ PopPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["PopPort"])
+ });
+ var timer = new System.Threading.Timer(new
+ TimerCallback(MailCheck!), null, 0, 100000);
+ }
Application.Run(_serviceProvider.GetRequiredService());
}
private static void ConfigureServices(ServiceCollection services)
@@ -68,5 +85,7 @@ namespace SushiBar
services.AddTransient();
services.AddTransient();
}
+
+ private static void MailCheck(object obj) => ServiceProvider?.GetService()?.MailCheck();
}
}
diff --git a/SushiBar/SushiBarBusinessLogic/BusinessLogics/MessageInfoLogic.cs b/SushiBar/SushiBarBusinessLogic/BusinessLogics/MessageInfoLogic.cs
new file mode 100644
index 0000000..259de9b
--- /dev/null
+++ b/SushiBar/SushiBarBusinessLogic/BusinessLogics/MessageInfoLogic.cs
@@ -0,0 +1,43 @@
+using Microsoft.Extensions.Logging;
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.BusinessLogicsContracts;
+using SushiBarContracts.SearchModels;
+using SushiBarContracts.StoragesContracts;
+using SushiBarContracts.ViewModels;
+
+namespace SushiBarBusinessLogic.BusinessLogics
+{
+ public class MessageInfoLogic : IMessageInfoLogic
+ {
+ private readonly ILogger _logger;
+ private readonly IMessageInfoStorage _messageInfoStorage;
+ public MessageInfoLogic(ILogger logger, IMessageInfoStorage MessageInfoStorage)
+ {
+ _logger = logger;
+ _messageInfoStorage = MessageInfoStorage;
+ }
+
+ public bool Create(MessageInfoBindingModel model)
+ {
+ if (_messageInfoStorage.Insert(model) == null)
+ {
+ _logger.LogWarning("Insert operation failed");
+ return false;
+ }
+ return true;
+ }
+
+ public List? ReadList(MessageInfoSearchModel? model)
+ {
+ _logger.LogInformation("ReadList. MessageId:{MessageId}.ClientId:{ClientId} ", model?.MessageId, model?.ClientId);
+ var list = (model == null) ? _messageInfoStorage.GetFullList() : _messageInfoStorage.GetFilteredList(model);
+ if (list == null)
+ {
+ _logger.LogWarning("ReadList return null list");
+ return null;
+ }
+ _logger.LogInformation("ReadList. Count:{Count}", list.Count);
+ return list;
+ }
+ }
+}
diff --git a/SushiBar/SushiBarBusinessLogic/BusinessLogics/OrderLogic.cs b/SushiBar/SushiBarBusinessLogic/BusinessLogics/OrderLogic.cs
index c16bb41..9e5a557 100644
--- a/SushiBar/SushiBarBusinessLogic/BusinessLogics/OrderLogic.cs
+++ b/SushiBar/SushiBarBusinessLogic/BusinessLogics/OrderLogic.cs
@@ -1,4 +1,5 @@
using Microsoft.Extensions.Logging;
+using SushiBarBusinessLogic.MailWorker;
using SushiBarContracts.BindingModels;
using SushiBarContracts.BusinessLogicsContracts;
using SushiBarContracts.SearchModels;
@@ -12,10 +13,16 @@ namespace SushiBarBusinessLogic.BusinessLogics
{
private readonly ILogger _logger;
private readonly IOrderStorage _orderStorage;
- public OrderLogic(ILogger logger, IOrderStorage orderStorage)
+ private readonly AbstractMailWorker _mailWorker;
+ private readonly IClientLogic _clientLogic;
+ static readonly object locker = new object();
+ public OrderLogic(ILogger logger, IOrderStorage orderStorage,
+ AbstractMailWorker mailWorker, IClientLogic clientLogic)
{
_logger = logger;
_orderStorage = orderStorage;
+ _mailWorker = mailWorker;
+ _clientLogic = clientLogic;
}
public List? ReadList(OrderSearchModel? model)
{
@@ -57,6 +64,7 @@ namespace SushiBarBusinessLogic.BusinessLogics
_logger.LogWarning("Insert operation failed");
return false;
}
+ SendOrderStatusMail(model.ClientId, $"Изменен статус заказа #{res.Id}", $"Заказ #{res.Id} изменен статус на {model.Status}");
return true;
}
public bool TakeOrderInWork(OrderBindingModel model)
@@ -111,12 +119,14 @@ namespace SushiBarBusinessLogic.BusinessLogics
model.DateImplement = DateTime.Now;
}
- if (_orderStorage.Update(model) == null)
+ var result = _orderStorage.Update(model);
+ if (result == null)
{
model.Status--;
_logger.LogWarning("Changing status operation faled");
return false;
}
+ SendOrderStatusMail(result.ClientId, $"Изменен статус заказа #{result.Id}", $"Заказ #{model.Id} изменен статус на {result.Status}");
return true;
}
@@ -143,5 +153,20 @@ namespace SushiBarBusinessLogic.BusinessLogics
throw new ArgumentException("Сумма заказа должна быть больше 0", nameof(model.Sum));
}
}
+ private bool SendOrderStatusMail(int clientId, string subject, string text)
+ {
+ var client = _clientLogic.ReadElement(new() { Id = clientId });
+ if (client == null)
+ {
+ return false;
+ }
+ _mailWorker.MailSendAsync(new()
+ {
+ MailAddress = client.Email,
+ Subject = subject,
+ Text = text
+ });
+ return true;
+ }
}
}
diff --git a/SushiBar/SushiBarBusinessLogic/MailWorker/AbstractMailWorker.cs b/SushiBar/SushiBarBusinessLogic/MailWorker/AbstractMailWorker.cs
new file mode 100644
index 0000000..4cce4c4
--- /dev/null
+++ b/SushiBar/SushiBarBusinessLogic/MailWorker/AbstractMailWorker.cs
@@ -0,0 +1,75 @@
+using Microsoft.Extensions.Logging;
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.BusinessLogicsContracts;
+
+namespace SushiBarBusinessLogic.MailWorker
+{
+ public abstract class AbstractMailWorker
+ {
+ protected string _mailLogin = string.Empty;
+ protected string _mailPassword = string.Empty;
+ protected string _smtpClientHost = string.Empty;
+ protected int _smtpClientPort;
+ protected string _popHost = string.Empty;
+ protected int _popPort;
+ private readonly IMessageInfoLogic _messageInfoLogic;
+ private readonly ILogger _logger;
+ public AbstractMailWorker(ILogger logger, IMessageInfoLogic messageInfoLogic)
+ {
+ _logger = logger;
+ _messageInfoLogic = messageInfoLogic;
+ }
+ public void MailConfig(MailConfigBindingModel config)
+ {
+ _mailLogin = config.MailLogin;
+ _mailPassword = config.MailPassword;
+ _smtpClientHost = config.SmtpClientHost;
+ _smtpClientPort = config.SmtpClientPort;
+ _popHost = config.PopHost;
+ _popPort = config.PopPort;
+ _logger.LogDebug("Config: {login}, {password}, {clientHost}, { clientPOrt}, { popHost}, { popPort}",
+ _mailLogin, _mailPassword, _smtpClientHost, _smtpClientPort, _popHost, _popPort);
+ }
+ public async void MailSendAsync(MailSendInfoBindingModel info)
+ {
+ if (string.IsNullOrEmpty(_mailLogin) || string.IsNullOrEmpty(_mailPassword))
+ {
+ return;
+ }
+ if (string.IsNullOrEmpty(_smtpClientHost) || _smtpClientPort == 0)
+ {
+ return;
+ }
+ if (string.IsNullOrEmpty(info.MailAddress) || string.IsNullOrEmpty(info.Subject) || string.IsNullOrEmpty(info.Text))
+ {
+ return;
+ }
+ _logger.LogDebug("Send Mail: {To}, {Subject}", info.MailAddress, info.Subject);
+ await SendMailAsync(info);
+ }
+ public async void MailCheck()
+ {
+ if (string.IsNullOrEmpty(_mailLogin) || string.IsNullOrEmpty(_mailPassword))
+ {
+ return;
+ }
+ if (string.IsNullOrEmpty(_popHost) || _popPort == 0)
+ {
+ return;
+ }
+ if (_messageInfoLogic == null)
+ {
+ return;
+ }
+ var list = await ReceiveMailAsync();
+ _logger.LogDebug("Check Mail: {Count} new mails", list.Count);
+ foreach (var mail in list)
+ {
+ _messageInfoLogic.Create(mail);
+ }
+ }
+ protected abstract Task SendMailAsync(MailSendInfoBindingModel info);
+ protected abstract Task>
+ ReceiveMailAsync();
+ }
+}
diff --git a/SushiBar/SushiBarBusinessLogic/MailWorker/MailKitWorker.cs b/SushiBar/SushiBarBusinessLogic/MailWorker/MailKitWorker.cs
new file mode 100644
index 0000000..b36bd96
--- /dev/null
+++ b/SushiBar/SushiBarBusinessLogic/MailWorker/MailKitWorker.cs
@@ -0,0 +1,74 @@
+using Microsoft.Extensions.Logging;
+using SushiBarContracts.BindingModels;
+using SushiBarContracts.BusinessLogicsContracts;
+using System.Net.Mail;
+using System.Net;
+using System.Text;
+using MailKit.Security;
+using MailKit.Net.Pop3;
+
+namespace SushiBarBusinessLogic.MailWorker
+{
+ public class MailKitWorker : AbstractMailWorker
+ {
+ public MailKitWorker(ILogger logger, IMessageInfoLogic messageInfoLogic) : base(logger, messageInfoLogic) { }
+ protected override async Task SendMailAsync(MailSendInfoBindingModel info)
+ {
+ using var objMailMessage = new MailMessage();
+ using var objSmtpClient = new SmtpClient(_smtpClientHost, _smtpClientPort);
+ try
+ {
+ objMailMessage.From = new MailAddress(_mailLogin);
+ objMailMessage.To.Add(new MailAddress(info.MailAddress));
+ objMailMessage.Subject = info.Subject;
+ objMailMessage.Body = info.Text;
+ objMailMessage.SubjectEncoding = Encoding.UTF8;
+ objMailMessage.BodyEncoding = Encoding.UTF8;
+ objSmtpClient.UseDefaultCredentials = false;
+ objSmtpClient.EnableSsl = true;
+ objSmtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
+ objSmtpClient.Credentials = new NetworkCredential(_mailLogin, _mailPassword);
+ await Task.Run(() => objSmtpClient.Send(objMailMessage));
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+ protected override async Task>
+ ReceiveMailAsync()
+ {
+ var list = new List();
+ using var client = new Pop3Client();
+ await Task.Run(() =>
+ {
+ try
+ {
+ client.Connect(_popHost, _popPort, SecureSocketOptions.SslOnConnect);
+ client.Authenticate(_mailLogin, _mailPassword);
+ for (int i = 0; i < client.Count; i++)
+ {
+ var message = client.GetMessage(i);
+ foreach (var mail in message.From.Mailboxes)
+ {
+ list.Add(new MessageInfoBindingModel
+ {
+ DateDelivery = message.Date.DateTime,
+ MessageId = message.MessageId,
+ SenderName = mail.Address,
+ Subject = message.Subject,
+ Body = message.TextBody
+ });
+ }
+ }
+ }
+ catch (AuthenticationException) { }
+ finally
+ {
+ client.Disconnect(true);
+ }
+ });
+ return list;
+ }
+ }
+}
diff --git a/SushiBar/SushiBarBusinessLogic/SushiBarBusinessLogic.csproj b/SushiBar/SushiBarBusinessLogic/SushiBarBusinessLogic.csproj
index e944f4d..5639c84 100644
--- a/SushiBar/SushiBarBusinessLogic/SushiBarBusinessLogic.csproj
+++ b/SushiBar/SushiBarBusinessLogic/SushiBarBusinessLogic.csproj
@@ -9,6 +9,7 @@
+