From fa9c760a0b76dd99abcde0b7ed79d93aee5634e6 Mon Sep 17 00:00:00 2001 From: Ino Date: Tue, 11 Apr 2023 15:29:05 +0400 Subject: [PATCH 1/8] =?UTF-8?q?7=20=D0=B1=D0=B0=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogics/MessageInfoLogic.cs | 43 ++ .../BusinessLogics/OrderLogic.cs | 62 ++- .../IceCreamBusinessLogic.csproj | 1 + .../MailWorker/AbstractMailWorker.cs | 97 ++++ .../MailWorker/MailKitWorker.cs | 78 ++++ IceCreamShop/IceCreamShop/App.config | 11 + .../IceCreamShop/FormMain.Designer.cs | 427 +++++++++--------- IceCreamShop/IceCreamShop/FormMain.cs | 395 ++++++++-------- .../IceCreamShop/FormViewMail.Designer.cs | 62 +++ IceCreamShop/IceCreamShop/FormViewMail.cs | 40 ++ IceCreamShop/IceCreamShop/FormViewMail.resx | 60 +++ .../IceCreamShop/IceCreamShopView.csproj | 3 + IceCreamShop/IceCreamShop/Program.cs | 36 +- .../Controllers/HomeController.cs | 12 +- .../Views/Home/Mails.cshtml | 54 +++ .../Views/Shared/_Layout.cshtml | 3 + .../BindingModels/MailConfigBindingModel.cs | 17 + .../BindingModels/MailSendInfoBindingModel.cs | 11 + .../BindingModels/MessageInfoBindingModel.cs | 19 + .../IMessageInfoLogic.cs | 13 + .../SearchModels/MessageInfoSearchModel.cs | 9 + .../StoragesContracts/IMessageInfoStorage.cs | 17 + .../ViewModels/MessageInfoViewModel.cs | 24 + .../Models/IMessageInfoModel.cs | 13 + .../IceCreamShopDatabase.cs | 2 + .../Implements/MessageInfoStorage.cs | 52 +++ .../20230411104402_LabWork07_mail.Designer.cs | 298 ++++++++++++ .../20230411104402_LabWork07_mail.cs | 48 ++ .../IceCreamShopDatabaseModelSnapshot.cs | 41 ++ .../Models/Client.cs | 5 +- .../Models/MessageInfo.cs | 52 +++ .../Models/Order.cs | 6 +- .../DataFileSingleton.cs | 4 + .../Implements/MessageInfoStorage.cs | 53 +++ .../Models/MessageInfo.cs | 75 +++ .../DataListSingleton.cs | 2 + .../Implements/MessageInfoStorage.cs | 60 +++ .../Models/MessageInfo.cs | 49 ++ .../Controllers/ClientController.cs | 22 +- .../IceCreamShopRestApi.csproj | 1 + IceCreamShop/IceCreamShopRestApi/Order.xml | 8 + IceCreamShop/IceCreamShopRestApi/Program.cs | 19 +- .../IceCreamShopRestApi/appsettings.json | 9 +- 43 files changed, 1877 insertions(+), 436 deletions(-) create mode 100644 IceCreamShop/IceCreamBusinessLogic/BusinessLogics/MessageInfoLogic.cs create mode 100644 IceCreamShop/IceCreamBusinessLogic/MailWorker/AbstractMailWorker.cs create mode 100644 IceCreamShop/IceCreamBusinessLogic/MailWorker/MailKitWorker.cs create mode 100644 IceCreamShop/IceCreamShop/App.config create mode 100644 IceCreamShop/IceCreamShop/FormViewMail.Designer.cs create mode 100644 IceCreamShop/IceCreamShop/FormViewMail.cs create mode 100644 IceCreamShop/IceCreamShop/FormViewMail.resx create mode 100644 IceCreamShop/IceCreamShopClientApp/Views/Home/Mails.cshtml create mode 100644 IceCreamShop/IceCreamShopContracts/BindingModels/MailConfigBindingModel.cs create mode 100644 IceCreamShop/IceCreamShopContracts/BindingModels/MailSendInfoBindingModel.cs create mode 100644 IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs create mode 100644 IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IMessageInfoLogic.cs create mode 100644 IceCreamShop/IceCreamShopContracts/SearchModels/MessageInfoSearchModel.cs create mode 100644 IceCreamShop/IceCreamShopContracts/StoragesContracts/IMessageInfoStorage.cs create mode 100644 IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs create mode 100644 IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs create mode 100644 IceCreamShop/IceCreamShopDatabaseImplement/Implements/MessageInfoStorage.cs create mode 100644 IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.Designer.cs create mode 100644 IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.cs create mode 100644 IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs create mode 100644 IceCreamShop/IceCreamShopFileImplement/Implements/MessageInfoStorage.cs create mode 100644 IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs create mode 100644 IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs create mode 100644 IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs create mode 100644 IceCreamShop/IceCreamShopRestApi/Order.xml diff --git a/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/MessageInfoLogic.cs b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/MessageInfoLogic.cs new file mode 100644 index 0000000..06f8576 --- /dev/null +++ b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/MessageInfoLogic.cs @@ -0,0 +1,43 @@ +using IceCreamShopContracts.BindingModels; +using IceCreamShopContracts.BusinessLogicsContracts; +using IceCreamShopContracts.SearchModels; +using IceCreamShopContracts.StoragesContracts; +using IceCreamShopContracts.ViewModels; +using Microsoft.Extensions.Logging; + +namespace IceCreamBusinessLogic.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/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/OrderLogic.cs b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/OrderLogic.cs index 97f523b..7e6a6e1 100644 --- a/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/OrderLogic.cs @@ -10,6 +10,7 @@ using IceCreamShopContracts.SearchModels; using IceCreamShopContracts.StoragesContracts; using IceCreamShopContracts.ViewModels; using AbstractIceCreamShopDataModels.Enums; +using IceCreamBusinessLogic.MailWorker; namespace IceCreamBusinessLogic.BusinessLogics { @@ -17,12 +18,16 @@ namespace IceCreamBusinessLogic.BusinessLogics { private readonly ILogger _logger; private readonly IOrderStorage _orderStorage; + private readonly AbstractMailWorker _mailWorker; + private readonly IClientLogic _clientLogic; - public OrderLogic(IOrderStorage orderStorage, ILogger logger) - { + public OrderLogic(ILogger logger, IOrderStorage orderStorage, AbstractMailWorker mailWorker, IClientLogic clientLogic) + { _orderStorage = orderStorage; _logger = logger; - } + _mailWorker = mailWorker; + _clientLogic = clientLogic; + } public bool CreateOrder(OrderBindingModel model) { @@ -33,14 +38,15 @@ namespace IceCreamBusinessLogic.BusinessLogics return false; } model.Status = OrderStatus.Принят; - if (_orderStorage.Insert(model) == null) - { - model.Status = OrderStatus.Неизвестен; - _logger.LogWarning("Insert operation failed"); - return false; - } - return true; - } + var result = _orderStorage.Insert(model); + if (result == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + SendOrderStatusMail(result.ClientId, $"Новый заказ создан. Номер заказа #{result.Id}", $"Заказ #{result.Id} от {result.DateCreate} на сумму {result.Sum:0.00} принят"); + return true; + } public bool DeliveryOrder(OrderBindingModel model) { @@ -119,13 +125,15 @@ namespace IceCreamBusinessLogic.BusinessLogics model.IceCreamId = vmodel.IceCreamId; model.Sum = vmodel.Sum; model.Count = vmodel.Count; - if (_orderStorage.Update(model) == null) - { - _logger.LogWarning("Update operation failed"); - return false; - } - return true; - } + var result = _orderStorage.Update(model); + if (result == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + SendOrderStatusMail(result.ClientId, $"Изменен статус заказа #{result.Id}", $"Заказ #{model.Id} изменен статус на {result.Status}"); + return true; + } public OrderViewModel? ReadElement(OrderSearchModel model) @@ -144,5 +152,21 @@ namespace IceCreamBusinessLogic.BusinessLogics _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); return element; } - } + + 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/IceCreamShop/IceCreamBusinessLogic/IceCreamBusinessLogic.csproj b/IceCreamShop/IceCreamBusinessLogic/IceCreamBusinessLogic.csproj index b70c7ba..24e35c5 100644 --- a/IceCreamShop/IceCreamBusinessLogic/IceCreamBusinessLogic.csproj +++ b/IceCreamShop/IceCreamBusinessLogic/IceCreamBusinessLogic.csproj @@ -8,6 +8,7 @@ + diff --git a/IceCreamShop/IceCreamBusinessLogic/MailWorker/AbstractMailWorker.cs b/IceCreamShop/IceCreamBusinessLogic/MailWorker/AbstractMailWorker.cs new file mode 100644 index 0000000..9c6e437 --- /dev/null +++ b/IceCreamShop/IceCreamBusinessLogic/MailWorker/AbstractMailWorker.cs @@ -0,0 +1,97 @@ +using IceCreamBusinessLogic.BusinessLogics; +using IceCreamShopContracts.BindingModels; +using IceCreamShopContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; + +namespace IceCreamBusinessLogic.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 IClientLogic _clientLogic; + + private readonly ILogger _logger; + + public AbstractMailWorker(ILogger logger, IMessageInfoLogic messageInfoLogic, IClientLogic clientLogic) + { + _logger = logger; + _messageInfoLogic = messageInfoLogic; + _clientLogic = clientLogic; + } + + 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) + { + mail.ClientId = _clientLogic.ReadElement(new() { Email = mail.SenderName })?.Id; + _messageInfoLogic.Create(mail); + } + } + + protected abstract Task SendMailAsync(MailSendInfoBindingModel info); + + protected abstract Task> ReceiveMailAsync(); + } +} \ No newline at end of file diff --git a/IceCreamShop/IceCreamBusinessLogic/MailWorker/MailKitWorker.cs b/IceCreamShop/IceCreamBusinessLogic/MailWorker/MailKitWorker.cs new file mode 100644 index 0000000..896cd31 --- /dev/null +++ b/IceCreamShop/IceCreamBusinessLogic/MailWorker/MailKitWorker.cs @@ -0,0 +1,78 @@ +using IceCreamShopContracts.BindingModels; +using IceCreamShopContracts.BusinessLogicsContracts; +using MailKit.Net.Pop3; +using MailKit.Security; +using Microsoft.Extensions.Logging; +using System.Net; +using System.Net.Mail; +using System.Text; + +namespace IceCreamBusinessLogic.MailWorker +{ + public class MailKitWorker : AbstractMailWorker + { + public MailKitWorker(ILogger logger, IMessageInfoLogic messageInfoLogic, IClientLogic clientLogic) : base(logger, messageInfoLogic, clientLogic) { } + + 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; + } + } +} \ No newline at end of file diff --git a/IceCreamShop/IceCreamShop/App.config b/IceCreamShop/IceCreamShop/App.config new file mode 100644 index 0000000..8952286 --- /dev/null +++ b/IceCreamShop/IceCreamShop/App.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/IceCreamShop/IceCreamShop/FormMain.Designer.cs b/IceCreamShop/IceCreamShop/FormMain.Designer.cs index 9a72c3b..8b20033 100644 --- a/IceCreamShop/IceCreamShop/FormMain.Designer.cs +++ b/IceCreamShop/IceCreamShop/FormMain.Designer.cs @@ -1,221 +1,222 @@ namespace IceCreamShopView { - partial class FormMain - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; + partial class FormMain + { + /// + /// 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); - } + /// + /// 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 + #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.buttonUpdate = new System.Windows.Forms.Button(); - this.buttonSetToFinish = new System.Windows.Forms.Button(); - this.buttonCreateOrder = new System.Windows.Forms.Button(); - this.dataGridView = new System.Windows.Forms.DataGridView(); - this.menuStrip = new System.Windows.Forms.MenuStrip(); - this.справочникиToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.компонентыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.мороженоеToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.клиентыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ImplementersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.отчетыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.iceCreamComponentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.iceCreamToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ordersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DoWorkToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); - this.menuStrip.SuspendLayout(); - this.SuspendLayout(); - // - // buttonUpdate - // - this.buttonUpdate.Location = new System.Drawing.Point(1235, 149); - this.buttonUpdate.Name = "buttonUpdate"; - this.buttonUpdate.Size = new System.Drawing.Size(194, 49); - this.buttonUpdate.TabIndex = 13; - this.buttonUpdate.Text = "Обновить"; - this.buttonUpdate.UseVisualStyleBackColor = true; - this.buttonUpdate.Click += new System.EventHandler(this.buttonUpdate_Click); - // - // buttonSetToFinish - // - this.buttonSetToFinish.Location = new System.Drawing.Point(1235, 94); - this.buttonSetToFinish.Name = "buttonSetToFinish"; - this.buttonSetToFinish.Size = new System.Drawing.Size(194, 49); - this.buttonSetToFinish.TabIndex = 12; - this.buttonSetToFinish.Text = "Заказ выдан"; - this.buttonSetToFinish.UseVisualStyleBackColor = true; - this.buttonSetToFinish.Click += new System.EventHandler(this.buttonSetToFinish_Click); - // - // buttonCreateOrder - // - this.buttonCreateOrder.Location = new System.Drawing.Point(1235, 39); - this.buttonCreateOrder.Name = "buttonCreateOrder"; - this.buttonCreateOrder.Size = new System.Drawing.Size(194, 49); - this.buttonCreateOrder.TabIndex = 9; - this.buttonCreateOrder.Text = "Создать заказ"; - this.buttonCreateOrder.UseVisualStyleBackColor = true; - this.buttonCreateOrder.Click += new System.EventHandler(this.buttonCreateOrder_Click); - // - // dataGridView - // - this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - this.dataGridView.Location = new System.Drawing.Point(14, 35); - this.dataGridView.Name = "dataGridView"; - this.dataGridView.RowHeadersWidth = 51; - this.dataGridView.RowTemplate.Height = 29; - this.dataGridView.Size = new System.Drawing.Size(1215, 407); - this.dataGridView.TabIndex = 8; - // - // menuStrip - // - this.menuStrip.ImageScalingSize = new System.Drawing.Size(20, 20); - this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.справочникиToolStripMenuItem, - this.отчетыToolStripMenuItem, - this.DoWorkToolStripMenuItem}); - this.menuStrip.Location = new System.Drawing.Point(0, 0); - this.menuStrip.Name = "menuStrip"; - this.menuStrip.Padding = new System.Windows.Forms.Padding(6, 3, 0, 3); - this.menuStrip.Size = new System.Drawing.Size(1441, 30); - this.menuStrip.TabIndex = 7; - this.menuStrip.Text = "Справочники"; - // - // справочникиToolStripMenuItem - // - this.справочникиToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.компонентыToolStripMenuItem, - this.мороженоеToolStripMenuItem, - this.клиентыToolStripMenuItem, - this.ImplementersToolStripMenuItem}); - this.справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; - this.справочникиToolStripMenuItem.Size = new System.Drawing.Size(117, 24); - this.справочникиToolStripMenuItem.Text = "Справочники"; - // - // компонентыToolStripMenuItem - // - this.компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; - this.компонентыToolStripMenuItem.Size = new System.Drawing.Size(185, 26); - this.компонентыToolStripMenuItem.Text = "Компоненты"; - this.компонентыToolStripMenuItem.Click += new System.EventHandler(this.компонентыToolStripMenuItem_Click); - // - // мороженоеToolStripMenuItem - // - this.мороженоеToolStripMenuItem.Name = "мороженоеToolStripMenuItem"; - this.мороженоеToolStripMenuItem.Size = new System.Drawing.Size(185, 26); - this.мороженоеToolStripMenuItem.Text = "Мороженое"; - this.мороженоеToolStripMenuItem.Click += new System.EventHandler(this.мороженоеToolStripMenuItem_Click); - // - // клиентыToolStripMenuItem - // - this.клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; - this.клиентыToolStripMenuItem.Size = new System.Drawing.Size(185, 26); - this.клиентыToolStripMenuItem.Text = "Клиенты"; - this.клиентыToolStripMenuItem.Click += new System.EventHandler(this.клиентыToolStripMenuItem_Click); - // - // ImplementersToolStripMenuItem - // - this.ImplementersToolStripMenuItem.Name = "ImplementersToolStripMenuItem"; - this.ImplementersToolStripMenuItem.Size = new System.Drawing.Size(185, 26); - this.ImplementersToolStripMenuItem.Text = "Исполнители"; - this.ImplementersToolStripMenuItem.Click += new System.EventHandler(this.ImplementersToolStripMenuItem_Click); - // - // отчетыToolStripMenuItem - // - this.отчетыToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.iceCreamComponentsToolStripMenuItem, - this.iceCreamToolStripMenuItem, - this.ordersToolStripMenuItem}); - this.отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; - this.отчетыToolStripMenuItem.Size = new System.Drawing.Size(73, 24); - this.отчетыToolStripMenuItem.Text = "Отчеты"; - // - // iceCreamComponentsToolStripMenuItem - // - this.iceCreamComponentsToolStripMenuItem.Name = "iceCreamComponentsToolStripMenuItem"; - this.iceCreamComponentsToolStripMenuItem.Size = new System.Drawing.Size(299, 26); - this.iceCreamComponentsToolStripMenuItem.Text = "Список мороженых"; - this.iceCreamComponentsToolStripMenuItem.Click += new System.EventHandler(this.IceCreamsToolStripMenuItem_Click); - // - // iceCreamToolStripMenuItem - // - this.iceCreamToolStripMenuItem.Name = "iceCreamToolStripMenuItem"; - this.iceCreamToolStripMenuItem.Size = new System.Drawing.Size(299, 26); - this.iceCreamToolStripMenuItem.Text = "Мороженые с компонентами"; - this.iceCreamToolStripMenuItem.Click += new System.EventHandler(this.IceCreamComponentsToolStripMenuItem_Click); - // - // ordersToolStripMenuItem - // - this.ordersToolStripMenuItem.Name = "ordersToolStripMenuItem"; - this.ordersToolStripMenuItem.Size = new System.Drawing.Size(299, 26); - this.ordersToolStripMenuItem.Text = "Список заказов"; - this.ordersToolStripMenuItem.Click += new System.EventHandler(this.OrdersToolStripMenuItem_Click); - // - // DoWorkToolStripMenuItem - // - this.DoWorkToolStripMenuItem.Name = "DoWorkToolStripMenuItem"; - this.DoWorkToolStripMenuItem.Size = new System.Drawing.Size(114, 24); - this.DoWorkToolStripMenuItem.Text = "Запуск работ"; - this.DoWorkToolStripMenuItem.Click += new System.EventHandler(this.DoWorkToolStripMenuItem_Click); - // - // FormMain - // - this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1441, 463); - this.Controls.Add(this.buttonUpdate); - this.Controls.Add(this.buttonSetToFinish); - this.Controls.Add(this.buttonCreateOrder); - this.Controls.Add(this.dataGridView); - this.Controls.Add(this.menuStrip); - this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); - this.Name = "FormMain"; - this.Text = "Магазин мороженого"; - this.Load += new System.EventHandler(this.FormMain_Load); - ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); - this.menuStrip.ResumeLayout(false); - this.menuStrip.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + buttonUpdate = new Button(); + buttonSetToFinish = new Button(); + buttonCreateOrder = new Button(); + dataGridView = new DataGridView(); + menuStrip = new MenuStrip(); + справочникиToolStripMenuItem = new ToolStripMenuItem(); + компонентыToolStripMenuItem = new ToolStripMenuItem(); + мороженоеToolStripMenuItem = new ToolStripMenuItem(); + клиентыToolStripMenuItem = new ToolStripMenuItem(); + ImplementersToolStripMenuItem = new ToolStripMenuItem(); + отчетыToolStripMenuItem = new ToolStripMenuItem(); + iceCreamComponentsToolStripMenuItem = new ToolStripMenuItem(); + iceCreamToolStripMenuItem = new ToolStripMenuItem(); + ordersToolStripMenuItem = new ToolStripMenuItem(); + DoWorkToolStripMenuItem = new ToolStripMenuItem(); + MailToolStripMenuItem = new ToolStripMenuItem(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + menuStrip.SuspendLayout(); + SuspendLayout(); + // + // buttonUpdate + // + buttonUpdate.Location = new Point(1081, 112); + buttonUpdate.Margin = new Padding(3, 2, 3, 2); + buttonUpdate.Name = "buttonUpdate"; + buttonUpdate.Size = new Size(170, 37); + buttonUpdate.TabIndex = 13; + buttonUpdate.Text = "Обновить"; + buttonUpdate.UseVisualStyleBackColor = true; + buttonUpdate.Click += buttonUpdate_Click; + // + // buttonSetToFinish + // + buttonSetToFinish.Location = new Point(1081, 70); + buttonSetToFinish.Margin = new Padding(3, 2, 3, 2); + buttonSetToFinish.Name = "buttonSetToFinish"; + buttonSetToFinish.Size = new Size(170, 37); + buttonSetToFinish.TabIndex = 12; + buttonSetToFinish.Text = "Заказ выдан"; + buttonSetToFinish.UseVisualStyleBackColor = true; + buttonSetToFinish.Click += buttonSetToFinish_Click; + // + // buttonCreateOrder + // + buttonCreateOrder.Location = new Point(1081, 29); + buttonCreateOrder.Margin = new Padding(3, 2, 3, 2); + buttonCreateOrder.Name = "buttonCreateOrder"; + buttonCreateOrder.Size = new Size(170, 37); + buttonCreateOrder.TabIndex = 9; + buttonCreateOrder.Text = "Создать заказ"; + buttonCreateOrder.UseVisualStyleBackColor = true; + buttonCreateOrder.Click += buttonCreateOrder_Click; + // + // dataGridView + // + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(12, 26); + dataGridView.Margin = new Padding(3, 2, 3, 2); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 29; + dataGridView.Size = new Size(1063, 305); + dataGridView.TabIndex = 8; + // + // menuStrip + // + menuStrip.ImageScalingSize = new Size(20, 20); + menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчетыToolStripMenuItem, DoWorkToolStripMenuItem, MailToolStripMenuItem }); + menuStrip.Location = new Point(0, 0); + menuStrip.Name = "menuStrip"; + menuStrip.Padding = new Padding(5, 2, 0, 2); + menuStrip.Size = new Size(1261, 24); + menuStrip.TabIndex = 7; + menuStrip.Text = "Справочники"; + // + // справочникиToolStripMenuItem + // + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { компонентыToolStripMenuItem, мороженоеToolStripMenuItem, клиентыToolStripMenuItem, ImplementersToolStripMenuItem }); + справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; + справочникиToolStripMenuItem.Size = new Size(94, 20); + справочникиToolStripMenuItem.Text = "Справочники"; + // + // компонентыToolStripMenuItem + // + компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; + компонентыToolStripMenuItem.Size = new Size(149, 22); + компонентыToolStripMenuItem.Text = "Компоненты"; + компонентыToolStripMenuItem.Click += компонентыToolStripMenuItem_Click; + // + // мороженоеToolStripMenuItem + // + мороженоеToolStripMenuItem.Name = "мороженоеToolStripMenuItem"; + мороженоеToolStripMenuItem.Size = new Size(149, 22); + мороженоеToolStripMenuItem.Text = "Мороженое"; + мороженоеToolStripMenuItem.Click += мороженоеToolStripMenuItem_Click; + // + // клиентыToolStripMenuItem + // + клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; + клиентыToolStripMenuItem.Size = new Size(149, 22); + клиентыToolStripMenuItem.Text = "Клиенты"; + клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click; + // + // ImplementersToolStripMenuItem + // + ImplementersToolStripMenuItem.Name = "ImplementersToolStripMenuItem"; + ImplementersToolStripMenuItem.Size = new Size(149, 22); + ImplementersToolStripMenuItem.Text = "Исполнители"; + ImplementersToolStripMenuItem.Click += ImplementersToolStripMenuItem_Click; + // + // отчетыToolStripMenuItem + // + отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { iceCreamComponentsToolStripMenuItem, iceCreamToolStripMenuItem, ordersToolStripMenuItem }); + отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; + отчетыToolStripMenuItem.Size = new Size(60, 20); + отчетыToolStripMenuItem.Text = "Отчеты"; + // + // iceCreamComponentsToolStripMenuItem + // + iceCreamComponentsToolStripMenuItem.Name = "iceCreamComponentsToolStripMenuItem"; + iceCreamComponentsToolStripMenuItem.Size = new Size(238, 22); + iceCreamComponentsToolStripMenuItem.Text = "Список мороженых"; + iceCreamComponentsToolStripMenuItem.Click += IceCreamsToolStripMenuItem_Click; + // + // iceCreamToolStripMenuItem + // + iceCreamToolStripMenuItem.Name = "iceCreamToolStripMenuItem"; + iceCreamToolStripMenuItem.Size = new Size(238, 22); + iceCreamToolStripMenuItem.Text = "Мороженые с компонентами"; + iceCreamToolStripMenuItem.Click += IceCreamComponentsToolStripMenuItem_Click; + // + // ordersToolStripMenuItem + // + ordersToolStripMenuItem.Name = "ordersToolStripMenuItem"; + ordersToolStripMenuItem.Size = new Size(238, 22); + ordersToolStripMenuItem.Text = "Список заказов"; + ordersToolStripMenuItem.Click += OrdersToolStripMenuItem_Click; + // + // DoWorkToolStripMenuItem + // + DoWorkToolStripMenuItem.Name = "DoWorkToolStripMenuItem"; + DoWorkToolStripMenuItem.Size = new Size(92, 20); + DoWorkToolStripMenuItem.Text = "Запуск работ"; + DoWorkToolStripMenuItem.Click += DoWorkToolStripMenuItem_Click; + // + // MailToolStripMenuItem + // + MailToolStripMenuItem.Name = "MailToolStripMenuItem"; + MailToolStripMenuItem.Size = new Size(62, 20); + MailToolStripMenuItem.Text = "Письма"; + MailToolStripMenuItem.Click += MailToolStripMenuItem_Click; + // + // FormMain + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1261, 347); + Controls.Add(buttonUpdate); + Controls.Add(buttonSetToFinish); + Controls.Add(buttonCreateOrder); + Controls.Add(dataGridView); + Controls.Add(menuStrip); + Name = "FormMain"; + Text = "Магазин мороженого"; + Load += FormMain_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + menuStrip.ResumeLayout(false); + menuStrip.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } - } + #endregion - #endregion - - private Button buttonUpdate; - private Button buttonSetToFinish; - private Button buttonCreateOrder; - private DataGridView dataGridView; - private MenuStrip menuStrip; - private ToolStripMenuItem справочникиToolStripMenuItem; - private ToolStripMenuItem компонентыToolStripMenuItem; - private ToolStripMenuItem мороженоеToolStripMenuItem; - private ToolStripMenuItem отчетыToolStripMenuItem; - private ToolStripMenuItem iceCreamComponentsToolStripMenuItem; - private ToolStripMenuItem iceCreamToolStripMenuItem; - private ToolStripMenuItem ordersToolStripMenuItem; - private ToolStripMenuItem клиентыToolStripMenuItem; - private ToolStripMenuItem ImplementersToolStripMenuItem; - private ToolStripMenuItem DoWorkToolStripMenuItem; - } + private Button buttonUpdate; + private Button buttonSetToFinish; + private Button buttonCreateOrder; + private DataGridView dataGridView; + private MenuStrip menuStrip; + private ToolStripMenuItem справочникиToolStripMenuItem; + private ToolStripMenuItem компонентыToolStripMenuItem; + private ToolStripMenuItem мороженоеToolStripMenuItem; + private ToolStripMenuItem отчетыToolStripMenuItem; + private ToolStripMenuItem iceCreamComponentsToolStripMenuItem; + private ToolStripMenuItem iceCreamToolStripMenuItem; + private ToolStripMenuItem ordersToolStripMenuItem; + private ToolStripMenuItem клиентыToolStripMenuItem; + private ToolStripMenuItem ImplementersToolStripMenuItem; + private ToolStripMenuItem DoWorkToolStripMenuItem; + private ToolStripMenuItem MailToolStripMenuItem; + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShop/FormMain.cs b/IceCreamShop/IceCreamShop/FormMain.cs index a7d5832..158f01d 100644 --- a/IceCreamShop/IceCreamShop/FormMain.cs +++ b/IceCreamShop/IceCreamShop/FormMain.cs @@ -16,213 +16,222 @@ using System.Windows.Forms; namespace IceCreamShopView { - public partial class FormMain : Form - { - private readonly ILogger _logger; - private readonly IOrderLogic _orderLogic; - private readonly IReportLogic _reportLogic; + public partial class FormMain : Form + { + private readonly ILogger _logger; + private readonly IOrderLogic _orderLogic; + private readonly IReportLogic _reportLogic; private readonly IWorkProcess _workProcess; - public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess) - { - InitializeComponent(); - _logger = logger; - _orderLogic = orderLogic; - _reportLogic = reportLogic; - _workProcess = workProcess; - } + public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess) + { + InitializeComponent(); + _logger = logger; + _orderLogic = orderLogic; + _reportLogic = reportLogic; + _workProcess = workProcess; + } - private void FormMain_Load(object sender, EventArgs e) - { - LoadData(); - } + private void FormMain_Load(object sender, EventArgs e) + { + LoadData(); + } - private void LoadData() - { - _logger.LogInformation("Загрузка заказов"); - try - { - var list = _orderLogic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["IceCreamId"].Visible = false; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["ImplementerId"].Visible = false; - } - _logger.LogInformation("Загрузка заказов"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка загрузки заказов"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } + private void LoadData() + { + _logger.LogInformation("Загрузка заказов"); + try + { + var list = _orderLogic.ReadList(null); + if (list != null) + { + dataGridView.DataSource = list; + dataGridView.Columns["IceCreamId"].Visible = false; + dataGridView.Columns["ClientId"].Visible = false; + dataGridView.Columns["ImplementerId"].Visible = false; + } + _logger.LogInformation("Загрузка заказов"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки заказов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } - private void компонентыToolStripMenuItem_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormComponents)); - if (service is FormComponents form) - { - form.ShowDialog(); - } - } + private void компонентыToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormComponents)); + if (service is FormComponents form) + { + form.ShowDialog(); + } + } - private void мороженоеToolStripMenuItem_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormIceCreams)); - if (service is FormIceCreams form) - { - form.ShowDialog(); - } - } + private void мороженоеToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormIceCreams)); + if (service is FormIceCreams form) + { + form.ShowDialog(); + } + } - private void buttonCreateOrder_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder)); - if (service is FormCreateOrder form) - { - form.ShowDialog(); - LoadData(); - } - } + private void buttonCreateOrder_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder)); + if (service is FormCreateOrder form) + { + form.ShowDialog(); + LoadData(); + } + } - private void buttonSetToWork_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Заказ №{id}. Меняется статус на 'В работе'", id); - try - { - var operationResult = _orderLogic.TakeOrderInWork(new OrderBindingModel - { - Id = id, - }); - if (!operationResult) - { - throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); - } - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка передачи заказа в работу"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - } + private void buttonSetToWork_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Заказ №{id}. Меняется статус на 'В работе'", id); + try + { + var operationResult = _orderLogic.TakeOrderInWork(new OrderBindingModel + { + Id = id, + }); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка передачи заказа в работу"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } - private void buttonSetToDone_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Заказ №{id}. Меняется статус на 'Готов'", id); - try - { - var operationResult = _orderLogic.DeliveryOrder(new OrderBindingModel - { - Id = id, - }); - if (!operationResult) - { - throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); - } - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка отметки о готовности заказа"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } + private void buttonSetToDone_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Заказ №{id}. Меняется статус на 'Готов'", id); + try + { + var operationResult = _orderLogic.DeliveryOrder(new OrderBindingModel + { + Id = id, + }); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отметки о готовности заказа"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } - private void buttonSetToFinish_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - _logger.LogInformation("Заказ №{id}. Меняется статус на 'Выдан'", id); - try - { - var operationResult = _orderLogic.FinishOrder(new OrderBindingModel - { - Id = id, - }); - if (!operationResult) - { - throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); - } - _logger.LogInformation("Заказ №{id} выдан", id); - LoadData(); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка отметки о выдачи заказа"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } + private void buttonSetToFinish_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Заказ №{id}. Меняется статус на 'Выдан'", id); + try + { + var operationResult = _orderLogic.FinishOrder(new OrderBindingModel + { + Id = id, + }); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + _logger.LogInformation("Заказ №{id} выдан", id); + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отметки о выдачи заказа"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } - private void buttonUpdate_Click(object sender, EventArgs e) - { - LoadData(); - } + private void buttonUpdate_Click(object sender, EventArgs e) + { + LoadData(); + } - private void IceCreamsToolStripMenuItem_Click(object sender, EventArgs e) - { - using var dialog = new SaveFileDialog { Filter = "docx|*.docx" }; - if (dialog.ShowDialog() == DialogResult.OK) - { - _reportLogic.SaveIceCreamsToWordFile(new ReportBindingModel { FileName = dialog.FileName }); - MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } + private void IceCreamsToolStripMenuItem_Click(object sender, EventArgs e) + { + using var dialog = new SaveFileDialog { Filter = "docx|*.docx" }; + if (dialog.ShowDialog() == DialogResult.OK) + { + _reportLogic.SaveIceCreamsToWordFile(new ReportBindingModel { FileName = dialog.FileName }); + MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } - private void IceCreamComponentsToolStripMenuItem_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormReportProductComponents)); - if (service is FormReportProductComponents form) - { - form.ShowDialog(); - } - } + private void IceCreamComponentsToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormReportProductComponents)); + if (service is FormReportProductComponents form) + { + form.ShowDialog(); + } + } - private void OrdersToolStripMenuItem_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormReportOrders)); - if (service is FormReportOrders form) - { - form.ShowDialog(); - } - } + private void OrdersToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormReportOrders)); + if (service is FormReportOrders form) + { + form.ShowDialog(); + } + } - private void клиентыToolStripMenuItem_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormClients)); - if (service is FormClients form) - { - form.ShowDialog(); - } - } + private void клиентыToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormClients)); + if (service is FormClients form) + { + form.ShowDialog(); + } + } - private void ImplementersToolStripMenuItem_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); - if (service is FormImplementers form) - { - form.ShowDialog(); - } - } + private void ImplementersToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); + if (service is FormImplementers form) + { + form.ShowDialog(); + } + } - private void DoWorkToolStripMenuItem_Click(object sender, EventArgs e) - { - _workProcess.DoWork(( - Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!,_orderLogic); - MessageBox.Show("Процесс обработки запущен", "Сообщение", - MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } + private void DoWorkToolStripMenuItem_Click(object sender, EventArgs e) + { + _workProcess.DoWork(( + Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, _orderLogic); + MessageBox.Show("Процесс обработки запущен", "Сообщение", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + private void MailToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormViewMail)); + if (service is FormViewMail form) + { + form.ShowDialog(); + } + } + } } diff --git a/IceCreamShop/IceCreamShop/FormViewMail.Designer.cs b/IceCreamShop/IceCreamShop/FormViewMail.Designer.cs new file mode 100644 index 0000000..86ee139 --- /dev/null +++ b/IceCreamShop/IceCreamShop/FormViewMail.Designer.cs @@ -0,0 +1,62 @@ +namespace IceCreamShopView +{ + partial class FormViewMail + { + /// + /// 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() + { + dataGridView = new DataGridView(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.Name = "dataGridView"; + dataGridView.RowTemplate.Height = 25; + dataGridView.Size = new Size(800, 450); + dataGridView.TabIndex = 1; + // + // FormViewMail + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridView); + Name = "FormViewMail"; + Text = "Письма"; + Load += FormViewMail_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridView; + } +} \ No newline at end of file diff --git a/IceCreamShop/IceCreamShop/FormViewMail.cs b/IceCreamShop/IceCreamShop/FormViewMail.cs new file mode 100644 index 0000000..a802c58 --- /dev/null +++ b/IceCreamShop/IceCreamShop/FormViewMail.cs @@ -0,0 +1,40 @@ +using IceCreamShopContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; + +namespace IceCreamShopView +{ + public partial class FormViewMail : Form + { + private readonly ILogger _logger; + private readonly IMessageInfoLogic _logic; + + public FormViewMail(ILogger logger, IMessageInfoLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + } + + private void FormViewMail_Load(object sender, EventArgs e) + { + try + { + var list = _logic.ReadList(null); + if (list != null) + { + dataGridView.DataSource = list; + dataGridView.Columns["ClientId"].Visible = false; + dataGridView.Columns["MessageId"].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/IceCreamShop/IceCreamShop/FormViewMail.resx b/IceCreamShop/IceCreamShop/FormViewMail.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/IceCreamShop/IceCreamShop/FormViewMail.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 diff --git a/IceCreamShop/IceCreamShop/IceCreamShopView.csproj b/IceCreamShop/IceCreamShop/IceCreamShopView.csproj index 0faed3a..ef5c0ad 100644 --- a/IceCreamShop/IceCreamShop/IceCreamShopView.csproj +++ b/IceCreamShop/IceCreamShop/IceCreamShopView.csproj @@ -27,6 +27,9 @@ + + Always + Always diff --git a/IceCreamShop/IceCreamShop/Program.cs b/IceCreamShop/IceCreamShop/Program.cs index 02ccaad..5d7d1a2 100644 --- a/IceCreamShop/IceCreamShop/Program.cs +++ b/IceCreamShop/IceCreamShop/Program.cs @@ -7,8 +7,10 @@ using Microsoft.Extensions.Logging; using NLog.Extensions.Logging; using IceCreamBusinessLogic.OfficePackage.Implements; using IceCreamBusinessLogic.OfficePackage; -using IceCreamShopDatabaseImplement.Implements; +using IceCreamShopFileImplement.Implements; using IceCreamBusinessLogic.BusinessLogic; +using IceCreamBusinessLogic.MailWorker; +using IceCreamShopContracts.BindingModels; namespace IceCreamShop { @@ -29,6 +31,28 @@ namespace IceCreamShop 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); + } + catch (Exception ex) + { + var logger = _serviceProvider.GetService(); + logger?.LogError(ex, " "); + } + Application.Run(_serviceProvider.GetRequiredService()); } @@ -44,14 +68,18 @@ namespace IceCreamShop services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + + services.AddSingleton(); services.AddTransient(); services.AddTransient(); @@ -69,6 +97,8 @@ namespace IceCreamShop services.AddTransient(); services.AddTransient(); services.AddTransient(); - } + services.AddTransient(); + } + private static void MailCheck(object obj) => ServiceProvider?.GetService()?.MailCheck(); } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs b/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs index be2cb9b..cd24646 100644 --- a/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs +++ b/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs @@ -143,5 +143,15 @@ namespace IceCreamShopClientApp.Controllers var prod = APIClient.GetRequest($"api/main/geticecream?icecreamId={icecream}"); return count * (prod?.Price ?? 1); } - } + + [HttpGet] + public IActionResult Mails() + { + if (APIClient.Client == null) + { + return Redirect("~/Home/Enter"); + } + return View(APIClient.GetRequest>($"api/client/getmessages?clientId={APIClient.Client.Id}")); + } + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopClientApp/Views/Home/Mails.cshtml b/IceCreamShop/IceCreamShopClientApp/Views/Home/Mails.cshtml new file mode 100644 index 0000000..54d27b0 --- /dev/null +++ b/IceCreamShop/IceCreamShopClientApp/Views/Home/Mails.cshtml @@ -0,0 +1,54 @@ +@using IceCreamShopContracts.ViewModels + +@model List + +@{ + ViewData["Title"] = "Mails"; +} + +
+

Заказы

+
+ + +
+ @{ + if (Model == null) + { +

Авторизируйтесь

+ return; + } + + + + + + + + + + + @foreach (var item in Model) + { + + + + + + } + +
+ Дата письма + + Заголовок + + Текст +
+ @Html.DisplayFor(modelItem => item.DateDelivery) + + @Html.DisplayFor(modelItem => item.Subject) + + @Html.DisplayFor(modelItem => item.Body) +
+ } +
\ No newline at end of file diff --git a/IceCreamShop/IceCreamShopClientApp/Views/Shared/_Layout.cshtml b/IceCreamShop/IceCreamShopClientApp/Views/Shared/_Layout.cshtml index 50d8b00..1f41ab8 100644 --- a/IceCreamShop/IceCreamShopClientApp/Views/Shared/_Layout.cshtml +++ b/IceCreamShop/IceCreamShopClientApp/Views/Shared/_Layout.cshtml @@ -28,6 +28,9 @@ + diff --git a/IceCreamShop/IceCreamShopContracts/BindingModels/MailConfigBindingModel.cs b/IceCreamShop/IceCreamShopContracts/BindingModels/MailConfigBindingModel.cs new file mode 100644 index 0000000..26a6a2d --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/BindingModels/MailConfigBindingModel.cs @@ -0,0 +1,17 @@ +namespace IceCreamShopContracts.BindingModels +{ + public class MailConfigBindingModel + { + public string MailLogin { get; set; } = string.Empty; + + public string MailPassword { get; set; } = string.Empty; + + public string SmtpClientHost { get; set; } = string.Empty; + + public int SmtpClientPort { get; set; } + + public string PopHost { get; set; } = string.Empty; + + public int PopPort { get; set; } + } +} \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/BindingModels/MailSendInfoBindingModel.cs b/IceCreamShop/IceCreamShopContracts/BindingModels/MailSendInfoBindingModel.cs new file mode 100644 index 0000000..f09e154 --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/BindingModels/MailSendInfoBindingModel.cs @@ -0,0 +1,11 @@ +namespace IceCreamShopContracts.BindingModels +{ + public class MailSendInfoBindingModel + { + public string MailAddress { get; set; } = string.Empty; + + public string Subject { get; set; } = string.Empty; + + public string Text { get; set; } = string.Empty; + } +} \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs b/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs new file mode 100644 index 0000000..7bab4ca --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs @@ -0,0 +1,19 @@ +using AbstractIceCreamShopDataModels.Models; + +namespace IceCreamShopContracts.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 string Subject { get; set; } = string.Empty; + + public string Body { get; set; } = string.Empty; + + public DateTime DateDelivery { get; set; } + } +} \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IMessageInfoLogic.cs b/IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IMessageInfoLogic.cs new file mode 100644 index 0000000..9ceba41 --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IMessageInfoLogic.cs @@ -0,0 +1,13 @@ +using IceCreamShopContracts.BindingModels; +using IceCreamShopContracts.SearchModels; +using IceCreamShopContracts.ViewModels; + +namespace IceCreamShopContracts.BusinessLogicsContracts +{ + public interface IMessageInfoLogic + { + List? ReadList(MessageInfoSearchModel? model); + + bool Create(MessageInfoBindingModel model); + } +} \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/SearchModels/MessageInfoSearchModel.cs b/IceCreamShop/IceCreamShopContracts/SearchModels/MessageInfoSearchModel.cs new file mode 100644 index 0000000..da8e399 --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/SearchModels/MessageInfoSearchModel.cs @@ -0,0 +1,9 @@ +namespace IceCreamShopContracts.SearchModels +{ + public class MessageInfoSearchModel + { + public int? ClientId { get; set; } + + public string? MessageId { get; set; } + } +} \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/StoragesContracts/IMessageInfoStorage.cs b/IceCreamShop/IceCreamShopContracts/StoragesContracts/IMessageInfoStorage.cs new file mode 100644 index 0000000..9ac5688 --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/StoragesContracts/IMessageInfoStorage.cs @@ -0,0 +1,17 @@ +using IceCreamShopContracts.BindingModels; +using IceCreamShopContracts.SearchModels; +using IceCreamShopContracts.ViewModels; + +namespace IceCreamShopContracts.StoragesContracts +{ + public interface IMessageInfoStorage + { + List GetFullList(); + + List GetFilteredList(MessageInfoSearchModel model); + + MessageInfoViewModel? GetElement(MessageInfoSearchModel model); + + MessageInfoViewModel? Insert(MessageInfoBindingModel model); + } +} \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs new file mode 100644 index 0000000..c4e4a23 --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs @@ -0,0 +1,24 @@ +using AbstractIceCreamShopDataModels.Models; +using System.ComponentModel; + +namespace IceCreamShopContracts.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; + } +} \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs b/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs new file mode 100644 index 0000000..ac4fccb --- /dev/null +++ b/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs @@ -0,0 +1,13 @@ +namespace AbstractIceCreamShopDataModels.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/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabase.cs b/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabase.cs index 152e4dd..58a0784 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabase.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabase.cs @@ -25,5 +25,7 @@ namespace IceCreamShopDatabaseImplement public virtual DbSet Clients { set; get; } public virtual DbSet Implementers { set; get; } + + public virtual DbSet Messages { set; get; } } } diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Implements/MessageInfoStorage.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Implements/MessageInfoStorage.cs new file mode 100644 index 0000000..4186d90 --- /dev/null +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Implements/MessageInfoStorage.cs @@ -0,0 +1,52 @@ +using IceCreamShopContracts.BindingModels; +using IceCreamShopContracts.SearchModels; +using IceCreamShopContracts.StoragesContracts; +using IceCreamShopContracts.ViewModels; +using IceCreamShopDatabaseImplement.Models; + +namespace IceCreamShopDatabaseImplement.Implements +{ + public class MessageInfoStorage : IMessageInfoStorage + { + + public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) + { + using var context = new IceCreamShopDatabase(); + if (model.MessageId != null) + { + return context.Messages.FirstOrDefault(x => x.MessageId == model.MessageId)?.GetViewModel; + } + return null; + } + + public List GetFilteredList(MessageInfoSearchModel model) + { + using var context = new IceCreamShopDatabase(); + return context.Messages + .Where(x => x.ClientId == model.ClientId) + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFullList() + { + using var context = new IceCreamShopDatabase(); + return context.Messages + .Select(x => x.GetViewModel) + .ToList(); + } + + public MessageInfoViewModel? Insert(MessageInfoBindingModel model) + { + using var context = new IceCreamShopDatabase(); + var newMessage = MessageInfo.Create(model); + if (newMessage == null || context.Messages.Any(x => x.MessageId.Equals(model.MessageId))) + { + return null; + } + context.Messages.Add(newMessage); + context.SaveChanges(); + return newMessage.GetViewModel; + } + } +} diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.Designer.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.Designer.cs new file mode 100644 index 0000000..d32d702 --- /dev/null +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.Designer.cs @@ -0,0 +1,298 @@ +// +using System; +using IceCreamShopDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace IceCreamShopDatabaseImplement.Migrations +{ + [DbContext(typeof(IceCreamShopDatabase))] + [Migration("20230411104402_LabWork07_mail")] + partial class LabWork07_mail + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.3") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClientFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Clients"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Component", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Cost") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.IceCream", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("IceCreamName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Price") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("IceCreams"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.IceCreamComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("IceCreamId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ComponentId"); + + b.HasIndex("IceCreamId"); + + b.ToTable("IceCreamComponents"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Implementer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Qualification") + .HasColumnType("int"); + + b.Property("WorkExperience") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Implementers"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.MessageInfo", b => + { + b.Property("MessageId") + .HasColumnType("nvarchar(450)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("DateDelivery") + .HasColumnType("datetime2"); + + b.Property("SenderName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("MessageId"); + + b.HasIndex("ClientId"); + + b.ToTable("Messages"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("DateCreate") + .HasColumnType("datetime2"); + + b.Property("DateImplement") + .HasColumnType("datetime2"); + + b.Property("IceCreamId") + .HasColumnType("int"); + + b.Property("ImplementerId") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Sum") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.HasIndex("IceCreamId"); + + b.HasIndex("ImplementerId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.IceCreamComponent", b => + { + b.HasOne("IceCreamShopDatabaseImplement.Models.Component", "Component") + .WithMany("IceCreamComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("IceCreamShopDatabaseImplement.Models.IceCream", "IceCream") + .WithMany("Components") + .HasForeignKey("IceCreamId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("IceCream"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.MessageInfo", b => + { + b.HasOne("IceCreamShopDatabaseImplement.Models.Client", "Client") + .WithMany("Messages") + .HasForeignKey("ClientId"); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Order", b => + { + b.HasOne("IceCreamShopDatabaseImplement.Models.Client", "Client") + .WithMany("Orders") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("IceCreamShopDatabaseImplement.Models.IceCream", "IceCream") + .WithMany("Orders") + .HasForeignKey("IceCreamId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("IceCreamShopDatabaseImplement.Models.Implementer", "Implementer") + .WithMany("Orders") + .HasForeignKey("ImplementerId"); + + b.Navigation("Client"); + + b.Navigation("IceCream"); + + b.Navigation("Implementer"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Client", b => + { + b.Navigation("Messages"); + + b.Navigation("Orders"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Component", b => + { + b.Navigation("IceCreamComponents"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.IceCream", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Implementer", b => + { + b.Navigation("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.cs new file mode 100644 index 0000000..a12b1f8 --- /dev/null +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.cs @@ -0,0 +1,48 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace IceCreamShopDatabaseImplement.Migrations +{ + /// + public partial class LabWork07_mail : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Messages", + columns: table => new + { + MessageId = table.Column(type: "nvarchar(450)", nullable: false), + ClientId = table.Column(type: "int", nullable: true), + SenderName = table.Column(type: "nvarchar(max)", nullable: false), + DateDelivery = table.Column(type: "datetime2", nullable: false), + Subject = table.Column(type: "nvarchar(max)", nullable: false), + Body = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Messages", x => x.MessageId); + table.ForeignKey( + name: "FK_Messages_Clients_ClientId", + column: x => x.ClientId, + principalTable: "Clients", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_Messages_ClientId", + table: "Messages", + column: "ClientId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Messages"); + } + } +} diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs index e6fe34e..e090d57 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs @@ -140,6 +140,36 @@ namespace IceCreamShopDatabaseImplement.Migrations b.ToTable("Implementers"); }); + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.MessageInfo", b => + { + b.Property("MessageId") + .HasColumnType("nvarchar(450)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("DateDelivery") + .HasColumnType("datetime2"); + + b.Property("SenderName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("MessageId"); + + b.HasIndex("ClientId"); + + b.ToTable("Messages"); + }); + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Order", b => { b.Property("Id") @@ -202,6 +232,15 @@ namespace IceCreamShopDatabaseImplement.Migrations b.Navigation("IceCream"); }); + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.MessageInfo", b => + { + b.HasOne("IceCreamShopDatabaseImplement.Models.Client", "Client") + .WithMany("Messages") + .HasForeignKey("ClientId"); + + b.Navigation("Client"); + }); + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Order", b => { b.HasOne("IceCreamShopDatabaseImplement.Models.Client", "Client") @@ -229,6 +268,8 @@ namespace IceCreamShopDatabaseImplement.Migrations modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Client", b => { + b.Navigation("Messages"); + b.Navigation("Orders"); }); diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Client.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Client.cs index 6bdc89d..d581f9d 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Client.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Client.cs @@ -22,7 +22,10 @@ namespace IceCreamShopDatabaseImplement.Models [ForeignKey("ClientId")] public virtual List Orders { get; set; } = new(); - public static Client? Create(ClientBindingModel model) + [ForeignKey("ClientId")] + public virtual List Messages { get; set; } = new(); + + public static Client? Create(ClientBindingModel model) { if (model == null) { diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs new file mode 100644 index 0000000..9c6b65b --- /dev/null +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs @@ -0,0 +1,52 @@ +using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.BindingModels; +using IceCreamShopContracts.ViewModels; +using System.ComponentModel.DataAnnotations; + +namespace IceCreamShopDatabaseImplement.Models +{ + public class MessageInfo : IMessageInfoModel + { + [Key] + 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 Client? Client { get; private set; } + + public static MessageInfo? Create(MessageInfoBindingModel model) + { + if (model == null) + { + return null; + } + return new() + { + Body = model.Body, + Subject = model.Subject, + ClientId = model.ClientId, + MessageId = model.MessageId, + SenderName = model.SenderName, + DateDelivery = model.DateDelivery, + }; + } + + public MessageInfoViewModel GetViewModel => new() + { + Body = Body, + Subject = Subject, + ClientId = ClientId, + MessageId = MessageId, + SenderName = SenderName, + DateDelivery = DateDelivery, + }; + } +} diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs index 4568883..4b0b6ac 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs @@ -76,9 +76,9 @@ namespace IceCreamShopDatabaseImplement.Models DateCreate = DateCreate, DateImplement = DateImplement, Id = Id, - IceCreamName = context.IceCreams.FirstOrDefault(x => x.Id == IceCreamId)?.IceCreamName ?? string.Empty, - ImplementerFIO = context.Implementers.FirstOrDefault(x => x.Id == ImplementerId)?.ImplementerFIO ?? string.Empty, - ClientFIO = Client?.ClientFIO ?? string.Empty, + IceCreamName = IceCream?.IceCreamName ?? string.Empty, + ImplementerFIO = Implementer?.ImplementerFIO ?? string.Empty, + ClientFIO = Client?.ClientFIO ?? string.Empty, }; } } diff --git a/IceCreamShop/IceCreamShopFileImplement/DataFileSingleton.cs b/IceCreamShop/IceCreamShopFileImplement/DataFileSingleton.cs index 2c9c08c..407dad1 100644 --- a/IceCreamShop/IceCreamShopFileImplement/DataFileSingleton.cs +++ b/IceCreamShop/IceCreamShopFileImplement/DataFileSingleton.cs @@ -16,11 +16,13 @@ namespace IceCreamShopFileImplement private readonly string IceCreamFileName = "IceCream.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 IceCreams { get; private set; } public List Clients { get; private set; } public List Implementers { get; private set; } + public List Messages { get; private set; } public static DataFileSingleton GetInstance() { if (instance == null) @@ -34,6 +36,7 @@ namespace IceCreamShopFileImplement public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); public void SaveClients() => SaveData(Clients, OrderFileName, "Clients", x => x.GetXElement); public void SaveImplementers() => SaveData(Orders, ImplementerFileName, "Implementers", x => x.GetXElement); + public void SaveMessages() => SaveData(Orders, ImplementerFileName, "Messages", x => x.GetXElement); private DataFileSingleton() { Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!; @@ -41,6 +44,7 @@ namespace IceCreamShopFileImplement Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!; Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!; + Messages = LoadData(MessageInfoFileName, "MessageInfo", x => MessageInfo.Create(x)!)!; } private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) { diff --git a/IceCreamShop/IceCreamShopFileImplement/Implements/MessageInfoStorage.cs b/IceCreamShop/IceCreamShopFileImplement/Implements/MessageInfoStorage.cs new file mode 100644 index 0000000..1ee91b0 --- /dev/null +++ b/IceCreamShop/IceCreamShopFileImplement/Implements/MessageInfoStorage.cs @@ -0,0 +1,53 @@ +using IceCreamShopContracts.BindingModels; +using IceCreamShopContracts.SearchModels; +using IceCreamShopContracts.StoragesContracts; +using IceCreamShopContracts.ViewModels; +using IceCreamShopFileImplement.Models; + +namespace IceCreamShopFileImplement.Implements +{ + public class MessageInfoStorage : IMessageInfoStorage + { + private readonly DataFileSingleton _source; + public MessageInfoStorage() + { + _source = DataFileSingleton.GetInstance(); + } + + public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) + { + if (model.MessageId != null) + { + return _source.Messages.FirstOrDefault(x => x.MessageId == model.MessageId)?.GetViewModel; + } + return null; + } + + public List GetFilteredList(MessageInfoSearchModel model) + { + 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 = MessageInfo.Create(model); + if (newMessage == null) + { + return null; + } + _source.Messages.Add(newMessage); + _source.SaveMessages(); + return newMessage.GetViewModel; + } + } +} diff --git a/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs new file mode 100644 index 0000000..aa31ba3 --- /dev/null +++ b/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs @@ -0,0 +1,75 @@ +using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.BindingModels; +using IceCreamShopContracts.ViewModels; +using System.Xml.Linq; + +namespace IceCreamShopFileImplement.Models +{ + public class MessageInfo : 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 MessageInfo? Create(MessageInfoBindingModel model) + { + if (model == null) + { + return null; + } + return new() + { + Body = model.Body, + Subject = model.Subject, + ClientId = model.ClientId, + MessageId = model.MessageId, + SenderName = model.SenderName, + DateDelivery = model.DateDelivery, + }; + } + + public static MessageInfo? Create(XElement element) + { + if (element == null) + { + return null; + } + return new() + { + Body = element.Attribute("Body")!.Value, + Subject = element.Attribute("Subject")!.Value, + ClientId = Convert.ToInt32(element.Attribute("ClientId")!.Value), + MessageId = element.Attribute("MessageId")!.Value, + SenderName = element.Attribute("SenderName")!.Value, + DateDelivery = Convert.ToDateTime(element.Attribute("DateDelivery")!.Value), + }; + } + + public MessageInfoViewModel GetViewModel => new() + { + Body = Body, + Subject = Subject, + ClientId = ClientId, + MessageId = MessageId, + SenderName = SenderName, + DateDelivery = DateDelivery, + }; + + public XElement GetXElement => new("MessageInfo", + new XAttribute("Body", Body), + new XAttribute("Subject", Subject), + new XAttribute("ClientId", ClientId), + new XAttribute("MessageId", MessageId), + new XAttribute("SenderName", SenderName), + new XAttribute("DateDelivery", DateDelivery) + ); + } +} diff --git a/IceCreamShop/IceCreamShopListImplement/DataListSingleton.cs b/IceCreamShop/IceCreamShopListImplement/DataListSingleton.cs index f4e9cbd..56bb515 100644 --- a/IceCreamShop/IceCreamShopListImplement/DataListSingleton.cs +++ b/IceCreamShop/IceCreamShopListImplement/DataListSingleton.cs @@ -10,6 +10,7 @@ namespace IceCreamShopListImplement public List iceCreams { get; set; } public List Clients { get; set; } public List Implementers { get; set; } + public List Messages { get; set; } private DataListSingleton() { @@ -18,6 +19,7 @@ namespace IceCreamShopListImplement iceCreams = new List(); Clients = new List(); Implementers = new List(); + Messages = new List(); } public static DataListSingleton GetInstance() { diff --git a/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs b/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs new file mode 100644 index 0000000..3917486 --- /dev/null +++ b/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs @@ -0,0 +1,60 @@ +using IceCreamShopContracts.BindingModels; +using IceCreamShopContracts.SearchModels; +using IceCreamShopContracts.ViewModels; +using IceCreamShopListImplement.Models; + +namespace IceCreamShopListImplement.Implements +{ + public class MessageInfoStorage + { + private readonly DataListSingleton _source; + public MessageInfoStorage() + { + _source = DataListSingleton.GetInstance(); + } + + public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) + { + foreach (var message in _source.Messages) + { + if (model.MessageId != null && model.MessageId.Equals(message.MessageId)) + return message.GetViewModel; + } + return null; + } + + public List GetFilteredList(MessageInfoSearchModel model) + { + List result = new(); + foreach (var item in _source.Messages) + { + if (item.ClientId.HasValue && item.ClientId == model.ClientId) + { + result.Add(item.GetViewModel); + } + } + return result; + } + + public List GetFullList() + { + List result = new(); + foreach (var item in _source.Messages) + { + result.Add(item.GetViewModel); + } + return result; + } + + public MessageInfoViewModel? Insert(MessageInfoBindingModel model) + { + var newMessage = MessageInfo.Create(model); + if (newMessage == null) + { + return null; + } + _source.Messages.Add(newMessage); + return newMessage.GetViewModel; + } + } +} diff --git a/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs new file mode 100644 index 0000000..240ac3e --- /dev/null +++ b/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs @@ -0,0 +1,49 @@ +using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.BindingModels; +using IceCreamShopContracts.ViewModels; + +namespace IceCreamShopListImplement.Models +{ + public class MessageInfo : 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 MessageInfo? Create(MessageInfoBindingModel model) + { + if (model == null) + { + return null; + } + return new() + { + Body = model.Body, + Subject = model.Subject, + ClientId = model.ClientId, + MessageId = model.MessageId, + SenderName = model.SenderName, + DateDelivery = model.DateDelivery, + }; + } + + public MessageInfoViewModel GetViewModel => new() + { + Body = Body, + Subject = Subject, + ClientId = ClientId, + MessageId = MessageId, + SenderName = SenderName, + DateDelivery = DateDelivery, + }; + + } +} diff --git a/IceCreamShop/IceCreamShopRestApi/Controllers/ClientController.cs b/IceCreamShop/IceCreamShopRestApi/Controllers/ClientController.cs index a1a7b8a..71f434c 100644 --- a/IceCreamShop/IceCreamShopRestApi/Controllers/ClientController.cs +++ b/IceCreamShop/IceCreamShopRestApi/Controllers/ClientController.cs @@ -14,10 +14,13 @@ namespace IceCreamShopRestApi.Controllers private readonly IClientLogic _logic; - public ClientController(IClientLogic logic, ILogger logger) + private readonly IMessageInfoLogic _mailLogic; + + public ClientController(IClientLogic logic, IMessageInfoLogic mailLogic, ILogger logger) { _logger = logger; _logic = logic; + _mailLogic = mailLogic; } [HttpGet] @@ -65,5 +68,22 @@ namespace IceCreamShopRestApi.Controllers throw; } } + + [HttpGet] + public List? GetMessages(int clientId) + { + try + { + return _mailLogic.ReadList(new MessageInfoSearchModel + { + ClientId = clientId + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения писем клиента"); + throw; + } + } } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj b/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj index 8e1ebc5..a9229d5 100644 --- a/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj +++ b/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj @@ -15,6 +15,7 @@ +
diff --git a/IceCreamShop/IceCreamShopRestApi/Order.xml b/IceCreamShop/IceCreamShopRestApi/Order.xml new file mode 100644 index 0000000..58e6d39 --- /dev/null +++ b/IceCreamShop/IceCreamShopRestApi/Order.xml @@ -0,0 +1,8 @@ + + + + user + icecreamshop2023tp@gmail.com + user + + \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopRestApi/Program.cs b/IceCreamShop/IceCreamShopRestApi/Program.cs index 26af849..c438187 100644 --- a/IceCreamShop/IceCreamShopRestApi/Program.cs +++ b/IceCreamShop/IceCreamShopRestApi/Program.cs @@ -1,7 +1,9 @@ using IceCreamBusinessLogic.BusinessLogics; +using IceCreamBusinessLogic.MailWorker; +using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.BusinessLogicsContracts; using IceCreamShopContracts.StoragesContracts; -using IceCreamShopDatabaseImplement.Implements; +using IceCreamShopFileImplement.Implements; using Microsoft.OpenApi.Models; var builder = WebApplication.CreateBuilder(args); @@ -14,11 +16,15 @@ builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); +builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); +builder.Services.AddTransient(); + +builder.Services.AddSingleton(); builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle @@ -30,6 +36,17 @@ builder.Services.AddSwaggerGen(c => var app = builder.Build(); +var mailSender = app.Services.GetService(); +mailSender?.MailConfig(new MailConfigBindingModel +{ + MailLogin = builder.Configuration?.GetSection("MailLogin")?.Value?.ToString() ?? string.Empty, + MailPassword = builder.Configuration?.GetSection("MailPassword")?.Value?.ToString() ?? string.Empty, + SmtpClientHost = builder.Configuration?.GetSection("SmtpClientHost")?.Value?.ToString() ?? string.Empty, + SmtpClientPort = Convert.ToInt32(builder.Configuration?.GetSection("SmtpClientPort")?.Value?.ToString()), + PopHost = builder.Configuration?.GetSection("PopHost")?.Value?.ToString() ?? string.Empty, + PopPort = Convert.ToInt32(builder.Configuration?.GetSection("PopPort")?.Value?.ToString()) +}); + // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { diff --git a/IceCreamShop/IceCreamShopRestApi/appsettings.json b/IceCreamShop/IceCreamShopRestApi/appsettings.json index 10f68b8..48d6a5e 100644 --- a/IceCreamShop/IceCreamShopRestApi/appsettings.json +++ b/IceCreamShop/IceCreamShopRestApi/appsettings.json @@ -5,5 +5,12 @@ "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "*" + "AllowedHosts": "*", + + "SmtpClientHost": "smtp.gmail.com", + "SmtpClientPort": "587", + "PopHost": "pop.gmail.com", + "PopPort": "995", + "MailLogin": "icecreamshop2023tp@gmail.com", + "MailPassword": "czts meyw wpbg miiv" } -- 2.25.1 From 25f51edbdc1adb577d25be6d3747cba5fe6b443d Mon Sep 17 00:00:00 2001 From: Ino Date: Tue, 11 Apr 2023 15:39:54 +0400 Subject: [PATCH 2/8] =?UTF-8?q?=D0=B1=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IceCreamShop/IceCreamShop/Program.cs | 2 +- IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj | 1 - IceCreamShop/IceCreamShopRestApi/Program.cs | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/IceCreamShop/IceCreamShop/Program.cs b/IceCreamShop/IceCreamShop/Program.cs index 5d7d1a2..9383722 100644 --- a/IceCreamShop/IceCreamShop/Program.cs +++ b/IceCreamShop/IceCreamShop/Program.cs @@ -7,7 +7,7 @@ using Microsoft.Extensions.Logging; using NLog.Extensions.Logging; using IceCreamBusinessLogic.OfficePackage.Implements; using IceCreamBusinessLogic.OfficePackage; -using IceCreamShopFileImplement.Implements; +using IceCreamShopDatabaseImplement.Implements; using IceCreamBusinessLogic.BusinessLogic; using IceCreamBusinessLogic.MailWorker; using IceCreamShopContracts.BindingModels; diff --git a/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj b/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj index a9229d5..8e1ebc5 100644 --- a/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj +++ b/IceCreamShop/IceCreamShopRestApi/IceCreamShopRestApi.csproj @@ -15,7 +15,6 @@ - diff --git a/IceCreamShop/IceCreamShopRestApi/Program.cs b/IceCreamShop/IceCreamShopRestApi/Program.cs index c438187..fc55e23 100644 --- a/IceCreamShop/IceCreamShopRestApi/Program.cs +++ b/IceCreamShop/IceCreamShopRestApi/Program.cs @@ -3,7 +3,7 @@ using IceCreamBusinessLogic.MailWorker; using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.BusinessLogicsContracts; using IceCreamShopContracts.StoragesContracts; -using IceCreamShopFileImplement.Implements; +using IceCreamShopDatabaseImplement.Implements; using Microsoft.OpenApi.Models; var builder = WebApplication.CreateBuilder(args); -- 2.25.1 From 4cf40944f5a7dd974484ff3e3cb1f203af4527f3 Mon Sep 17 00:00:00 2001 From: Ino Date: Wed, 3 May 2023 14:05:03 +0400 Subject: [PATCH 3/8] =?UTF-8?q?=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D0=BE=207=20?= =?UTF-8?q?=D1=83=D1=81=D0=BB=D0=BE=D0=B6=D0=BD=D0=B5=D0=BD=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogics/MessageInfoLogic.cs | 23 +- .../BusinessLogics/OrderLogic.cs | 257 ++++++++---------- .../IceCreamShop/FormReplyMail.Designer.cs | 149 ++++++++++ IceCreamShop/IceCreamShop/FormReplyMail.cs | 73 +++++ IceCreamShop/IceCreamShop/FormReplyMail.resx | 60 ++++ .../IceCreamShop/FormViewMail.Designer.cs | 52 +++- IceCreamShop/IceCreamShop/FormViewMail.cs | 64 ++++- .../BindingModels/MessageInfoBindingModel.cs | 6 +- .../IMessageInfoLogic.cs | 6 +- .../SearchModels/MessageInfoSearchModel.cs | 6 +- .../StoragesContracts/IMessageInfoStorage.cs | 4 +- .../ViewModels/MessageInfoViewModel.cs | 8 +- .../Implements/MessageInfoStorage.cs | 36 ++- .../IceCreamShopDatabaseModelSnapshot.cs | 3 +- .../Models/MessageInfo.cs | 50 ++-- .../Implements/MessageInfoStorage.cs | 27 +- .../Models/MessageInfo.cs | 88 +++--- .../Implements/MessageInfoStorage.cs | 3 +- 18 files changed, 695 insertions(+), 220 deletions(-) create mode 100644 IceCreamShop/IceCreamShop/FormReplyMail.Designer.cs create mode 100644 IceCreamShop/IceCreamShop/FormReplyMail.cs create mode 100644 IceCreamShop/IceCreamShop/FormReplyMail.resx diff --git a/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/MessageInfoLogic.cs b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/MessageInfoLogic.cs index 06f8576..ef9e706 100644 --- a/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/MessageInfoLogic.cs +++ b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/MessageInfoLogic.cs @@ -27,7 +27,28 @@ namespace IceCreamBusinessLogic.BusinessLogics return true; } - public List? ReadList(MessageInfoSearchModel? model) + public MessageInfoViewModel? ReadElement(MessageInfoSearchModel model) + { + var res = _messageInfoStorage.GetElement(model); + if (res == null) + { + _logger.LogWarning("Read element operation failed"); + return null; + } + return res; + } + + public bool Update(MessageInfoBindingModel model) + { + if (_messageInfoStorage.Update(model) == null) + { + _logger.LogWarning("Update 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); diff --git a/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/OrderLogic.cs b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/OrderLogic.cs index 04d3ea8..7f262ff 100644 --- a/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/OrderLogic.cs @@ -25,21 +25,17 @@ namespace IceCreamBusinessLogic.BusinessLogics private readonly IShopLogic _shopLogic; private readonly IIceCreamStorage _iceCreamStorage; - public OrderLogic(ILogger logger, IOrderStorage orderStorage, AbstractMailWorker mailWorker, IClientLogic clientLogic) + public OrderLogic(ILogger logger, IOrderStorage orderStorage, IIceCreamStorage icecreamStorage, IShopLogic shopLogic, IClientLogic clientLogic, AbstractMailWorker mailWorker) { - public OrderLogic(IOrderStorage orderStorage, IShopStorage shopStorage, IShopLogic shopLogic, IIceCreamStorage iceCreamStorage, ILogger logger) - { - _orderStorage = orderStorage; - _shopStorage = shopStorage; - _logger = logger; + _logger = logger; + _shopLogic = shopLogic; + _iceCreamStorage = icecreamStorage; + _orderStorage = orderStorage; _mailWorker = mailWorker; _clientLogic = clientLogic; } - _shopLogic = shopLogic; - _iceCreamStorage = iceCreamStorage; - } - public bool CreateOrder(OrderBindingModel model) + public bool CreateOrder(OrderBindingModel model) { CheckModel(model); if(model.Status != OrderStatus.Неизвестен) @@ -111,149 +107,132 @@ namespace IceCreamBusinessLogic.BusinessLogics _logger.LogInformation("Order. OrderID:{Id}.Sum:{ Sum}. DocumentId: { DocumentId}", model.Id, model.Sum, model.IceCreamId); } - public bool SetNewStatus(OrderBindingModel rawModel, OrderStatus newStatus) - { - var viewModel = _orderStorage.GetElement(new OrderSearchModel - { - Id = rawModel.Id - }); + public bool SetNewStatus(OrderBindingModel rawModel, OrderStatus newStatus) + { + var viewModel = _orderStorage.GetElement(new OrderSearchModel + { + Id = rawModel.Id + }); - if (viewModel == null) - { - _logger.LogWarning("Order model not found"); - return false; - } + if (viewModel == null) + { + _logger.LogWarning("Order model not found"); + return false; + } - OrderBindingModel model = new OrderBindingModel - { - Id = viewModel.Id, - IceCreamId = viewModel.IceCreamId, - Status = viewModel.Status, - DateCreate = viewModel.DateCreate, - DateImplement = viewModel.DateImplement, - Count = viewModel.Count, - Sum = viewModel.Sum, - ImplementerId = viewModel.ImplementerId - }; - if (rawModel.ImplementerId.HasValue) - { - model.ImplementerId = rawModel.ImplementerId; - } - model.Status = orderStatus; - model.DateCreate = vmodel.DateCreate; - if (model.DateImplement == null) - model.DateImplement = vmodel.DateImplement; - if (vmodel.ImplementerId.HasValue) - model.ImplementerId = vmodel.ImplementerId; - model.IceCreamId = vmodel.IceCreamId; - model.Sum = vmodel.Sum; - model.Count = vmodel.Count; + OrderBindingModel model = new OrderBindingModel + { + Id = viewModel.Id, + IceCreamId = viewModel.IceCreamId, + Status = viewModel.Status, + DateCreate = viewModel.DateCreate, + DateImplement = viewModel.DateImplement, + Count = viewModel.Count, + Sum = viewModel.Sum, + ImplementerId = viewModel.ImplementerId + }; + if (rawModel.ImplementerId.HasValue) + { + model.ImplementerId = rawModel.ImplementerId; + } + + CheckModel(model); + if (model.Status + 1 != newStatus && model.Status != OrderStatus.Ожидается) + { + _logger.LogWarning("Status update to " + newStatus.ToString() + " operation failed. Order status incorrect."); + return false; + } + + if (newStatus == OrderStatus.Готов) + { + var icecream = _iceCreamStorage.GetElement(new IceCreamSearchModel() { Id = model.IceCreamId }); + if (icecream == null) + { + _logger.LogWarning("Status update to " + newStatus.ToString() + " operation failed. Icecream not found."); + return false; + } + if (CheckSupply(icecream, model.Count) == false) + { + _logger.LogWarning("Status update to " + newStatus.ToString() + " operation failed. Shop supply error."); + model.Status = OrderStatus.Ожидается; + _orderStorage.Update(model); + return false; + } + } + + model.Status = newStatus; + if (model.Status == OrderStatus.Выдан) model.DateImplement = DateTime.Now; var result = _orderStorage.Update(model); if (result == null) { + model.Status--; _logger.LogWarning("Update operation failed"); return false; } - SendOrderStatusMail(result.ClientId, $"Изменен статус заказа #{result.Id}", $"Заказ #{model.Id} изменен статус на {result.Status}"); + SendOrderStatusMail(result.ClientId, $"Изменен статус заказа #{result.Id}", $"Заказ #{result.Id} изменен статус на {result.Status}"); return true; } - - CheckModel(model); - if (model.Status + 1 != newStatus && model.Status != OrderStatus.Ожидается) - { - _logger.LogWarning("Status update to " + newStatus.ToString() + " operation failed. Order status incorrect."); - return false; - } + public bool CheckSupply(IIceCreamModel model, int count) + { + if (count <= 0) + { + _logger.LogWarning("Check then supply operation error. icecream count < 0."); + return false; + } - if (newStatus == OrderStatus.Готов) - { - var icecream = _iceCreamStorage.GetElement(new IceCreamSearchModel() { Id = model.IceCreamId }); - if (icecream == null) - { - _logger.LogWarning("Status update to " + newStatus.ToString() + " operation failed. Icecream not found."); - return false; - } - if (CheckSupply(icecream, model.Count) == false) - { - _logger.LogWarning("Status update to " + newStatus.ToString() + " operation failed. Shop supply error."); - model.Status = OrderStatus.Ожидается; - _orderStorage.Update(model); - return false; - } - } + int freeSpace = 0; + foreach (var shop in _shopStorage.GetFullList()) + { + freeSpace += shop.IceCreamMaxCount; + foreach (var icecream in shop.ShopIceCreams) + { + freeSpace -= icecream.Value.Item2; + } + } - model.Status = newStatus; - if (model.Status == OrderStatus.Выдан) model.DateImplement = DateTime.Now; - if (_orderStorage.Update(model) == null) - { - model.Status--; - _logger.LogWarning("Update operation failed"); - return false; - } - return true; - } + if (freeSpace - count < 0) + { + _logger.LogWarning("Check then supply operation error. There's no place for new icecreams in shops."); + return false; + } - public bool CheckSupply(IIceCreamModel model, int count) - { - if (count <= 0) - { - _logger.LogWarning("Check then supply operation error. icecream count < 0."); - return false; - } - - int freeSpace = 0; - foreach (var shop in _shopStorage.GetFullList()) - { - freeSpace += shop.IceCreamMaxCount; - foreach (var icecream in shop.ShopIceCreams) - { - freeSpace -= icecream.Value.Item2; - } - } - - if (freeSpace - count < 0) - { - _logger.LogWarning("Check then supply operation error. There's no place for new icecreams in shops."); - return false; - } - - foreach (var shop in _shopStorage.GetFullList()) - { - freeSpace = shop.IceCreamMaxCount; - foreach (var icecream in shop.ShopIceCreams) - { - freeSpace -= icecream.Value.Item2; - } - if (freeSpace == 0) - { - continue; - } - if (freeSpace - count >= 0) - { - if (_shopLogic.SupplyIceCreams(new() { Id = shop.Id }, model, count)) count = 0; - else - { - _logger.LogWarning("Supply error"); - return false; - } - } - if (freeSpace - count < 0) - { - if (_shopLogic.SupplyIceCreams(new() { Id = shop.Id }, model, freeSpace)) count -= freeSpace; - else - { - _logger.LogWarning("Supply error"); - return false; - } - } - if (count <= 0) - { - return true; - } - } - return false; - } + foreach (var shop in _shopStorage.GetFullList()) + { + freeSpace = shop.IceCreamMaxCount; + foreach (var icecream in shop.ShopIceCreams) + { + freeSpace -= icecream.Value.Item2; + } + if (freeSpace == 0) + { + continue; + } + if (freeSpace - count >= 0) + { + if (_shopLogic.SupplyIceCreams(new() { Id = shop.Id }, model, count)) count = 0; + else + { + _logger.LogWarning("Supply error"); + return false; + } + } + if (freeSpace - count < 0) + { + if (_shopLogic.SupplyIceCreams(new() { Id = shop.Id }, model, freeSpace)) count -= freeSpace; + else + { + _logger.LogWarning("Supply error"); + return false; + } + } + if (count <= 0) + { + return true; + } + } + return false; + } public OrderViewModel? ReadElement(OrderSearchModel model) { diff --git a/IceCreamShop/IceCreamShop/FormReplyMail.Designer.cs b/IceCreamShop/IceCreamShop/FormReplyMail.Designer.cs new file mode 100644 index 0000000..03cbcff --- /dev/null +++ b/IceCreamShop/IceCreamShop/FormReplyMail.Designer.cs @@ -0,0 +1,149 @@ +namespace IceCreamShopView +{ + partial class FormReplyMail + { + /// + /// 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() + { + textBoxReply = new TextBox(); + textBoxMainText = new TextBox(); + textBoxTitle = new TextBox(); + labelReply = new Label(); + labelMainText = new Label(); + labelTitle = new Label(); + buttonCancel = new Button(); + buttonSave = new Button(); + SuspendLayout(); + // + // textBoxReply + // + textBoxReply.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + textBoxReply.Location = new Point(137, 114); + textBoxReply.Multiline = true; + textBoxReply.Name = "textBoxReply"; + textBoxReply.Size = new Size(494, 182); + textBoxReply.TabIndex = 15; + // + // textBoxMainText + // + textBoxMainText.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + textBoxMainText.Location = new Point(137, 32); + textBoxMainText.Multiline = true; + textBoxMainText.Name = "textBoxMainText"; + textBoxMainText.ReadOnly = true; + textBoxMainText.Size = new Size(494, 76); + textBoxMainText.TabIndex = 14; + // + // textBoxTitle + // + textBoxTitle.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + textBoxTitle.Location = new Point(137, 2); + textBoxTitle.Name = "textBoxTitle"; + textBoxTitle.ReadOnly = true; + textBoxTitle.Size = new Size(494, 23); + textBoxTitle.TabIndex = 13; + // + // labelReply + // + labelReply.Location = new Point(14, 114); + labelReply.Name = "labelReply"; + labelReply.Size = new Size(117, 31); + labelReply.TabIndex = 12; + labelReply.Text = "Ответ на письмо:"; + labelReply.TextAlign = ContentAlignment.TopRight; + // + // labelMainText + // + labelMainText.Location = new Point(14, 35); + labelMainText.Name = "labelMainText"; + labelMainText.Size = new Size(117, 23); + labelMainText.TabIndex = 11; + labelMainText.Text = "Текст письма:"; + labelMainText.TextAlign = ContentAlignment.TopRight; + // + // labelTitle + // + labelTitle.Location = new Point(14, 6); + labelTitle.Name = "labelTitle"; + labelTitle.Size = new Size(117, 23); + labelTitle.TabIndex = 10; + labelTitle.Text = "Заголовок письма:"; + labelTitle.TextAlign = ContentAlignment.TopRight; + // + // buttonCancel + // + buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonCancel.Location = new Point(175, 302); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(117, 30); + buttonCancel.TabIndex = 9; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // buttonSave + // + buttonSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonSave.Location = new Point(298, 302); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(117, 30); + buttonSave.TabIndex = 8; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // FormReplyMail + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(636, 344); + Controls.Add(textBoxReply); + Controls.Add(textBoxMainText); + Controls.Add(textBoxTitle); + Controls.Add(labelReply); + Controls.Add(labelMainText); + Controls.Add(labelTitle); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Name = "FormReplyMail"; + Text = "Ответ на письмо"; + Load += FormReplyMail_Load; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private TextBox textBoxReply; + private TextBox textBoxMainText; + private TextBox textBoxTitle; + private Label labelReply; + private Label labelMainText; + private Label labelTitle; + private Button buttonCancel; + private Button buttonSave; + } +} \ No newline at end of file diff --git a/IceCreamShop/IceCreamShop/FormReplyMail.cs b/IceCreamShop/IceCreamShop/FormReplyMail.cs new file mode 100644 index 0000000..b27a968 --- /dev/null +++ b/IceCreamShop/IceCreamShop/FormReplyMail.cs @@ -0,0 +1,73 @@ +using IceCreamBusinessLogic.MailWorker; +using IceCreamShopContracts.BusinessLogicsContracts; +using IceCreamShopContracts.ViewModels; +using Microsoft.Extensions.Logging; + +namespace IceCreamShopView +{ + public partial class FormReplyMail : Form + { + private readonly ILogger _logger; + private readonly AbstractMailWorker _mailWorker; + private readonly IMessageInfoLogic _logic; + private MessageInfoViewModel _message; + + public string MessageId { get; set; } = string.Empty; + + public FormReplyMail(ILogger logger, AbstractMailWorker mailWorker, IMessageInfoLogic logic) + { + InitializeComponent(); + _logger = logger; + _mailWorker = mailWorker; + _logic = logic; + } + + private void ButtonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + _mailWorker.MailSendAsync(new() + { + MailAddress = _message.SenderName, + Subject = _message.Subject, + Text = textBoxReply.Text, + }); + _logic.Update(new() + { + MessageId = MessageId, + Reply = textBoxReply.Text, + HasRead = true, + }); + MessageBox.Show("Успешно отправлено письмо", "Отправка письма", MessageBoxButtons.OK); + DialogResult = DialogResult.OK; + Close(); + } + + private void FormReplyMail_Load(object sender, EventArgs e) + { + try + { + _message = _logic.ReadElement(new() { MessageId = MessageId }); + if (_message == null) + throw new ArgumentNullException("Письма с таким id не существует"); + Text += $"для {_message.SenderName}"; + textBoxTitle.Text = _message.Subject; + textBoxMainText.Text = _message.Body; + if (_message.HasRead is false) + { + _logic.Update(new() { MessageId = MessageId, HasRead = true, Reply = _message.Reply }); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения собщения"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } +} diff --git a/IceCreamShop/IceCreamShop/FormReplyMail.resx b/IceCreamShop/IceCreamShop/FormReplyMail.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/IceCreamShop/IceCreamShop/FormReplyMail.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 diff --git a/IceCreamShop/IceCreamShop/FormViewMail.Designer.cs b/IceCreamShop/IceCreamShop/FormViewMail.Designer.cs index 86ee139..87fe923 100644 --- a/IceCreamShop/IceCreamShop/FormViewMail.Designer.cs +++ b/IceCreamShop/IceCreamShop/FormViewMail.Designer.cs @@ -28,25 +28,64 @@ /// private void InitializeComponent() { + labelInfoPages = new Label(); + buttonNextPage = new Button(); + buttonPrevPage = new Button(); dataGridView = new DataGridView(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); SuspendLayout(); // + // labelInfoPages + // + labelInfoPages.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + labelInfoPages.Location = new Point(99, 485); + labelInfoPages.Name = "labelInfoPages"; + labelInfoPages.Size = new Size(104, 19); + labelInfoPages.TabIndex = 7; + labelInfoPages.Text = "{0} страница"; + labelInfoPages.TextAlign = ContentAlignment.MiddleCenter; + // + // buttonNextPage + // + buttonNextPage.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonNextPage.Location = new Point(209, 481); + buttonNextPage.Name = "buttonNextPage"; + buttonNextPage.Size = new Size(75, 23); + buttonNextPage.TabIndex = 6; + buttonNextPage.Text = ">>>"; + buttonNextPage.UseVisualStyleBackColor = true; + buttonNextPage.Click += ButtonNextPage_Click; + // + // buttonPrevPage + // + buttonPrevPage.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonPrevPage.Location = new Point(18, 481); + buttonPrevPage.Name = "buttonPrevPage"; + buttonPrevPage.Size = new Size(75, 23); + buttonPrevPage.TabIndex = 5; + buttonPrevPage.Text = "<<<"; + buttonPrevPage.UseVisualStyleBackColor = true; + buttonPrevPage.Click += ButtonPrevPage_Click; + // // dataGridView // + dataGridView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; - dataGridView.Dock = DockStyle.Fill; - dataGridView.Location = new Point(0, 0); + dataGridView.Location = new Point(12, 12); dataGridView.Name = "dataGridView"; dataGridView.RowTemplate.Height = 25; - dataGridView.Size = new Size(800, 450); - dataGridView.TabIndex = 1; + dataGridView.Size = new Size(872, 463); + dataGridView.TabIndex = 4; + dataGridView.RowHeaderMouseClick += dataGridView_RowHeaderMouseClick; // // FormViewMail // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(800, 450); + ClientSize = new Size(896, 513); + Controls.Add(labelInfoPages); + Controls.Add(buttonNextPage); + Controls.Add(buttonPrevPage); Controls.Add(dataGridView); Name = "FormViewMail"; Text = "Письма"; @@ -57,6 +96,9 @@ #endregion + private Label labelInfoPages; + private Button buttonNextPage; + private Button buttonPrevPage; private DataGridView dataGridView; } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShop/FormViewMail.cs b/IceCreamShop/IceCreamShop/FormViewMail.cs index a802c58..1fe9917 100644 --- a/IceCreamShop/IceCreamShop/FormViewMail.cs +++ b/IceCreamShop/IceCreamShop/FormViewMail.cs @@ -1,4 +1,6 @@ -using IceCreamShopContracts.BusinessLogicsContracts; +using IceCreamShop; +using IceCreamShopContracts.BusinessLogicsContracts; +using IceCreamShopContracts.ViewModels; using Microsoft.Extensions.Logging; namespace IceCreamShopView @@ -7,19 +9,31 @@ namespace IceCreamShopView { private readonly ILogger _logger; private readonly IMessageInfoLogic _logic; + private int currentPage = 1; + public int pageSize = 5; public FormViewMail(ILogger logger, IMessageInfoLogic logic) { InitializeComponent(); _logger = logger; _logic = logic; + buttonPrevPage.Enabled = false; } private void FormViewMail_Load(object sender, EventArgs e) + { + MailLoad(); + } + + private bool MailLoad() { try { - var list = _logic.ReadList(null); + var list = _logic.ReadList(new() + { + Page = currentPage, + PageSize = pageSize, + }); if (list != null) { dataGridView.DataSource = list; @@ -28,12 +42,56 @@ namespace IceCreamShopView dataGridView.Columns["Body"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; } _logger.LogInformation("Загрузка списка писем"); + labelInfoPages.Text = $"{currentPage} страница"; + return true; } catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки писем"); MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); + MessageBoxIcon.Error); + return false; + } + } + + private void ButtonPrevPage_Click(object sender, EventArgs e) + { + if (currentPage == 1) + { + _logger.LogWarning("Неккоректный номер страницы {page}", currentPage - 1); + return; + } + currentPage--; + if (MailLoad()) + { + buttonNextPage.Enabled = true; + if (currentPage == 1) + buttonPrevPage.Enabled = false; + } + } + + private void ButtonNextPage_Click(object sender, EventArgs e) + { + currentPage++; + if (!MailLoad() || ((List)dataGridView.DataSource).Count == 0) + { + _logger.LogWarning("Out of range messages"); + currentPage--; + MailLoad(); + buttonNextPage.Enabled = false; + } + else + buttonPrevPage.Enabled = true; + } + + private void dataGridView_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormReplyMail)); + if (service is FormReplyMail form) + { + form.MessageId = (string)dataGridView.Rows[e.RowIndex].Cells["MessageId"].Value; + form.ShowDialog(); + MailLoad(); } } } diff --git a/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs b/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs index 7bab4ca..f2a51d8 100644 --- a/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs +++ b/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs @@ -15,5 +15,9 @@ namespace IceCreamShopContracts.BindingModels public string Body { get; set; } = string.Empty; public DateTime DateDelivery { get; set; } - } + + public bool HasRead { get; set; } + + public string? Reply { get; set; } + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IMessageInfoLogic.cs b/IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IMessageInfoLogic.cs index 9ceba41..ee3d45e 100644 --- a/IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IMessageInfoLogic.cs +++ b/IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IMessageInfoLogic.cs @@ -9,5 +9,9 @@ namespace IceCreamShopContracts.BusinessLogicsContracts List? ReadList(MessageInfoSearchModel? model); bool Create(MessageInfoBindingModel model); - } + + bool Update(MessageInfoBindingModel model); + + MessageInfoViewModel? ReadElement(MessageInfoSearchModel model); + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/SearchModels/MessageInfoSearchModel.cs b/IceCreamShop/IceCreamShopContracts/SearchModels/MessageInfoSearchModel.cs index da8e399..d05f11f 100644 --- a/IceCreamShop/IceCreamShopContracts/SearchModels/MessageInfoSearchModel.cs +++ b/IceCreamShop/IceCreamShopContracts/SearchModels/MessageInfoSearchModel.cs @@ -5,5 +5,9 @@ public int? ClientId { get; set; } public string? MessageId { get; set; } - } + + public int? Page { get; set; } + + public int? PageSize { get; set; } + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/StoragesContracts/IMessageInfoStorage.cs b/IceCreamShop/IceCreamShopContracts/StoragesContracts/IMessageInfoStorage.cs index 9ac5688..97442f9 100644 --- a/IceCreamShop/IceCreamShopContracts/StoragesContracts/IMessageInfoStorage.cs +++ b/IceCreamShop/IceCreamShopContracts/StoragesContracts/IMessageInfoStorage.cs @@ -13,5 +13,7 @@ namespace IceCreamShopContracts.StoragesContracts MessageInfoViewModel? GetElement(MessageInfoSearchModel model); MessageInfoViewModel? Insert(MessageInfoBindingModel model); - } + + MessageInfoViewModel? Update(MessageInfoBindingModel model); + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs index c4e4a23..9c252bb 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs @@ -20,5 +20,11 @@ namespace IceCreamShopContracts.ViewModels [DisplayName("Текст")] public string Body { get; set; } = string.Empty; - } + + [DisplayName("Прочитано")] + public bool HasRead { get; set; } + + [DisplayName("Ответ")] + public string? Reply { get; set; } + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Implements/MessageInfoStorage.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Implements/MessageInfoStorage.cs index 4186d90..cbd80a1 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Implements/MessageInfoStorage.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Implements/MessageInfoStorage.cs @@ -19,16 +19,20 @@ namespace IceCreamShopDatabaseImplement.Implements return null; } - public List GetFilteredList(MessageInfoSearchModel model) - { - using var context = new IceCreamShopDatabase(); - return context.Messages - .Where(x => x.ClientId == model.ClientId) - .Select(x => x.GetViewModel) - .ToList(); - } + public List GetFilteredList(MessageInfoSearchModel model) + { + using var context = new IceCreamShopDatabase(); + var res = context.Messages + .Where(x => !model.ClientId.HasValue || x.ClientId == model.ClientId) + .Select(x => x.GetViewModel); + if (!(model.Page.HasValue && model.PageSize.HasValue)) + { + return res.ToList(); + } + return res.Skip((model.Page.Value - 1) * model.PageSize.Value).Take(model.PageSize.Value).ToList(); + } - public List GetFullList() + public List GetFullList() { using var context = new IceCreamShopDatabase(); return context.Messages @@ -48,5 +52,17 @@ namespace IceCreamShopDatabaseImplement.Implements context.SaveChanges(); return newMessage.GetViewModel; } - } + + public MessageInfoViewModel? Update(MessageInfoBindingModel model) + { + using var context = new IceCreamShopDatabase(); + var res = context.Messages.FirstOrDefault(x => x.MessageId.Equals(model.MessageId)); + if (res != null) + { + res.Update(model); + context.SaveChanges(); + } + return res?.GetViewModel; + } + } } diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs index ed373d3..1094860 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs @@ -320,8 +320,9 @@ namespace IceCreamShopDatabaseImplement.Migrations b.Navigation("Client"); b.Navigation("IceCream"); + }); - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.ShopIcecream", b => + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.ShopIcecream", b => { b.HasOne("IceCreamShopDatabaseImplement.Models.IceCream", "IceCream") .WithMany() diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs index 9c6b65b..c88ff01 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs @@ -22,7 +22,11 @@ namespace IceCreamShopDatabaseImplement.Models public Client? Client { get; private set; } - public static MessageInfo? Create(MessageInfoBindingModel model) + public bool HasRead { get; private set; } + + public string? Reply { get; private set; } + + public static MessageInfo? Create(MessageInfoBindingModel model) { if (model == null) { @@ -30,23 +34,37 @@ namespace IceCreamShopDatabaseImplement.Models } return new() { - Body = model.Body, - Subject = model.Subject, - ClientId = model.ClientId, - MessageId = model.MessageId, - SenderName = model.SenderName, - DateDelivery = model.DateDelivery, - }; + Body = model.Body, + Reply = model.Reply, + HasRead = model.HasRead, + Subject = model.Subject, + ClientId = model.ClientId, + MessageId = model.MessageId, + SenderName = model.SenderName, + DateDelivery = model.DateDelivery, + }; } - public MessageInfoViewModel GetViewModel => new() + public void Update(MessageInfoBindingModel model) + { + if (model == null) + { + return; + } + Reply = model.Reply; + HasRead = model.HasRead; + } + + public MessageInfoViewModel GetViewModel => new() { - Body = Body, - Subject = Subject, - ClientId = ClientId, - MessageId = MessageId, - SenderName = SenderName, - DateDelivery = DateDelivery, - }; + Body = Body, + Reply = Reply, + HasRead = HasRead, + Subject = Subject, + ClientId = ClientId, + MessageId = MessageId, + SenderName = SenderName, + DateDelivery = DateDelivery, + }; } } diff --git a/IceCreamShop/IceCreamShopFileImplement/Implements/MessageInfoStorage.cs b/IceCreamShop/IceCreamShopFileImplement/Implements/MessageInfoStorage.cs index 1ee91b0..72b4fe0 100644 --- a/IceCreamShop/IceCreamShopFileImplement/Implements/MessageInfoStorage.cs +++ b/IceCreamShop/IceCreamShopFileImplement/Implements/MessageInfoStorage.cs @@ -25,11 +25,15 @@ namespace IceCreamShopFileImplement.Implements public List GetFilteredList(MessageInfoSearchModel model) { - return _source.Messages - .Where(x => x.ClientId == model.ClientId) - .Select(x => x.GetViewModel) - .ToList(); - } + var res = _source.Messages + .Where(x => !model.ClientId.HasValue || x.ClientId == model.ClientId) + .Select(x => x.GetViewModel); + if (!(model.Page.HasValue && model.PageSize.HasValue)) + { + return res.ToList(); + } + return res.Skip((model.Page.Value - 1) * model.PageSize.Value).Take(model.PageSize.Value).ToList(); + } public List GetFullList() { @@ -49,5 +53,16 @@ namespace IceCreamShopFileImplement.Implements _source.SaveMessages(); return newMessage.GetViewModel; } - } + + public MessageInfoViewModel? Update(MessageInfoBindingModel model) + { + var res = _source.Messages.FirstOrDefault(x => x.MessageId.Equals(model.MessageId)); + if (res != null) + { + res.Update(model); + _source.SaveMessages(); + } + return res?.GetViewModel; + } + } } diff --git a/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs index aa31ba3..d72f0b1 100644 --- a/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs +++ b/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs @@ -19,7 +19,11 @@ namespace IceCreamShopFileImplement.Models public string Body { get; private set; } = string.Empty; - public static MessageInfo? Create(MessageInfoBindingModel model) + public bool HasRead { get; private set; } + + public string? Reply { get; private set; } + + public static MessageInfo? Create(MessageInfoBindingModel model) { if (model == null) { @@ -27,13 +31,15 @@ namespace IceCreamShopFileImplement.Models } return new() { - Body = model.Body, - Subject = model.Subject, - ClientId = model.ClientId, - MessageId = model.MessageId, - SenderName = model.SenderName, - DateDelivery = model.DateDelivery, - }; + Body = model.Body, + Reply = model.Reply, + HasRead = model.HasRead, + Subject = model.Subject, + ClientId = model.ClientId, + MessageId = model.MessageId, + SenderName = model.SenderName, + DateDelivery = model.DateDelivery, + }; } public static MessageInfo? Create(XElement element) @@ -44,32 +50,48 @@ namespace IceCreamShopFileImplement.Models } return new() { - Body = element.Attribute("Body")!.Value, - Subject = element.Attribute("Subject")!.Value, - ClientId = Convert.ToInt32(element.Attribute("ClientId")!.Value), - MessageId = element.Attribute("MessageId")!.Value, - SenderName = element.Attribute("SenderName")!.Value, - DateDelivery = Convert.ToDateTime(element.Attribute("DateDelivery")!.Value), - }; + Body = element.Attribute("Body")!.Value, + Reply = element.Attribute("Reply")!.Value, + HasRead = Convert.ToBoolean(element.Attribute("HasRead")!.Value), + Subject = element.Attribute("Subject")!.Value, + ClientId = Convert.ToInt32(element.Attribute("ClientId")!.Value), + MessageId = element.Attribute("MessageId")!.Value, + SenderName = element.Attribute("SenderName")!.Value, + DateDelivery = Convert.ToDateTime(element.Attribute("DateDelivery")!.Value), + }; } - public MessageInfoViewModel GetViewModel => new() - { - Body = Body, - Subject = Subject, - ClientId = ClientId, - MessageId = MessageId, - SenderName = SenderName, - DateDelivery = DateDelivery, - }; + public void Update(MessageInfoBindingModel model) + { + if (model == null) + { + return; + } + Reply = model.Reply; + HasRead = model.HasRead; + } - public XElement GetXElement => new("MessageInfo", - new XAttribute("Body", Body), - new XAttribute("Subject", Subject), - new XAttribute("ClientId", ClientId), - new XAttribute("MessageId", MessageId), - new XAttribute("SenderName", SenderName), - new XAttribute("DateDelivery", DateDelivery) - ); - } + public MessageInfoViewModel GetViewModel => new() + { + Body = Body, + Reply = Reply, + HasRead = HasRead, + Subject = Subject, + ClientId = ClientId, + MessageId = MessageId, + SenderName = SenderName, + DateDelivery = DateDelivery, + }; + + public XElement GetXElement => new("MessageInfo", + new XAttribute("Body", Body), + new XAttribute("Reply", Reply), + new XAttribute("HasRead", HasRead), + new XAttribute("Subject", Subject), + new XAttribute("ClientId", ClientId), + new XAttribute("MessageId", MessageId), + new XAttribute("SenderName", SenderName), + new XAttribute("DateDelivery", DateDelivery) + ); + } } diff --git a/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs b/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs index 3917486..80b496a 100644 --- a/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs +++ b/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs @@ -1,12 +1,13 @@ using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.SearchModels; +using IceCreamShopContracts.StoragesContracts; using IceCreamShopContracts.ViewModels; using IceCreamShopListImplement.Models; namespace IceCreamShopListImplement.Implements { public class MessageInfoStorage - { + { private readonly DataListSingleton _source; public MessageInfoStorage() { -- 2.25.1 From 7fae4ed8f3ed5eff8eea262ce89602a0032640b2 Mon Sep 17 00:00:00 2001 From: Ino Date: Wed, 3 May 2023 14:20:42 +0400 Subject: [PATCH 4/8] =?UTF-8?q?=D0=BC=D0=BE=D0=B6=D0=B5=D1=82=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82,=20=D0=B0=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B6=D0=B5=D1=82=20=D0=B8=20=D0=BD=D0=B5=D1=82,=20?= =?UTF-8?q?=D0=B0=20=D0=BC=D0=BE=D0=B6=D0=B5=D1=82=20=D0=BD=D0=B5=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B6=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IceCreamShopClientApp/APIClient.cs | 4 +- .../Controllers/HomeController.cs | 38 ++++++ .../Views/Home/Mails.cshtml | 115 +++++++++++------- .../Implements/MessageInfoStorage.cs | 51 ++++++-- .../Models/MessageInfo.cs | 51 +++++--- 5 files changed, 185 insertions(+), 74 deletions(-) diff --git a/IceCreamShop/IceCreamShopClientApp/APIClient.cs b/IceCreamShop/IceCreamShopClientApp/APIClient.cs index 11828b7..f07b017 100644 --- a/IceCreamShop/IceCreamShopClientApp/APIClient.cs +++ b/IceCreamShop/IceCreamShopClientApp/APIClient.cs @@ -11,7 +11,9 @@ namespace IceCreamShopClientApp public static ClientViewModel? Client { get; set; } = null; - public static void Connect(IConfiguration configuration) + public static int CurrentPage { get; set; } = 0; + + public static void Connect(IConfiguration configuration) { _client.BaseAddress = new Uri(configuration["IPAddress"]); _client.DefaultRequestHeaders.Accept.Clear(); diff --git a/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs b/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs index cd24646..82089f9 100644 --- a/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs +++ b/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs @@ -3,6 +3,7 @@ using IceCreamShopContracts.ViewModels; using IceCreamShopClientApp.Models; using Microsoft.AspNetCore.Mvc; using System.Diagnostics; +using System.Text; namespace IceCreamShopClientApp.Controllers { @@ -153,5 +154,42 @@ namespace IceCreamShopClientApp.Controllers } return View(APIClient.GetRequest>($"api/client/getmessages?clientId={APIClient.Client.Id}")); } + + [HttpGet] + public Tuple? SwitchPage(bool isNext) + { + if (isNext) + { + APIClient.CurrentPage++; + } + else + { + if (APIClient.CurrentPage == 1) + { + return null; + } + APIClient.CurrentPage--; + } + + var res = APIClient.GetRequest>($"api/client/getmessages?clientId={APIClient.Client!.Id}&page={APIClient.CurrentPage}"); + if (isNext && (res == null || res.Count == 0)) + { + APIClient.CurrentPage--; + return Tuple.Create(null, null, APIClient.CurrentPage != 1, false); + } + + StringBuilder htmlTable = new(); + foreach (var mail in res) + { + htmlTable.Append("" + + $"{mail.DateDelivery}" + + $"{mail.Subject}" + + $"{mail.Body}" + + "" + (mail.HasRead ? "Прочитано" : "Непрочитано") + "" + + $"{mail.Reply}" + + ""); + } + return Tuple.Create(htmlTable.ToString(), APIClient.CurrentPage.ToString(), APIClient.CurrentPage != 1, true); + } } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopClientApp/Views/Home/Mails.cshtml b/IceCreamShop/IceCreamShopClientApp/Views/Home/Mails.cshtml index 54d27b0..5d3c058 100644 --- a/IceCreamShop/IceCreamShopClientApp/Views/Home/Mails.cshtml +++ b/IceCreamShop/IceCreamShopClientApp/Views/Home/Mails.cshtml @@ -1,7 +1,4 @@ -@using IceCreamShopContracts.ViewModels - -@model List - + @{ ViewData["Title"] = "Mails"; } @@ -10,45 +7,75 @@

Заказы

-
- @{ - if (Model == null) - { -

Авторизируйтесь

- return; - } + + + + + + + + + + + + +
+ Дата письма + + Заголовок + + Текст + + Статус + + Ответ +
+ +
- - - - - - - - - - @foreach (var item in Model) - { - - - - - - } - -
- Дата письма - - Заголовок - - Текст -
- @Html.DisplayFor(modelItem => item.DateDelivery) - - @Html.DisplayFor(modelItem => item.Subject) - - @Html.DisplayFor(modelItem => item.Body) -
- } - \ No newline at end of file + \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs b/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs index 80b496a..7332916 100644 --- a/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs +++ b/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs @@ -6,7 +6,7 @@ using IceCreamShopListImplement.Models; namespace IceCreamShopListImplement.Implements { - public class MessageInfoStorage + public class MessageInfoStorage : IMessageInfoStorage { private readonly DataListSingleton _source; public MessageInfoStorage() @@ -26,16 +26,30 @@ namespace IceCreamShopListImplement.Implements public List GetFilteredList(MessageInfoSearchModel model) { - List result = new(); - foreach (var item in _source.Messages) - { - if (item.ClientId.HasValue && item.ClientId == model.ClientId) - { - result.Add(item.GetViewModel); - } - } - return result; - } + List result = new(); + foreach (var item in _source.Messages) + { + if (item.ClientId.HasValue && item.ClientId == model.ClientId) + { + result.Add(item.GetViewModel); + } + } + + if (!(model.Page.HasValue && model.PageSize.HasValue)) + { + return result; + } + if (model.Page * model.PageSize >= result.Count) + { + return null; + } + List filteredResult = new(); + for (var i = (model.Page.Value - 1) * model.PageSize.Value; i < model.Page.Value * model.PageSize.Value; i++) + { + filteredResult.Add(result[i]); + } + return filteredResult; + } public List GetFullList() { @@ -57,5 +71,18 @@ namespace IceCreamShopListImplement.Implements _source.Messages.Add(newMessage); return newMessage.GetViewModel; } - } + + public MessageInfoViewModel? Update(MessageInfoBindingModel model) + { + foreach (var message in _source.Messages) + { + if (message.MessageId.Equals(model.MessageId)) + { + message.Update(model); + return message.GetViewModel; + } + } + return null; + } + } } diff --git a/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs index 240ac3e..e510a2f 100644 --- a/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs +++ b/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs @@ -18,7 +18,11 @@ namespace IceCreamShopListImplement.Models public string Body { get; private set; } = string.Empty; - public static MessageInfo? Create(MessageInfoBindingModel model) + public bool HasRead { get; private set; } + + public string? Reply { get; private set; } + + public static MessageInfo? Create(MessageInfoBindingModel model) { if (model == null) { @@ -26,24 +30,37 @@ namespace IceCreamShopListImplement.Models } return new() { - Body = model.Body, - Subject = model.Subject, - ClientId = model.ClientId, - MessageId = model.MessageId, - SenderName = model.SenderName, - DateDelivery = model.DateDelivery, - }; + Body = model.Body, + Reply = model.Reply, + HasRead = model.HasRead, + Subject = model.Subject, + ClientId = model.ClientId, + MessageId = model.MessageId, + SenderName = model.SenderName, + DateDelivery = model.DateDelivery, + }; } - public MessageInfoViewModel GetViewModel => new() - { - Body = Body, - Subject = Subject, - ClientId = ClientId, - MessageId = MessageId, - SenderName = SenderName, - DateDelivery = DateDelivery, - }; + public void Update(MessageInfoBindingModel model) + { + if (model == null) + { + return; + } + Reply = model.Reply; + HasRead = model.HasRead; + } + public MessageInfoViewModel GetViewModel => new() + { + Body = Body, + Reply = Reply, + HasRead = HasRead, + Subject = Subject, + ClientId = ClientId, + MessageId = MessageId, + SenderName = SenderName, + DateDelivery = DateDelivery, + }; } } -- 2.25.1 From 5e6d30387479ce3abf7f054c52c6d13f2655fb86 Mon Sep 17 00:00:00 2001 From: Inohara Date: Thu, 4 May 2023 20:35:08 +0400 Subject: [PATCH 5/8] =?UTF-8?q?=D0=B2=D0=BE=D1=82=20=D0=B2=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=20=D1=82=D0=B0=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IceCreamShop/FormMain.Designer.cs | 243 ++------------ IceCreamShop/IceCreamShop/FormMain.cs | 18 -- IceCreamShop/IceCreamShop/FormMain.resx | 3 + IceCreamShop/IceCreamShop/Program.cs | 6 +- .../Controllers/HomeController.cs | 2 +- .../Views/Shared/_Layout.cshtml | 1 + .../IceCreamShopDatabaseImplement.csproj | 6 +- .../20230411104402_LabWork07_mail.Designer.cs | 298 ------------------ .../20230411104402_LabWork07_mail.cs | 48 --- ... 20230504152801_addsToMessage.Designer.cs} | 53 +++- ...igr.cs => 20230504152801_addsToMessage.cs} | 33 +- .../IceCreamShopDatabaseModelSnapshot.cs | 21 +- .../Controllers/ClientController.cs | 8 +- 13 files changed, 146 insertions(+), 594 deletions(-) delete mode 100644 IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.Designer.cs delete mode 100644 IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.cs rename IceCreamShop/IceCreamShopDatabaseImplement/Migrations/{20230425055945_lab6_migr.Designer.cs => 20230504152801_addsToMessage.Designer.cs} (87%) rename IceCreamShop/IceCreamShopDatabaseImplement/Migrations/{20230425055945_lab6_migr.cs => 20230504152801_addsToMessage.cs} (87%) diff --git a/IceCreamShop/IceCreamShop/FormMain.Designer.cs b/IceCreamShop/IceCreamShop/FormMain.Designer.cs index 584c34f..ec07220 100644 --- a/IceCreamShop/IceCreamShop/FormMain.Designer.cs +++ b/IceCreamShop/IceCreamShop/FormMain.Designer.cs @@ -28,183 +28,6 @@ /// private void InitializeComponent() { - buttonUpdate = new Button(); - buttonSetToFinish = new Button(); - buttonCreateOrder = new Button(); - dataGridView = new DataGridView(); - menuStrip = new MenuStrip(); - справочникиToolStripMenuItem = new ToolStripMenuItem(); - компонентыToolStripMenuItem = new ToolStripMenuItem(); - мороженоеToolStripMenuItem = new ToolStripMenuItem(); - клиентыToolStripMenuItem = new ToolStripMenuItem(); - ImplementersToolStripMenuItem = new ToolStripMenuItem(); - отчетыToolStripMenuItem = new ToolStripMenuItem(); - iceCreamComponentsToolStripMenuItem = new ToolStripMenuItem(); - iceCreamToolStripMenuItem = new ToolStripMenuItem(); - ordersToolStripMenuItem = new ToolStripMenuItem(); - DoWorkToolStripMenuItem = new ToolStripMenuItem(); - MailToolStripMenuItem = new ToolStripMenuItem(); - ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); - menuStrip.SuspendLayout(); - SuspendLayout(); - // - // buttonUpdate - // - buttonUpdate.Location = new Point(1081, 112); - buttonUpdate.Margin = new Padding(3, 2, 3, 2); - buttonUpdate.Name = "buttonUpdate"; - buttonUpdate.Size = new Size(170, 37); - buttonUpdate.TabIndex = 13; - buttonUpdate.Text = "Обновить"; - buttonUpdate.UseVisualStyleBackColor = true; - buttonUpdate.Click += buttonUpdate_Click; - // - // buttonSetToFinish - // - buttonSetToFinish.Location = new Point(1081, 70); - buttonSetToFinish.Margin = new Padding(3, 2, 3, 2); - buttonSetToFinish.Name = "buttonSetToFinish"; - buttonSetToFinish.Size = new Size(170, 37); - buttonSetToFinish.TabIndex = 12; - buttonSetToFinish.Text = "Заказ выдан"; - buttonSetToFinish.UseVisualStyleBackColor = true; - buttonSetToFinish.Click += buttonSetToFinish_Click; - // - // buttonCreateOrder - // - buttonCreateOrder.Location = new Point(1081, 29); - buttonCreateOrder.Margin = new Padding(3, 2, 3, 2); - buttonCreateOrder.Name = "buttonCreateOrder"; - buttonCreateOrder.Size = new Size(170, 37); - buttonCreateOrder.TabIndex = 9; - buttonCreateOrder.Text = "Создать заказ"; - buttonCreateOrder.UseVisualStyleBackColor = true; - buttonCreateOrder.Click += buttonCreateOrder_Click; - // - // dataGridView - // - dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; - dataGridView.Location = new Point(12, 26); - dataGridView.Margin = new Padding(3, 2, 3, 2); - dataGridView.Name = "dataGridView"; - dataGridView.RowHeadersWidth = 51; - dataGridView.RowTemplate.Height = 29; - dataGridView.Size = new Size(1063, 305); - dataGridView.TabIndex = 8; - // - // menuStrip - // - menuStrip.ImageScalingSize = new Size(20, 20); - menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчетыToolStripMenuItem, DoWorkToolStripMenuItem, MailToolStripMenuItem }); - menuStrip.Location = new Point(0, 0); - menuStrip.Name = "menuStrip"; - menuStrip.Padding = new Padding(5, 2, 0, 2); - menuStrip.Size = new Size(1261, 24); - menuStrip.TabIndex = 7; - menuStrip.Text = "Справочники"; - // - // справочникиToolStripMenuItem - // - справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { компонентыToolStripMenuItem, мороженоеToolStripMenuItem, клиентыToolStripMenuItem, ImplementersToolStripMenuItem }); - справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; - справочникиToolStripMenuItem.Size = new Size(94, 20); - справочникиToolStripMenuItem.Text = "Справочники"; - // - // компонентыToolStripMenuItem - // - компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; - компонентыToolStripMenuItem.Size = new Size(149, 22); - компонентыToolStripMenuItem.Text = "Компоненты"; - компонентыToolStripMenuItem.Click += компонентыToolStripMenuItem_Click; - // - // мороженоеToolStripMenuItem - // - мороженоеToolStripMenuItem.Name = "мороженоеToolStripMenuItem"; - мороженоеToolStripMenuItem.Size = new Size(149, 22); - мороженоеToolStripMenuItem.Text = "Мороженое"; - мороженоеToolStripMenuItem.Click += мороженоеToolStripMenuItem_Click; - // - // клиентыToolStripMenuItem - // - клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; - клиентыToolStripMenuItem.Size = new Size(149, 22); - клиентыToolStripMenuItem.Text = "Клиенты"; - клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click; - // - // ImplementersToolStripMenuItem - // - ImplementersToolStripMenuItem.Name = "ImplementersToolStripMenuItem"; - ImplementersToolStripMenuItem.Size = new Size(149, 22); - ImplementersToolStripMenuItem.Text = "Исполнители"; - ImplementersToolStripMenuItem.Click += ImplementersToolStripMenuItem_Click; - // - // отчетыToolStripMenuItem - // - отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { iceCreamComponentsToolStripMenuItem, iceCreamToolStripMenuItem, ordersToolStripMenuItem }); - отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; - отчетыToolStripMenuItem.Size = new Size(60, 20); - отчетыToolStripMenuItem.Text = "Отчеты"; - // - // iceCreamComponentsToolStripMenuItem - // - iceCreamComponentsToolStripMenuItem.Name = "iceCreamComponentsToolStripMenuItem"; - iceCreamComponentsToolStripMenuItem.Size = new Size(238, 22); - iceCreamComponentsToolStripMenuItem.Text = "Список мороженых"; - iceCreamComponentsToolStripMenuItem.Click += IceCreamsToolStripMenuItem_Click; - // - // iceCreamToolStripMenuItem - // - iceCreamToolStripMenuItem.Name = "iceCreamToolStripMenuItem"; - iceCreamToolStripMenuItem.Size = new Size(238, 22); - iceCreamToolStripMenuItem.Text = "Мороженые с компонентами"; - iceCreamToolStripMenuItem.Click += IceCreamComponentsToolStripMenuItem_Click; - // - // ordersToolStripMenuItem - // - ordersToolStripMenuItem.Name = "ordersToolStripMenuItem"; - ordersToolStripMenuItem.Size = new Size(238, 22); - ordersToolStripMenuItem.Text = "Список заказов"; - ordersToolStripMenuItem.Click += OrdersToolStripMenuItem_Click; - // - // DoWorkToolStripMenuItem - // - DoWorkToolStripMenuItem.Name = "DoWorkToolStripMenuItem"; - DoWorkToolStripMenuItem.Size = new Size(92, 20); - DoWorkToolStripMenuItem.Text = "Запуск работ"; - DoWorkToolStripMenuItem.Click += DoWorkToolStripMenuItem_Click; - // - // MailToolStripMenuItem - // - MailToolStripMenuItem.Name = "MailToolStripMenuItem"; - MailToolStripMenuItem.Size = new Size(62, 20); - MailToolStripMenuItem.Text = "Письма"; - MailToolStripMenuItem.Click += MailToolStripMenuItem_Click; - // - // FormMain - // - AutoScaleDimensions = new SizeF(7F, 15F); - AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(1261, 347); - Controls.Add(buttonUpdate); - Controls.Add(buttonSetToFinish); - Controls.Add(buttonCreateOrder); - Controls.Add(dataGridView); - Controls.Add(menuStrip); - Name = "FormMain"; - Text = "Магазин мороженого"; - Load += FormMain_Load; - ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); - menuStrip.ResumeLayout(false); - menuStrip.PerformLayout(); - ResumeLayout(false); - PerformLayout(); - } - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { this.buttonUpdate = new System.Windows.Forms.Button(); this.buttonSetToFinish = new System.Windows.Forms.Button(); this.buttonCreateOrder = new System.Windows.Forms.Button(); @@ -224,6 +47,7 @@ this.shopWorkloadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.ordersByDateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.DoWorkToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MailToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.buttonSupplyShop = new System.Windows.Forms.Button(); this.SellIceCreamButton = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); @@ -232,7 +56,7 @@ // // buttonUpdate // - this.buttonUpdate.Location = new System.Drawing.Point(1231, 392); + this.buttonUpdate.Location = new System.Drawing.Point(1235, 149); this.buttonUpdate.Name = "buttonUpdate"; this.buttonUpdate.Size = new System.Drawing.Size(194, 49); this.buttonUpdate.TabIndex = 13; @@ -242,7 +66,7 @@ // // buttonSetToFinish // - this.buttonSetToFinish.Location = new System.Drawing.Point(1231, 90); + this.buttonSetToFinish.Location = new System.Drawing.Point(1235, 93); this.buttonSetToFinish.Name = "buttonSetToFinish"; this.buttonSetToFinish.Size = new System.Drawing.Size(194, 49); this.buttonSetToFinish.TabIndex = 12; @@ -252,7 +76,7 @@ // // buttonCreateOrder // - this.buttonCreateOrder.Location = new System.Drawing.Point(1231, 35); + this.buttonCreateOrder.Location = new System.Drawing.Point(1235, 39); this.buttonCreateOrder.Name = "buttonCreateOrder"; this.buttonCreateOrder.Size = new System.Drawing.Size(194, 49); this.buttonCreateOrder.TabIndex = 9; @@ -267,7 +91,7 @@ this.dataGridView.Name = "dataGridView"; this.dataGridView.RowHeadersWidth = 51; this.dataGridView.RowTemplate.Height = 29; - this.dataGridView.Size = new System.Drawing.Size(1202, 407); + this.dataGridView.Size = new System.Drawing.Size(1215, 407); this.dataGridView.TabIndex = 8; // // menuStrip @@ -276,11 +100,12 @@ this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.справочникиToolStripMenuItem, this.отчетыToolStripMenuItem, - this.DoWorkToolStripMenuItem}); + this.DoWorkToolStripMenuItem, + this.MailToolStripMenuItem}); this.menuStrip.Location = new System.Drawing.Point(0, 0); this.menuStrip.Name = "menuStrip"; this.menuStrip.Padding = new System.Windows.Forms.Padding(6, 3, 0, 3); - this.menuStrip.Size = new System.Drawing.Size(1433, 30); + this.menuStrip.Size = new System.Drawing.Size(1441, 30); this.menuStrip.TabIndex = 7; this.menuStrip.Text = "Справочники"; // @@ -349,21 +174,18 @@ this.iceCreamComponentsToolStripMenuItem.Name = "iceCreamComponentsToolStripMenuItem"; this.iceCreamComponentsToolStripMenuItem.Size = new System.Drawing.Size(299, 26); this.iceCreamComponentsToolStripMenuItem.Text = "Список мороженых"; - this.iceCreamComponentsToolStripMenuItem.Click += new System.EventHandler(this.IceCreamsToolStripMenuItem_Click); // // iceCreamToolStripMenuItem // this.iceCreamToolStripMenuItem.Name = "iceCreamToolStripMenuItem"; this.iceCreamToolStripMenuItem.Size = new System.Drawing.Size(299, 26); this.iceCreamToolStripMenuItem.Text = "Мороженые с компонентами"; - this.iceCreamToolStripMenuItem.Click += new System.EventHandler(this.IceCreamComponentsToolStripMenuItem_Click); // // ordersToolStripMenuItem // this.ordersToolStripMenuItem.Name = "ordersToolStripMenuItem"; this.ordersToolStripMenuItem.Size = new System.Drawing.Size(299, 26); this.ordersToolStripMenuItem.Text = "Список заказов"; - this.ordersToolStripMenuItem.Click += new System.EventHandler(this.OrdersToolStripMenuItem_Click); // // listShopsToolStripMenuItem // @@ -393,11 +215,18 @@ this.DoWorkToolStripMenuItem.Text = "Запуск работ"; this.DoWorkToolStripMenuItem.Click += new System.EventHandler(this.DoWorkToolStripMenuItem_Click); // + // MailToolStripMenuItem + // + this.MailToolStripMenuItem.Name = "MailToolStripMenuItem"; + this.MailToolStripMenuItem.Size = new System.Drawing.Size(77, 24); + this.MailToolStripMenuItem.Text = "Письма"; + this.MailToolStripMenuItem.Click += new System.EventHandler(this.MailToolStripMenuItem_Click); + // // buttonSupplyShop // - this.buttonSupplyShop.Location = new System.Drawing.Point(1231, 292); + this.buttonSupplyShop.Location = new System.Drawing.Point(1235, 303); this.buttonSupplyShop.Name = "buttonSupplyShop"; - this.buttonSupplyShop.Size = new System.Drawing.Size(194, 44); + this.buttonSupplyShop.Size = new System.Drawing.Size(194, 49); this.buttonSupplyShop.TabIndex = 14; this.buttonSupplyShop.Text = "Пополнение магазина"; this.buttonSupplyShop.UseVisualStyleBackColor = true; @@ -405,9 +234,9 @@ // // SellIceCreamButton // - this.SellIceCreamButton.Location = new System.Drawing.Point(1231, 248); + this.SellIceCreamButton.Location = new System.Drawing.Point(1235, 358); this.SellIceCreamButton.Name = "SellIceCreamButton"; - this.SellIceCreamButton.Size = new System.Drawing.Size(194, 40); + this.SellIceCreamButton.Size = new System.Drawing.Size(194, 49); this.SellIceCreamButton.TabIndex = 15; this.SellIceCreamButton.Text = "Продажа мороженого"; this.SellIceCreamButton.UseVisualStyleBackColor = true; @@ -417,7 +246,7 @@ // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1433, 467); + this.ClientSize = new System.Drawing.Size(1441, 463); this.Controls.Add(this.SellIceCreamButton); this.Controls.Add(this.buttonSupplyShop); this.Controls.Add(this.buttonUpdate); @@ -425,7 +254,7 @@ this.Controls.Add(this.buttonCreateOrder); this.Controls.Add(this.dataGridView); this.Controls.Add(this.menuStrip); - this.Margin = new System.Windows.Forms.Padding(3, 5, 3, 5); + this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.Name = "FormMain"; this.Text = "Магазин мороженого"; this.Load += new System.EventHandler(this.FormMain_Load); @@ -435,7 +264,7 @@ this.ResumeLayout(false); this.PerformLayout(); - } + } #endregion @@ -454,28 +283,12 @@ private ToolStripMenuItem клиентыToolStripMenuItem; private ToolStripMenuItem ImplementersToolStripMenuItem; private ToolStripMenuItem DoWorkToolStripMenuItem; - private ToolStripMenuItem MailToolStripMenuItem; - } - private Button buttonUpdate; - private Button buttonSetToFinish; - private Button buttonCreateOrder; - private DataGridView dataGridView; - private MenuStrip menuStrip; - private ToolStripMenuItem справочникиToolStripMenuItem; - private ToolStripMenuItem компонентыToolStripMenuItem; - private ToolStripMenuItem мороженоеToolStripMenuItem; - private ToolStripMenuItem отчетыToolStripMenuItem; - private ToolStripMenuItem iceCreamComponentsToolStripMenuItem; - private ToolStripMenuItem iceCreamToolStripMenuItem; - private ToolStripMenuItem ordersToolStripMenuItem; - private ToolStripMenuItem клиентыToolStripMenuItem; - private ToolStripMenuItem ImplementersToolStripMenuItem; - private ToolStripMenuItem DoWorkToolStripMenuItem; - private ToolStripMenuItem магазиныToolStripMenuItem; + private ToolStripMenuItem магазиныToolStripMenuItem; + private ToolStripMenuItem listShopsToolStripMenuItem; + private ToolStripMenuItem shopWorkloadToolStripMenuItem; + private ToolStripMenuItem ordersByDateToolStripMenuItem; + private ToolStripMenuItem MailToolStripMenuItem; private Button buttonSupplyShop; private Button SellIceCreamButton; - private ToolStripMenuItem listShopsToolStripMenuItem; - private ToolStripMenuItem shopWorkloadToolStripMenuItem; - private ToolStripMenuItem ordersByDateToolStripMenuItem; } -} \ No newline at end of file +} diff --git a/IceCreamShop/IceCreamShop/FormMain.cs b/IceCreamShop/IceCreamShop/FormMain.cs index 935a5c6..77bef3b 100644 --- a/IceCreamShop/IceCreamShop/FormMain.cs +++ b/IceCreamShop/IceCreamShop/FormMain.cs @@ -146,15 +146,6 @@ namespace IceCreamShopView } } } - private void buttonCreateOrder_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder)); - if (service is FormCreateOrder form) - { - form.ShowDialog(); - LoadData(); - } - } private void buttonSetToFinish_Click(object sender, EventArgs e) { @@ -274,15 +265,6 @@ namespace IceCreamShopView } } - private void клиентыToolStripMenuItem_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormClients)); - if (service is FormClients form) - { - form.ShowDialog(); - } - } - private void ImplementersToolStripMenuItem_Click(object sender, EventArgs e) { var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); diff --git a/IceCreamShop/IceCreamShop/FormMain.resx b/IceCreamShop/IceCreamShop/FormMain.resx index 81a9e3d..1319e7f 100644 --- a/IceCreamShop/IceCreamShop/FormMain.resx +++ b/IceCreamShop/IceCreamShop/FormMain.resx @@ -60,4 +60,7 @@ 17, 17 + + 53 + \ No newline at end of file diff --git a/IceCreamShop/IceCreamShop/Program.cs b/IceCreamShop/IceCreamShop/Program.cs index f0ffa5b..3eb361e 100644 --- a/IceCreamShop/IceCreamShop/Program.cs +++ b/IceCreamShop/IceCreamShop/Program.cs @@ -101,14 +101,16 @@ namespace IceCreamShop services.AddTransient(); services.AddTransient(); services.AddTransient(); - } - private static void MailCheck(object obj) => ServiceProvider?.GetService()?.MailCheck(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + } + private static void MailCheck(object obj) => ServiceProvider?.GetService()?.MailCheck(); + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs b/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs index 82089f9..be9553f 100644 --- a/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs +++ b/IceCreamShop/IceCreamShopClientApp/Controllers/HomeController.cs @@ -152,7 +152,7 @@ namespace IceCreamShopClientApp.Controllers { return Redirect("~/Home/Enter"); } - return View(APIClient.GetRequest>($"api/client/getmessages?clientId={APIClient.Client.Id}")); + return View(); } [HttpGet] diff --git a/IceCreamShop/IceCreamShopClientApp/Views/Shared/_Layout.cshtml b/IceCreamShop/IceCreamShopClientApp/Views/Shared/_Layout.cshtml index 1f41ab8..717e1d0 100644 --- a/IceCreamShop/IceCreamShopClientApp/Views/Shared/_Layout.cshtml +++ b/IceCreamShop/IceCreamShopClientApp/Views/Shared/_Layout.cshtml @@ -10,6 +10,7 @@ +
diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabaseImplement.csproj b/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabaseImplement.csproj index 282a781..6e35912 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabaseImplement.csproj +++ b/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabaseImplement.csproj @@ -7,9 +7,9 @@ - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.Designer.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.Designer.cs deleted file mode 100644 index d32d702..0000000 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.Designer.cs +++ /dev/null @@ -1,298 +0,0 @@ -// -using System; -using IceCreamShopDatabaseImplement; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace IceCreamShopDatabaseImplement.Migrations -{ - [DbContext(typeof(IceCreamShopDatabase))] - [Migration("20230411104402_LabWork07_mail")] - partial class LabWork07_mail - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.3") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Client", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClientFIO") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Password") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Clients"); - }); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Component", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ComponentName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Cost") - .HasColumnType("float"); - - b.HasKey("Id"); - - b.ToTable("Components"); - }); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.IceCream", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("IceCreamName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Price") - .HasColumnType("float"); - - b.HasKey("Id"); - - b.ToTable("IceCreams"); - }); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.IceCreamComponent", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ComponentId") - .HasColumnType("int"); - - b.Property("Count") - .HasColumnType("int"); - - b.Property("IceCreamId") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("ComponentId"); - - b.HasIndex("IceCreamId"); - - b.ToTable("IceCreamComponents"); - }); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Implementer", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ImplementerFIO") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Password") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Qualification") - .HasColumnType("int"); - - b.Property("WorkExperience") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.ToTable("Implementers"); - }); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.MessageInfo", b => - { - b.Property("MessageId") - .HasColumnType("nvarchar(450)"); - - b.Property("Body") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("ClientId") - .HasColumnType("int"); - - b.Property("DateDelivery") - .HasColumnType("datetime2"); - - b.Property("SenderName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Subject") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("MessageId"); - - b.HasIndex("ClientId"); - - b.ToTable("Messages"); - }); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Order", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClientId") - .HasColumnType("int"); - - b.Property("Count") - .HasColumnType("int"); - - b.Property("DateCreate") - .HasColumnType("datetime2"); - - b.Property("DateImplement") - .HasColumnType("datetime2"); - - b.Property("IceCreamId") - .HasColumnType("int"); - - b.Property("ImplementerId") - .HasColumnType("int"); - - b.Property("Status") - .HasColumnType("int"); - - b.Property("Sum") - .HasColumnType("float"); - - b.HasKey("Id"); - - b.HasIndex("ClientId"); - - b.HasIndex("IceCreamId"); - - b.HasIndex("ImplementerId"); - - b.ToTable("Orders"); - }); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.IceCreamComponent", b => - { - b.HasOne("IceCreamShopDatabaseImplement.Models.Component", "Component") - .WithMany("IceCreamComponents") - .HasForeignKey("ComponentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("IceCreamShopDatabaseImplement.Models.IceCream", "IceCream") - .WithMany("Components") - .HasForeignKey("IceCreamId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Component"); - - b.Navigation("IceCream"); - }); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.MessageInfo", b => - { - b.HasOne("IceCreamShopDatabaseImplement.Models.Client", "Client") - .WithMany("Messages") - .HasForeignKey("ClientId"); - - b.Navigation("Client"); - }); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Order", b => - { - b.HasOne("IceCreamShopDatabaseImplement.Models.Client", "Client") - .WithMany("Orders") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("IceCreamShopDatabaseImplement.Models.IceCream", "IceCream") - .WithMany("Orders") - .HasForeignKey("IceCreamId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("IceCreamShopDatabaseImplement.Models.Implementer", "Implementer") - .WithMany("Orders") - .HasForeignKey("ImplementerId"); - - b.Navigation("Client"); - - b.Navigation("IceCream"); - - b.Navigation("Implementer"); - }); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Client", b => - { - b.Navigation("Messages"); - - b.Navigation("Orders"); - }); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Component", b => - { - b.Navigation("IceCreamComponents"); - }); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.IceCream", b => - { - b.Navigation("Components"); - - b.Navigation("Orders"); - }); - - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Implementer", b => - { - b.Navigation("Orders"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.cs deleted file mode 100644 index a12b1f8..0000000 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230411104402_LabWork07_mail.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace IceCreamShopDatabaseImplement.Migrations -{ - /// - public partial class LabWork07_mail : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Messages", - columns: table => new - { - MessageId = table.Column(type: "nvarchar(450)", nullable: false), - ClientId = table.Column(type: "int", nullable: true), - SenderName = table.Column(type: "nvarchar(max)", nullable: false), - DateDelivery = table.Column(type: "datetime2", nullable: false), - Subject = table.Column(type: "nvarchar(max)", nullable: false), - Body = table.Column(type: "nvarchar(max)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Messages", x => x.MessageId); - table.ForeignKey( - name: "FK_Messages_Clients_ClientId", - column: x => x.ClientId, - principalTable: "Clients", - principalColumn: "Id"); - }); - - migrationBuilder.CreateIndex( - name: "IX_Messages_ClientId", - table: "Messages", - column: "ClientId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Messages"); - } - } -} diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230425055945_lab6_migr.Designer.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230504152801_addsToMessage.Designer.cs similarity index 87% rename from IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230425055945_lab6_migr.Designer.cs rename to IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230504152801_addsToMessage.Designer.cs index 5405da0..1f8c13f 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230425055945_lab6_migr.Designer.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230504152801_addsToMessage.Designer.cs @@ -12,15 +12,15 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace IceCreamShopDatabaseImplement.Migrations { [DbContext(typeof(IceCreamShopDatabase))] - [Migration("20230425055945_lab6_migr")] - partial class lab6_migr + [Migration("20230504152801_addsToMessage")] + partial class addsToMessage { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "7.0.3") + .HasAnnotation("ProductVersion", "7.0.5") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -143,6 +143,42 @@ namespace IceCreamShopDatabaseImplement.Migrations b.ToTable("Implementers"); }); + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.MessageInfo", b => + { + b.Property("MessageId") + .HasColumnType("nvarchar(450)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("DateDelivery") + .HasColumnType("datetime2"); + + b.Property("HasRead") + .HasColumnType("bit"); + + b.Property("Reply") + .HasColumnType("nvarchar(max)"); + + b.Property("SenderName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("MessageId"); + + b.HasIndex("ClientId"); + + b.ToTable("Messages"); + }); + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Order", b => { b.Property("Id") @@ -263,6 +299,15 @@ namespace IceCreamShopDatabaseImplement.Migrations b.Navigation("IceCream"); }); + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.MessageInfo", b => + { + b.HasOne("IceCreamShopDatabaseImplement.Models.Client", "Client") + .WithMany("Messages") + .HasForeignKey("ClientId"); + + b.Navigation("Client"); + }); + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Order", b => { b.HasOne("IceCreamShopDatabaseImplement.Models.Client", "Client") @@ -316,6 +361,8 @@ namespace IceCreamShopDatabaseImplement.Migrations modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Client", b => { + b.Navigation("Messages"); + b.Navigation("Orders"); }); diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230425055945_lab6_migr.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230504152801_addsToMessage.cs similarity index 87% rename from IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230425055945_lab6_migr.cs rename to IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230504152801_addsToMessage.cs index de0125b..afcc170 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230425055945_lab6_migr.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/20230504152801_addsToMessage.cs @@ -6,7 +6,7 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace IceCreamShopDatabaseImplement.Migrations { /// - public partial class lab6_migr : Migration + public partial class addsToMessage : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) @@ -70,6 +70,29 @@ namespace IceCreamShopDatabaseImplement.Migrations table.PrimaryKey("PK_Implementers", x => x.Id); }); + migrationBuilder.CreateTable( + name: "Messages", + columns: table => new + { + MessageId = table.Column(type: "nvarchar(450)", nullable: false), + ClientId = table.Column(type: "int", nullable: true), + SenderName = table.Column(type: "nvarchar(max)", nullable: false), + DateDelivery = table.Column(type: "datetime2", nullable: false), + Subject = table.Column(type: "nvarchar(max)", nullable: false), + Body = table.Column(type: "nvarchar(max)", nullable: false), + HasRead = table.Column(type: "bit", nullable: false), + Reply = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Messages", x => x.MessageId); + table.ForeignKey( + name: "FK_Messages_Clients_ClientId", + column: x => x.ClientId, + principalTable: "Clients", + principalColumn: "Id"); + }); + migrationBuilder.CreateTable( name: "IceCreamComponents", columns: table => new @@ -193,6 +216,11 @@ namespace IceCreamShopDatabaseImplement.Migrations table: "IceCreamComponents", column: "IceCreamId"); + migrationBuilder.CreateIndex( + name: "IX_Messages_ClientId", + table: "Messages", + column: "ClientId"); + migrationBuilder.CreateIndex( name: "IX_Orders_ClientId", table: "Orders", @@ -230,6 +258,9 @@ namespace IceCreamShopDatabaseImplement.Migrations migrationBuilder.DropTable( name: "IceCreamComponents"); + migrationBuilder.DropTable( + name: "Messages"); + migrationBuilder.DropTable( name: "Orders"); diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs index 1094860..49d5f50 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs @@ -17,7 +17,7 @@ namespace IceCreamShopDatabaseImplement.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "7.0.3") + .HasAnnotation("ProductVersion", "7.0.5") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -155,6 +155,12 @@ namespace IceCreamShopDatabaseImplement.Migrations b.Property("DateDelivery") .HasColumnType("datetime2"); + b.Property("HasRead") + .HasColumnType("bit"); + + b.Property("Reply") + .HasColumnType("nvarchar(max)"); + b.Property("SenderName") .IsRequired() .HasColumnType("nvarchar(max)"); @@ -320,9 +326,18 @@ namespace IceCreamShopDatabaseImplement.Migrations b.Navigation("Client"); b.Navigation("IceCream"); - }); - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.ShopIcecream", b => + b.Navigation("Implementer"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Shop", b => + { + b.HasOne("IceCreamShopDatabaseImplement.Models.IceCream", null) + .WithMany("Shops") + .HasForeignKey("IceCreamId"); + }); + + modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.ShopIcecream", b => { b.HasOne("IceCreamShopDatabaseImplement.Models.IceCream", "IceCream") .WithMany() diff --git a/IceCreamShop/IceCreamShopRestApi/Controllers/ClientController.cs b/IceCreamShop/IceCreamShopRestApi/Controllers/ClientController.cs index 71f434c..3e60c42 100644 --- a/IceCreamShop/IceCreamShopRestApi/Controllers/ClientController.cs +++ b/IceCreamShop/IceCreamShopRestApi/Controllers/ClientController.cs @@ -16,6 +16,8 @@ namespace IceCreamShopRestApi.Controllers private readonly IMessageInfoLogic _mailLogic; + public int pageSize = 4; + public ClientController(IClientLogic logic, IMessageInfoLogic mailLogic, ILogger logger) { _logger = logger; @@ -70,13 +72,15 @@ namespace IceCreamShopRestApi.Controllers } [HttpGet] - public List? GetMessages(int clientId) + public List? GetMessages(int clientId, int page) { try { return _mailLogic.ReadList(new MessageInfoSearchModel { - ClientId = clientId + ClientId = clientId, + Page = page, + PageSize = pageSize }); } catch (Exception ex) -- 2.25.1 From 7e2a8252ee4465513d0cfd3f7ab7a01aec96210e Mon Sep 17 00:00:00 2001 From: Inohara Date: Fri, 5 May 2023 09:18:56 +0400 Subject: [PATCH 6/8] fix --- .../Models/IMessageInfoModel.cs | 3 ++- .../IceCreamBusinessLogic.dll | Bin 0 -> 74752 bytes .../IceCreamShopDatabaseImplement.dll | Bin 0 -> 83968 bytes .../IceCreamShopFileImplement.dll | Bin 0 -> 40960 bytes 4 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 IceCreamShop/ImplementationExtensions/IceCreamBusinessLogic.dll create mode 100644 IceCreamShop/ImplementationExtensions/IceCreamShopDatabaseImplement.dll create mode 100644 IceCreamShop/ImplementationExtensions/IceCreamShopFileImplement.dll diff --git a/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs b/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs index ac4fccb..bf97976 100644 --- a/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs +++ b/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs @@ -8,6 +8,7 @@ DateTime DateDelivery { get; } string Subject { get; } string Body { get; } - + public bool HasRead { get; } + public string? Reply { get; } } } diff --git a/IceCreamShop/ImplementationExtensions/IceCreamBusinessLogic.dll b/IceCreamShop/ImplementationExtensions/IceCreamBusinessLogic.dll new file mode 100644 index 0000000000000000000000000000000000000000..ac6ff6f043b47d2ab900de5b68629261af2ce694 GIT binary patch literal 74752 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 literal 0 HcmV?d00001 diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopDatabaseImplement.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopDatabaseImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..95af66a2826254594ec9da6a0d16646adbcb46b2 GIT binary patch literal 83968 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 No1^`t^#7*?{ue@0`3wL6 literal 0 HcmV?d00001 diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopFileImplement.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopFileImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..763c65183ee8dbf68ec087bd7e0e3240e9c9c185 GIT binary patch literal 40960 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 Date: Tue, 16 May 2023 09:46:19 +0400 Subject: [PATCH 7/8] fix --- .../Migrations/IceCreamShopDatabaseModelSnapshot.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs index a5ad3e0..694ada9 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Migrations/IceCreamShopDatabaseModelSnapshot.cs @@ -326,18 +326,10 @@ namespace IceCreamShopDatabaseImplement.Migrations b.Navigation("Client"); b.Navigation("IceCream"); - }); b.Navigation("Implementer"); }); - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.Shop", b => - { - b.HasOne("IceCreamShopDatabaseImplement.Models.IceCream", null) - .WithMany("Shops") - .HasForeignKey("IceCreamId"); - }); - modelBuilder.Entity("IceCreamShopDatabaseImplement.Models.ShopIcecream", b => { b.HasOne("IceCreamShopDatabaseImplement.Models.IceCream", "IceCream") -- 2.25.1 From 9e955aa89ffda81458874b722202893b0f9247bc Mon Sep 17 00:00:00 2001 From: Ino Date: Tue, 16 May 2023 10:25:54 +0400 Subject: [PATCH 8/8] =?UTF-8?q?=D1=83=D0=BB=D1=8C=D1=82=D1=80=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ .../IceCreamBusinessLogic.dll | Bin 74752 -> 0 bytes .../IceCreamShopDatabaseImplement.dll | Bin 83968 -> 0 bytes .../IceCreamShopFileImplement.dll | Bin 40960 -> 0 bytes 4 files changed, 3 insertions(+) delete mode 100644 IceCreamShop/ImplementationExtensions/IceCreamBusinessLogic.dll delete mode 100644 IceCreamShop/ImplementationExtensions/IceCreamShopDatabaseImplement.dll delete mode 100644 IceCreamShop/ImplementationExtensions/IceCreamShopFileImplement.dll diff --git a/.gitignore b/.gitignore index ca1c7a3..52737dc 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,9 @@ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs +# dll файлы +*.dll + # Mono auto generated files mono_crash.* diff --git a/IceCreamShop/ImplementationExtensions/IceCreamBusinessLogic.dll b/IceCreamShop/ImplementationExtensions/IceCreamBusinessLogic.dll deleted file mode 100644 index ac6ff6f043b47d2ab900de5b68629261af2ce694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74752 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 diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopDatabaseImplement.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopDatabaseImplement.dll deleted file mode 100644 index 95af66a2826254594ec9da6a0d16646adbcb46b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83968 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 No1^`t^#7*?{ue@0`3wL6 diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopFileImplement.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopFileImplement.dll deleted file mode 100644 index 763c65183ee8dbf68ec087bd7e0e3240e9c9c185..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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