From 3aac57471ba0c24a2a58808e54a9bb6fb228f070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=A4=D0=B5=D0=B4=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Thu, 16 May 2024 18:05:13 +0400 Subject: [PATCH] Base.02 --- .../Controllers/HomeController.cs | 8 + Diner/DinerClientApp/Views/Home/Mails.cshtml | 52 ++++ .../Views/Shared/_Layout.cshtml | 3 + .../BindingModels/MailConfigBindingModel.cs | 17 ++ .../BindingModels/MailSendInfoBindingModel.cs | 13 + .../BusinessLogicsContracts/IClientLogic.cs | 2 +- ...baseBy6Work.cs => DinerDatabaseBy7Work.cs} | 4 +- .../Implements/ClientStorage.cs | 12 +- .../Implements/FoodStorage.cs | 12 +- .../Implements/ImplementerStorage.cs | 12 +- .../Implements/MessageInfoStorage.cs | 13 +- .../Implements/OrderStorage.cs | 12 +- .../Implements/SnackStorage.cs | 12 +- .../20240513154945_InitMigration.Designer.cs | 260 ------------------ .../20240513162929_Migration01.Designer.cs | 257 ----------------- .../Migrations/20240513162929_Migration01.cs | 59 ---- .../Migrations/20240515115440_Migration02.cs | 29 -- .../20240515121617_Migration03.Designer.cs | 257 ----------------- .../Migrations/20240515121617_Migration03.cs | 29 -- ... 20240516122239_InitMigration.Designer.cs} | 49 +++- ...ion.cs => 20240516122239_InitMigration.cs} | 34 ++- ...s => DinerDatabaseBy7WorkModelSnapshot.cs} | 55 +++- .../Models/MessageInfo.cs | 11 +- Diner/DinerDataBaseImplement/Models/Order.cs | 1 - Diner/DinerDataBaseImplement/Models/Snack.cs | 4 +- .../Controllers/ClientController.cs | 19 +- Diner/DinerRestAPI/Program.cs | 19 +- Diner/DinerRestAPI/appsettings.json | 9 +- Diner/DinerView/App.config | 11 + Diner/DinerView/DinerView.csproj | 6 + Diner/DinerView/FormMail.Designer.cs | 57 ++++ Diner/DinerView/FormMail.cs | 42 +++ Diner/DinerView/FormMail.resx | 120 ++++++++ Diner/DinerView/FormMain.Designer.cs | 11 +- Diner/DinerView/FormMain.cs | 7 + Diner/DinerView/Program.cs | 30 +- .../BusinessLogic/ClientLogic.cs | 2 +- .../BusinessLogic/MessageInfoLogic.cs | 6 - .../BusinessLogic/OrderLogic.cs | 36 ++- .../DineryBusinessLogic.csproj | 1 + .../MailWorker/AbstractMailWorker.cs | 77 ++++++ .../MailWorker/MailKitWorker.cs | 73 +++++ 42 files changed, 762 insertions(+), 981 deletions(-) create mode 100644 Diner/DinerClientApp/Views/Home/Mails.cshtml create mode 100644 Diner/DinerContracts/BindingModels/MailConfigBindingModel.cs create mode 100644 Diner/DinerContracts/BindingModels/MailSendInfoBindingModel.cs rename Diner/DinerDataBaseImplement/{DinerDatabaseBy6Work.cs => DinerDatabaseBy7Work.cs} (88%) delete mode 100644 Diner/DinerDataBaseImplement/Migrations/20240513154945_InitMigration.Designer.cs delete mode 100644 Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.Designer.cs delete mode 100644 Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.cs delete mode 100644 Diner/DinerDataBaseImplement/Migrations/20240515115440_Migration02.cs delete mode 100644 Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.Designer.cs delete mode 100644 Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.cs rename Diner/DinerDataBaseImplement/Migrations/{20240515115440_Migration02.Designer.cs => 20240516122239_InitMigration.Designer.cs} (86%) rename Diner/DinerDataBaseImplement/Migrations/{20240513154945_InitMigration.cs => 20240516122239_InitMigration.cs} (84%) rename Diner/DinerDataBaseImplement/Migrations/{DinerDatabaseBy6WorkModelSnapshot.cs => DinerDatabaseBy7WorkModelSnapshot.cs} (81%) create mode 100644 Diner/DinerView/App.config create mode 100644 Diner/DinerView/FormMail.Designer.cs create mode 100644 Diner/DinerView/FormMail.cs create mode 100644 Diner/DinerView/FormMail.resx create mode 100644 Diner/DineryBusinessLogic/MailWorker/AbstractMailWorker.cs create mode 100644 Diner/DineryBusinessLogic/MailWorker/MailKitWorker.cs diff --git a/Diner/DinerClientApp/Controllers/HomeController.cs b/Diner/DinerClientApp/Controllers/HomeController.cs index 77c5f5c..ec6da49 100644 --- a/Diner/DinerClientApp/Controllers/HomeController.cs +++ b/Diner/DinerClientApp/Controllers/HomeController.cs @@ -118,5 +118,13 @@ namespace DinerClientApp.Controllers { var _snack = APIClient.GetRequest($"api/main/getproduct?snackid={snack}"); return count * (_snack?.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}")); + } } } diff --git a/Diner/DinerClientApp/Views/Home/Mails.cshtml b/Diner/DinerClientApp/Views/Home/Mails.cshtml new file mode 100644 index 0000000..47df446 --- /dev/null +++ b/Diner/DinerClientApp/Views/Home/Mails.cshtml @@ -0,0 +1,52 @@ +@using DinerContracts.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/Diner/DinerClientApp/Views/Shared/_Layout.cshtml b/Diner/DinerClientApp/Views/Shared/_Layout.cshtml index 3ae117a..372a521 100644 --- a/Diner/DinerClientApp/Views/Shared/_Layout.cshtml +++ b/Diner/DinerClientApp/Views/Shared/_Layout.cshtml @@ -27,6 +27,9 @@ + diff --git a/Diner/DinerContracts/BindingModels/MailConfigBindingModel.cs b/Diner/DinerContracts/BindingModels/MailConfigBindingModel.cs new file mode 100644 index 0000000..ba5bc74 --- /dev/null +++ b/Diner/DinerContracts/BindingModels/MailConfigBindingModel.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DinerContracts.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; } + + } +} diff --git a/Diner/DinerContracts/BindingModels/MailSendInfoBindingModel.cs b/Diner/DinerContracts/BindingModels/MailSendInfoBindingModel.cs new file mode 100644 index 0000000..76ac72c --- /dev/null +++ b/Diner/DinerContracts/BindingModels/MailSendInfoBindingModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DinerContracts.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; + } +} diff --git a/Diner/DinerContracts/BusinessLogicsContracts/IClientLogic.cs b/Diner/DinerContracts/BusinessLogicsContracts/IClientLogic.cs index 3f80a28..6add471 100644 --- a/Diner/DinerContracts/BusinessLogicsContracts/IClientLogic.cs +++ b/Diner/DinerContracts/BusinessLogicsContracts/IClientLogic.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace DinerContracts.BusinessLogicsContracts { public interface IClientLogic { List? ReadList(ClientSearchModel? model); - ClientViewModel? ReadELement(ClientSearchModel model); + ClientViewModel? ReadElement(ClientSearchModel model); bool Create(ClientBindingModel model); bool Update(ClientBindingModel model); diff --git a/Diner/DinerDataBaseImplement/DinerDatabaseBy6Work.cs b/Diner/DinerDataBaseImplement/DinerDatabaseBy7Work.cs similarity index 88% rename from Diner/DinerDataBaseImplement/DinerDatabaseBy6Work.cs rename to Diner/DinerDataBaseImplement/DinerDatabaseBy7Work.cs index 9f084e5..f8408a6 100644 --- a/Diner/DinerDataBaseImplement/DinerDatabaseBy6Work.cs +++ b/Diner/DinerDataBaseImplement/DinerDatabaseBy7Work.cs @@ -3,11 +3,11 @@ using Microsoft.EntityFrameworkCore; namespace DinerDataBaseImplement { - public class DinerDatabaseBy6Work : DbContext + public class DinerDatabaseBy7Work : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (optionsBuilder.IsConfigured == false) { - optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-O0N00SH\SQLEXPRESS;Initial Catalog=DinerDatabaseBy6Work;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); + optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-O0N00SH\SQLEXPRESS;Initial Catalog=DinerDatabaseBy7Work;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); } base.OnConfiguring(optionsBuilder); } diff --git a/Diner/DinerDataBaseImplement/Implements/ClientStorage.cs b/Diner/DinerDataBaseImplement/Implements/ClientStorage.cs index c1d9cb2..dac1b1e 100644 --- a/Diner/DinerDataBaseImplement/Implements/ClientStorage.cs +++ b/Diner/DinerDataBaseImplement/Implements/ClientStorage.cs @@ -18,7 +18,7 @@ namespace DinerDataBaseImplement.Implements { if (newClient == null) { return null; } - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); context.Clients.Add(newClient); context.SaveChanges(); @@ -29,7 +29,7 @@ namespace DinerDataBaseImplement.Implements { } public ClientViewModel? Update(ClientBindingModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); var client = context.Clients.FirstOrDefault(x => x.ID == model.ID); if (client == null) { return null; @@ -40,7 +40,7 @@ namespace DinerDataBaseImplement.Implements { } public ClientViewModel? Delete(ClientBindingModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); var element = context.Clients.FirstOrDefault(x => x.ID == model.ID); if (element != null) { context.Clients.Remove(element); @@ -51,7 +51,7 @@ namespace DinerDataBaseImplement.Implements { } public ClientViewModel? GetElement(ClientSearchModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); if (model.ID.HasValue) { return context.Clients .Include(x => x.Orders) @@ -71,7 +71,7 @@ namespace DinerDataBaseImplement.Implements { if (string.IsNullOrEmpty(model.ClientFIO)) { return new(); } - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.Clients .Include(x => x.Orders) @@ -81,7 +81,7 @@ namespace DinerDataBaseImplement.Implements { } public List GetFullList() { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.Clients .Include(x => x.Orders) diff --git a/Diner/DinerDataBaseImplement/Implements/FoodStorage.cs b/Diner/DinerDataBaseImplement/Implements/FoodStorage.cs index df26f66..5eb0f7d 100644 --- a/Diner/DinerDataBaseImplement/Implements/FoodStorage.cs +++ b/Diner/DinerDataBaseImplement/Implements/FoodStorage.cs @@ -16,7 +16,7 @@ namespace DinerDataBaseImplement.Implements { public FoodViewModel? Delete(FoodBindingModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); var element = context.Components.FirstOrDefault(x => x.ID == model.ID); if (element != null) { @@ -32,7 +32,7 @@ namespace DinerDataBaseImplement.Implements if (string.IsNullOrEmpty(model.ComponentName) && !model.ID.HasValue) { return null; } - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.Components .FirstOrDefault(x => (!string.IsNullOrEmpty(model.ComponentName) && x.ComponentName == model.ComponentName) || model.ID.HasValue && @@ -45,7 +45,7 @@ namespace DinerDataBaseImplement.Implements return new(); } - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.Components.Where(x => x.ComponentName.Contains(model.ComponentName)) .Select(x => x.GetViewModel).ToList(); @@ -53,7 +53,7 @@ namespace DinerDataBaseImplement.Implements public List GetFullList() { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.Components.Select(x => x.GetViewModel).ToList(); } @@ -63,7 +63,7 @@ namespace DinerDataBaseImplement.Implements if (newComponent == null) { return null; } - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); context.Components.Add(newComponent); context.SaveChanges(); return newComponent.GetViewModel; @@ -71,7 +71,7 @@ namespace DinerDataBaseImplement.Implements public FoodViewModel? Update(FoodBindingModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); var component = context.Components.FirstOrDefault(x => x.ID == model.ID); if (component == null) { return null; diff --git a/Diner/DinerDataBaseImplement/Implements/ImplementerStorage.cs b/Diner/DinerDataBaseImplement/Implements/ImplementerStorage.cs index 8ec23a4..408c51f 100644 --- a/Diner/DinerDataBaseImplement/Implements/ImplementerStorage.cs +++ b/Diner/DinerDataBaseImplement/Implements/ImplementerStorage.cs @@ -19,7 +19,7 @@ namespace DinerDataBaseImplement.Implements { if (newImplementer == null) { return null; } - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); context.Implementers.Add(newImplementer); context.SaveChanges(); @@ -30,7 +30,7 @@ namespace DinerDataBaseImplement.Implements { } public ImplementerViewModel? Update(ImplementerBindingModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); var implementer = context.Implementers.FirstOrDefault(x => x.ID == model.ID); if (implementer == null) { return null; @@ -41,7 +41,7 @@ namespace DinerDataBaseImplement.Implements { } public ImplementerViewModel? Delete(ImplementerBindingModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); var element = context.Implementers.FirstOrDefault(x => x.ID == model.ID); if (element != null) { context.Implementers.Remove(element); @@ -52,7 +52,7 @@ namespace DinerDataBaseImplement.Implements { } public ImplementerViewModel? GetElement(ImplementerSearchModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); if (model.ID.HasValue) { return context.Implementers .Include(x => x.Orders) @@ -66,7 +66,7 @@ namespace DinerDataBaseImplement.Implements { if (string.IsNullOrEmpty(model.ImplementerFIO)) { return new(); } - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.Implementers .Include(x => x.Orders) @@ -76,7 +76,7 @@ namespace DinerDataBaseImplement.Implements { } public List GetFullList() { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.Implementers .Include(x => x.Orders) diff --git a/Diner/DinerDataBaseImplement/Implements/MessageInfoStorage.cs b/Diner/DinerDataBaseImplement/Implements/MessageInfoStorage.cs index 8f2bb8f..1456ca3 100644 --- a/Diner/DinerDataBaseImplement/Implements/MessageInfoStorage.cs +++ b/Diner/DinerDataBaseImplement/Implements/MessageInfoStorage.cs @@ -13,7 +13,7 @@ namespace DinerDataBaseImplement.Implements { public class MessageInfoStorage : IMessageInfoStorage { public MessageInfoViewModel? Insert(MessageInfoBindingModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); var newMessageInfo = MessageInfo.Create(context, model); if (newMessageInfo == null) { return null; @@ -24,7 +24,7 @@ namespace DinerDataBaseImplement.Implements { } public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); if (!string.IsNullOrEmpty(model.MessageID)) { return context.MessageInfos.FirstOrDefault(x => string.IsNullOrEmpty(model.MessageID) && model.MessageID == x.MessageID)?.GetViewModel; @@ -33,17 +33,14 @@ namespace DinerDataBaseImplement.Implements { } public List GetFilteredList(MessageInfoSearchModel model) { - if (string.IsNullOrEmpty(model.MessageID)) { - return new(); - } - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.MessageInfos. - Where(x => x.MessageID.Contains(model.MessageID)).Select(x => x.GetViewModel).ToList(); + Where(x => x.ClientID == model.ClientID).Select(x => x.GetViewModel).ToList(); } public List GetFullList() { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.MessageInfos.Select(x => x.GetViewModel).ToList(); } } diff --git a/Diner/DinerDataBaseImplement/Implements/OrderStorage.cs b/Diner/DinerDataBaseImplement/Implements/OrderStorage.cs index 016959e..232a59c 100644 --- a/Diner/DinerDataBaseImplement/Implements/OrderStorage.cs +++ b/Diner/DinerDataBaseImplement/Implements/OrderStorage.cs @@ -16,7 +16,7 @@ namespace DinerDataBaseImplement.Implements { public OrderViewModel? Delete(OrderBindingModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); var element = context.Orders.FirstOrDefault(x => x.ID == model.ID); if (element != null) { @@ -32,7 +32,7 @@ namespace DinerDataBaseImplement.Implements if (!model.ID.HasValue) { return null; } - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.Orders.Include(x => x.Snack) .Include(x => x.Client) .FirstOrDefault(x => model.ID.HasValue && x.ID == model.ID)?.GetViewModel; @@ -41,7 +41,7 @@ namespace DinerDataBaseImplement.Implements public List GetFilteredList(OrderSearchModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); if (!model.ID.HasValue && model.DateFrom.HasValue && model.DateTo.HasValue) { return context.Orders .Include(x => x.Snack) @@ -80,13 +80,13 @@ namespace DinerDataBaseImplement.Implements public List GetFullList() { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.Orders.Include(x => x.Snack).Include(x => x.Client).Include(x => x.Implementer) .Select(x => x.GetViewModel).ToList(); } public OrderViewModel? Insert(OrderBindingModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); var newOrder = Order.Create(model); if (newOrder == null) { return null; @@ -98,7 +98,7 @@ namespace DinerDataBaseImplement.Implements .FirstOrDefault(x => x.ID == newOrder.ID)?.GetViewModel; } public OrderViewModel? Update(OrderBindingModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); var order = context.Orders.FirstOrDefault(x => x.ID == model.ID); if (order == null) { return null; } order.Update(model); diff --git a/Diner/DinerDataBaseImplement/Implements/SnackStorage.cs b/Diner/DinerDataBaseImplement/Implements/SnackStorage.cs index 605e770..12523ee 100644 --- a/Diner/DinerDataBaseImplement/Implements/SnackStorage.cs +++ b/Diner/DinerDataBaseImplement/Implements/SnackStorage.cs @@ -17,7 +17,7 @@ namespace DinerDataBaseImplement.Implements { public SnackViewModel? Delete(SnackBindingModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); var element = context.Snacks .Include(x => x.Components) .Include(x => x.Orders) @@ -36,7 +36,7 @@ namespace DinerDataBaseImplement.Implements if (string.IsNullOrEmpty(model.ProductName) && !model.ID.HasValue) { return null; } - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.Snacks .Include(x => x.Components) .ThenInclude(x => x.Component) @@ -50,7 +50,7 @@ namespace DinerDataBaseImplement.Implements if (string.IsNullOrEmpty(model.ProductName)) { return new(); } - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.Snacks .Include(x => x.Components) .ThenInclude(x => x.Component) @@ -61,7 +61,7 @@ namespace DinerDataBaseImplement.Implements public List GetFullList() { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); return context.Snacks .Include(x => x.Components) .ThenInclude(x => x.Component).ToList() @@ -70,7 +70,7 @@ namespace DinerDataBaseImplement.Implements public SnackViewModel? Insert(SnackBindingModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); var newProduct = Snack.Create(context, model); if (newProduct == null) { return null; @@ -82,7 +82,7 @@ namespace DinerDataBaseImplement.Implements public SnackViewModel? Update(SnackBindingModel model) { - using var context = new DinerDatabaseBy6Work(); + using var context = new DinerDatabaseBy7Work(); using var transcation = context.Database.BeginTransaction(); try { diff --git a/Diner/DinerDataBaseImplement/Migrations/20240513154945_InitMigration.Designer.cs b/Diner/DinerDataBaseImplement/Migrations/20240513154945_InitMigration.Designer.cs deleted file mode 100644 index 97a8c40..0000000 --- a/Diner/DinerDataBaseImplement/Migrations/20240513154945_InitMigration.Designer.cs +++ /dev/null @@ -1,260 +0,0 @@ -// -using System; -using DinerDataBaseImplement; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace DinerDataBaseImplement.Migrations -{ - [DbContext(typeof(DinerDatabaseBy6Work))] - [Migration("20240513154945_InitMigration")] - partial class InitMigration - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.3") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("DinerDataBaseImplement.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("DinerDataBaseImplement.Models.Food", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); - - b.Property("ComponentName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Price") - .HasColumnType("float"); - - b.HasKey("ID"); - - b.ToTable("Components"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.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("DinerDataBaseImplement.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("ImplementerID") - .IsRequired() - .HasColumnType("int"); - - b.Property("SnackID") - .HasColumnType("int"); - - b.Property("Status") - .HasColumnType("int"); - - b.Property("Sum") - .HasColumnType("float"); - - b.HasKey("ID"); - - b.HasIndex("ClientID"); - - b.HasIndex("ImplementerID"); - - b.HasIndex("SnackID"); - - b.ToTable("Orders"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); - - b.Property("Price") - .HasColumnType("float"); - - b.Property("ProductName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("ID"); - - b.ToTable("Snacks"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); - - b.Property("ComponentID") - .HasColumnType("int"); - - b.Property("Count") - .HasColumnType("int"); - - b.Property("SnackID") - .HasColumnType("int"); - - b.HasKey("ID"); - - b.HasIndex("ComponentID"); - - b.HasIndex("SnackID"); - - b.ToTable("ProductComponents"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => - { - b.HasOne("DinerDataBaseImplement.Models.Client", "Client") - .WithMany("Orders") - .HasForeignKey("ClientID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DinerDataBaseImplement.Models.Implementer", "Implementer") - .WithMany("Orders") - .HasForeignKey("ImplementerID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DinerDataBaseImplement.Models.Snack", "Snack") - .WithMany("Orders") - .HasForeignKey("SnackID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Client"); - - b.Navigation("Implementer"); - - b.Navigation("Snack"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b => - { - b.HasOne("DinerDataBaseImplement.Models.Food", "Component") - .WithMany("SnackFood") - .HasForeignKey("ComponentID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DinerDataBaseImplement.Models.Snack", "Product") - .WithMany("Components") - .HasForeignKey("SnackID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Component"); - - b.Navigation("Product"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Client", b => - { - b.Navigation("Orders"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b => - { - b.Navigation("SnackFood"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => - { - b.Navigation("Orders"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => - { - b.Navigation("Components"); - - b.Navigation("Orders"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.Designer.cs b/Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.Designer.cs deleted file mode 100644 index e9272b3..0000000 --- a/Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.Designer.cs +++ /dev/null @@ -1,257 +0,0 @@ -// -using System; -using DinerDataBaseImplement; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace DinerDataBaseImplement.Migrations -{ - [DbContext(typeof(DinerDatabaseBy6Work))] - [Migration("20240513162929_Migration01")] - partial class Migration01 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.3") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("DinerDataBaseImplement.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("DinerDataBaseImplement.Models.Food", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); - - b.Property("ComponentName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Price") - .HasColumnType("float"); - - b.HasKey("ID"); - - b.ToTable("Components"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.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("DinerDataBaseImplement.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("ImplementerID") - .HasColumnType("int"); - - b.Property("SnackID") - .HasColumnType("int"); - - b.Property("Status") - .HasColumnType("int"); - - b.Property("Sum") - .HasColumnType("float"); - - b.HasKey("ID"); - - b.HasIndex("ClientID"); - - b.HasIndex("ImplementerID"); - - b.HasIndex("SnackID"); - - b.ToTable("Orders"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); - - b.Property("Price") - .HasColumnType("float"); - - b.Property("ProductName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("ID"); - - b.ToTable("Snacks"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); - - b.Property("ComponentID") - .HasColumnType("int"); - - b.Property("Count") - .HasColumnType("int"); - - b.Property("SnackID") - .HasColumnType("int"); - - b.HasKey("ID"); - - b.HasIndex("ComponentID"); - - b.HasIndex("SnackID"); - - b.ToTable("ProductComponents"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => - { - b.HasOne("DinerDataBaseImplement.Models.Client", "Client") - .WithMany("Orders") - .HasForeignKey("ClientID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DinerDataBaseImplement.Models.Implementer", "Implementer") - .WithMany("Orders") - .HasForeignKey("ImplementerID"); - - b.HasOne("DinerDataBaseImplement.Models.Snack", "Snack") - .WithMany("Orders") - .HasForeignKey("SnackID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Client"); - - b.Navigation("Implementer"); - - b.Navigation("Snack"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b => - { - b.HasOne("DinerDataBaseImplement.Models.Food", "Component") - .WithMany("SnackFood") - .HasForeignKey("ComponentID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DinerDataBaseImplement.Models.Snack", "Product") - .WithMany("Components") - .HasForeignKey("SnackID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Component"); - - b.Navigation("Product"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Client", b => - { - b.Navigation("Orders"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b => - { - b.Navigation("SnackFood"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => - { - b.Navigation("Orders"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => - { - b.Navigation("Components"); - - b.Navigation("Orders"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.cs b/Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.cs deleted file mode 100644 index 8f20dcb..0000000 --- a/Diner/DinerDataBaseImplement/Migrations/20240513162929_Migration01.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace DinerDataBaseImplement.Migrations -{ - /// - public partial class Migration01 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Orders_Implementers_ImplementerID", - table: "Orders"); - - migrationBuilder.AlterColumn( - name: "ImplementerID", - table: "Orders", - type: "int", - nullable: true, - oldClrType: typeof(int), - oldType: "int"); - - migrationBuilder.AddForeignKey( - name: "FK_Orders_Implementers_ImplementerID", - table: "Orders", - column: "ImplementerID", - principalTable: "Implementers", - principalColumn: "ID"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Orders_Implementers_ImplementerID", - table: "Orders"); - - migrationBuilder.AlterColumn( - name: "ImplementerID", - table: "Orders", - type: "int", - nullable: false, - defaultValue: 0, - oldClrType: typeof(int), - oldType: "int", - oldNullable: true); - - migrationBuilder.AddForeignKey( - name: "FK_Orders_Implementers_ImplementerID", - table: "Orders", - column: "ImplementerID", - principalTable: "Implementers", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - } - } -} diff --git a/Diner/DinerDataBaseImplement/Migrations/20240515115440_Migration02.cs b/Diner/DinerDataBaseImplement/Migrations/20240515115440_Migration02.cs deleted file mode 100644 index ba3258d..0000000 --- a/Diner/DinerDataBaseImplement/Migrations/20240515115440_Migration02.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace DinerDataBaseImplement.Migrations -{ - /// - public partial class Migration02 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "ProductName", - table: "Orders", - type: "nvarchar(max)", - nullable: false, - defaultValue: ""); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "ProductName", - table: "Orders"); - } - } -} diff --git a/Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.Designer.cs b/Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.Designer.cs deleted file mode 100644 index 8070078..0000000 --- a/Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.Designer.cs +++ /dev/null @@ -1,257 +0,0 @@ -// -using System; -using DinerDataBaseImplement; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace DinerDataBaseImplement.Migrations -{ - [DbContext(typeof(DinerDatabaseBy6Work))] - [Migration("20240515121617_Migration03")] - partial class Migration03 - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.3") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("DinerDataBaseImplement.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("DinerDataBaseImplement.Models.Food", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); - - b.Property("ComponentName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Price") - .HasColumnType("float"); - - b.HasKey("ID"); - - b.ToTable("Components"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.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("DinerDataBaseImplement.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("ImplementerID") - .HasColumnType("int"); - - b.Property("SnackID") - .HasColumnType("int"); - - b.Property("Status") - .HasColumnType("int"); - - b.Property("Sum") - .HasColumnType("float"); - - b.HasKey("ID"); - - b.HasIndex("ClientID"); - - b.HasIndex("ImplementerID"); - - b.HasIndex("SnackID"); - - b.ToTable("Orders"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); - - b.Property("Price") - .HasColumnType("float"); - - b.Property("ProductName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("ID"); - - b.ToTable("Snacks"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ID")); - - b.Property("ComponentID") - .HasColumnType("int"); - - b.Property("Count") - .HasColumnType("int"); - - b.Property("SnackID") - .HasColumnType("int"); - - b.HasKey("ID"); - - b.HasIndex("ComponentID"); - - b.HasIndex("SnackID"); - - b.ToTable("ProductComponents"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => - { - b.HasOne("DinerDataBaseImplement.Models.Client", "Client") - .WithMany("Orders") - .HasForeignKey("ClientID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DinerDataBaseImplement.Models.Implementer", "Implementer") - .WithMany("Orders") - .HasForeignKey("ImplementerID"); - - b.HasOne("DinerDataBaseImplement.Models.Snack", "Snack") - .WithMany("Orders") - .HasForeignKey("SnackID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Client"); - - b.Navigation("Implementer"); - - b.Navigation("Snack"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b => - { - b.HasOne("DinerDataBaseImplement.Models.Food", "Component") - .WithMany("SnackFood") - .HasForeignKey("ComponentID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("DinerDataBaseImplement.Models.Snack", "Product") - .WithMany("Components") - .HasForeignKey("SnackID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Component"); - - b.Navigation("Product"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Client", b => - { - b.Navigation("Orders"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b => - { - b.Navigation("SnackFood"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => - { - b.Navigation("Orders"); - }); - - modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => - { - b.Navigation("Components"); - - b.Navigation("Orders"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.cs b/Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.cs deleted file mode 100644 index 972c43c..0000000 --- a/Diner/DinerDataBaseImplement/Migrations/20240515121617_Migration03.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace DinerDataBaseImplement.Migrations -{ - /// - public partial class Migration03 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "ProductName", - table: "Orders"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "ProductName", - table: "Orders", - type: "nvarchar(max)", - nullable: false, - defaultValue: ""); - } - } -} diff --git a/Diner/DinerDataBaseImplement/Migrations/20240515115440_Migration02.Designer.cs b/Diner/DinerDataBaseImplement/Migrations/20240516122239_InitMigration.Designer.cs similarity index 86% rename from Diner/DinerDataBaseImplement/Migrations/20240515115440_Migration02.Designer.cs rename to Diner/DinerDataBaseImplement/Migrations/20240516122239_InitMigration.Designer.cs index e7af826..1ab9de4 100644 --- a/Diner/DinerDataBaseImplement/Migrations/20240515115440_Migration02.Designer.cs +++ b/Diner/DinerDataBaseImplement/Migrations/20240516122239_InitMigration.Designer.cs @@ -11,9 +11,9 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace DinerDataBaseImplement.Migrations { - [DbContext(typeof(DinerDatabaseBy6Work))] - [Migration("20240515115440_Migration02")] - partial class Migration02 + [DbContext(typeof(DinerDatabaseBy7Work))] + [Migration("20240516122239_InitMigration")] + partial class InitMigration { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -97,6 +97,36 @@ namespace DinerDataBaseImplement.Migrations b.ToTable("Implementers"); }); + modelBuilder.Entity("DinerDataBaseImplement.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("MessageInfos"); + }); + modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => { b.Property("ID") @@ -120,10 +150,6 @@ namespace DinerDataBaseImplement.Migrations b.Property("ImplementerID") .HasColumnType("int"); - b.Property("ProductName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - b.Property("SnackID") .HasColumnType("int"); @@ -190,6 +216,15 @@ namespace DinerDataBaseImplement.Migrations b.ToTable("ProductComponents"); }); + modelBuilder.Entity("DinerDataBaseImplement.Models.MessageInfo", b => + { + b.HasOne("DinerDataBaseImplement.Models.Client", "Client") + .WithMany() + .HasForeignKey("ClientID"); + + b.Navigation("Client"); + }); + modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => { b.HasOne("DinerDataBaseImplement.Models.Client", "Client") diff --git a/Diner/DinerDataBaseImplement/Migrations/20240513154945_InitMigration.cs b/Diner/DinerDataBaseImplement/Migrations/20240516122239_InitMigration.cs similarity index 84% rename from Diner/DinerDataBaseImplement/Migrations/20240513154945_InitMigration.cs rename to Diner/DinerDataBaseImplement/Migrations/20240516122239_InitMigration.cs index fb50314..497a7d0 100644 --- a/Diner/DinerDataBaseImplement/Migrations/20240513154945_InitMigration.cs +++ b/Diner/DinerDataBaseImplement/Migrations/20240516122239_InitMigration.cs @@ -70,6 +70,27 @@ namespace DinerDataBaseImplement.Migrations table.PrimaryKey("PK_Snacks", x => x.ID); }); + migrationBuilder.CreateTable( + name: "MessageInfos", + 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_MessageInfos", x => x.MessageID); + table.ForeignKey( + name: "FK_MessageInfos_Clients_ClientID", + column: x => x.ClientID, + principalTable: "Clients", + principalColumn: "ID"); + }); + migrationBuilder.CreateTable( name: "Orders", columns: table => new @@ -78,7 +99,7 @@ namespace DinerDataBaseImplement.Migrations .Annotation("SqlServer:Identity", "1, 1"), SnackID = table.Column(type: "int", nullable: false), ClientID = table.Column(type: "int", nullable: false), - ImplementerID = table.Column(type: "int", nullable: false), + ImplementerID = table.Column(type: "int", nullable: true), Count = table.Column(type: "int", nullable: false), Sum = table.Column(type: "float", nullable: false), Status = table.Column(type: "int", nullable: false), @@ -98,8 +119,7 @@ namespace DinerDataBaseImplement.Migrations name: "FK_Orders_Implementers_ImplementerID", column: x => x.ImplementerID, principalTable: "Implementers", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); + principalColumn: "ID"); table.ForeignKey( name: "FK_Orders_Snacks_SnackID", column: x => x.SnackID, @@ -135,6 +155,11 @@ namespace DinerDataBaseImplement.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateIndex( + name: "IX_MessageInfos_ClientID", + table: "MessageInfos", + column: "ClientID"); + migrationBuilder.CreateIndex( name: "IX_Orders_ClientID", table: "Orders", @@ -164,6 +189,9 @@ namespace DinerDataBaseImplement.Migrations /// protected override void Down(MigrationBuilder migrationBuilder) { + migrationBuilder.DropTable( + name: "MessageInfos"); + migrationBuilder.DropTable( name: "Orders"); diff --git a/Diner/DinerDataBaseImplement/Migrations/DinerDatabaseBy6WorkModelSnapshot.cs b/Diner/DinerDataBaseImplement/Migrations/DinerDatabaseBy7WorkModelSnapshot.cs similarity index 81% rename from Diner/DinerDataBaseImplement/Migrations/DinerDatabaseBy6WorkModelSnapshot.cs rename to Diner/DinerDataBaseImplement/Migrations/DinerDatabaseBy7WorkModelSnapshot.cs index f785777..eed7f12 100644 --- a/Diner/DinerDataBaseImplement/Migrations/DinerDatabaseBy6WorkModelSnapshot.cs +++ b/Diner/DinerDataBaseImplement/Migrations/DinerDatabaseBy7WorkModelSnapshot.cs @@ -10,8 +10,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace DinerDataBaseImplement.Migrations { - [DbContext(typeof(DinerDatabaseBy6Work))] - partial class DinerDatabaseBy6WorkModelSnapshot : ModelSnapshot + [DbContext(typeof(DinerDatabaseBy7Work))] + partial class DinerDatabaseBy7WorkModelSnapshot : ModelSnapshot { protected override void BuildModel(ModelBuilder modelBuilder) { @@ -44,7 +44,7 @@ namespace DinerDataBaseImplement.Migrations b.HasKey("ID"); - b.ToTable("Clients"); + b.ToTable("Clients", (string)null); }); modelBuilder.Entity("DinerDataBaseImplement.Models.Food", b => @@ -64,7 +64,7 @@ namespace DinerDataBaseImplement.Migrations b.HasKey("ID"); - b.ToTable("Components"); + b.ToTable("Components", (string)null); }); modelBuilder.Entity("DinerDataBaseImplement.Models.Implementer", b => @@ -91,7 +91,37 @@ namespace DinerDataBaseImplement.Migrations b.HasKey("ID"); - b.ToTable("Implementers"); + b.ToTable("Implementers", (string)null); + }); + + modelBuilder.Entity("DinerDataBaseImplement.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("MessageInfos", (string)null); }); modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => @@ -134,7 +164,7 @@ namespace DinerDataBaseImplement.Migrations b.HasIndex("SnackID"); - b.ToTable("Orders"); + b.ToTable("Orders", (string)null); }); modelBuilder.Entity("DinerDataBaseImplement.Models.Snack", b => @@ -154,7 +184,7 @@ namespace DinerDataBaseImplement.Migrations b.HasKey("ID"); - b.ToTable("Snacks"); + b.ToTable("Snacks", (string)null); }); modelBuilder.Entity("DinerDataBaseImplement.Models.SnackFood", b => @@ -180,7 +210,16 @@ namespace DinerDataBaseImplement.Migrations b.HasIndex("SnackID"); - b.ToTable("ProductComponents"); + b.ToTable("ProductComponents", (string)null); + }); + + modelBuilder.Entity("DinerDataBaseImplement.Models.MessageInfo", b => + { + b.HasOne("DinerDataBaseImplement.Models.Client", "Client") + .WithMany() + .HasForeignKey("ClientID"); + + b.Navigation("Client"); }); modelBuilder.Entity("DinerDataBaseImplement.Models.Order", b => diff --git a/Diner/DinerDataBaseImplement/Models/MessageInfo.cs b/Diner/DinerDataBaseImplement/Models/MessageInfo.cs index ec4949f..bfd3453 100644 --- a/Diner/DinerDataBaseImplement/Models/MessageInfo.cs +++ b/Diner/DinerDataBaseImplement/Models/MessageInfo.cs @@ -12,26 +12,22 @@ using System.Threading.Tasks; namespace DinerDataBaseImplement.Models { public class MessageInfo : IMessageInfoModel { + [Key] public string MessageID { get; set; } = string.Empty; - [ForeignKey("ClientID")] public int? ClientID { get; set; } - [Required] public string SenderName { get; set; } = string.Empty; - [Required] public DateTime DateDelivery { get; set; } - [Required] public string Subject { get; set; } = string.Empty; - [Required] public string Body { get; set; } = string.Empty; public virtual Client? Client { get; set; } - public static MessageInfo? Create(DinerDatabaseBy6Work context, MessageInfoBindingModel model) { + public static MessageInfo? Create(DinerDatabaseBy7Work context, MessageInfoBindingModel model) { if (model == null) { return null; } @@ -40,8 +36,7 @@ namespace DinerDataBaseImplement.Models { SenderName = model.SenderName, DateDelivery = model.DateDelivery, Subject = model.Subject, - Body = model.Body, - Client = context.Clients.FirstOrDefault(x => x.Email == model.SenderName) + Body = model.Body }; } diff --git a/Diner/DinerDataBaseImplement/Models/Order.cs b/Diner/DinerDataBaseImplement/Models/Order.cs index f1f3eec..0cf4e9b 100644 --- a/Diner/DinerDataBaseImplement/Models/Order.cs +++ b/Diner/DinerDataBaseImplement/Models/Order.cs @@ -1,7 +1,6 @@ using DinerContracts.BindingModels; using DinerContracts.ViewModels; using DinerDataBaseImplement.Implements; -using DinerDataBaseImplement.Migrations; using DinerDataModels.Enums; using DinerDataModels.Models; using System.ComponentModel.DataAnnotations; diff --git a/Diner/DinerDataBaseImplement/Models/Snack.cs b/Diner/DinerDataBaseImplement/Models/Snack.cs index 74666b5..6bddd31 100644 --- a/Diner/DinerDataBaseImplement/Models/Snack.cs +++ b/Diner/DinerDataBaseImplement/Models/Snack.cs @@ -44,7 +44,7 @@ namespace DinerDataBaseImplement.Models [ForeignKey("SnackID")] public virtual List Orders { get; set; } = new(); - public static Snack? Create(DinerDatabaseBy6Work context,SnackBindingModel model) + public static Snack? Create(DinerDatabaseBy7Work context,SnackBindingModel model) { return new Snack() { @@ -72,7 +72,7 @@ namespace DinerDataBaseImplement.Models ProductComponents = ProductComponents }; - public void UpdateComponents(DinerDatabaseBy6Work context, SnackBindingModel model) { + public void UpdateComponents(DinerDatabaseBy7Work context, SnackBindingModel model) { var productComponents = context.ProductComponents.Where(rec => rec.SnackID == model.ID).ToList(); if (ProductComponents != null && ProductComponents.Count > 0) { context.ProductComponents.RemoveRange(productComponents.Where(rec => !model.ProductComponents.ContainsKey(rec.ComponentID))); diff --git a/Diner/DinerRestAPI/Controllers/ClientController.cs b/Diner/DinerRestAPI/Controllers/ClientController.cs index a4caa99..713420d 100644 --- a/Diner/DinerRestAPI/Controllers/ClientController.cs +++ b/Diner/DinerRestAPI/Controllers/ClientController.cs @@ -13,16 +13,18 @@ namespace DinerRestApi.Controllers { private readonly ILogger _logger; private readonly IClientLogic _logic; + private readonly IMessageInfoLogic _messageLogic; - public ClientController(ILogger logger, IClientLogic logic) { + public ClientController(ILogger logger, IClientLogic logic, IMessageInfoLogic messageLogic) { _logger = logger; _logic = logic; + _messageLogic = messageLogic; } [HttpGet] public ClientViewModel? Login(string login, string password) { try { - return _logic.ReadELement(new ClientSearchModel { + return _logic.ReadElement(new ClientSearchModel { Email = login, Password = password }); @@ -54,5 +56,18 @@ namespace DinerRestApi.Controllers { throw; } } + + [HttpGet] + public List? GetMessages(int clientID) { + try { + return _messageLogic.ReadList(new MessageInfoSearchModel { + ClientID = clientID + }); + } + catch (Exception ex) { + _logger.LogError(ex, "Ошибка получения писем клиента"); + throw; + } + } } } diff --git a/Diner/DinerRestAPI/Program.cs b/Diner/DinerRestAPI/Program.cs index c01ec09..dcec420 100644 --- a/Diner/DinerRestAPI/Program.cs +++ b/Diner/DinerRestAPI/Program.cs @@ -1,9 +1,12 @@ +using DinerContracts.BindingModels; using DinerContracts.BusinessLogicsContacts; using DinerContracts.BusinessLogicsContracts; +using DinerContracts.SearchModels; using DinerContracts.StoragesContracts; using DinerDataBaseImplement.Implements; using DineryBusinessLogic.BusinessLogic; +using DineryBusinessLogic.MailWorker; using DocumentFormat.OpenXml.VariantTypes; using Microsoft.OpenApi.Models; @@ -19,11 +22,15 @@ namespace DinerRestAPI { 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(); // Add services to the container. @@ -34,8 +41,18 @@ namespace DinerRestAPI { 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()) { + if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "DinerRestApi v1")); } diff --git a/Diner/DinerRestAPI/appsettings.json b/Diner/DinerRestAPI/appsettings.json index 10f68b8..7df4b29 100644 --- a/Diner/DinerRestAPI/appsettings.json +++ b/Diner/DinerRestAPI/appsettings.json @@ -5,5 +5,12 @@ "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "*" + "AllowedHosts": "*", + + "SmtpClientHost": "smtp.gmail.com", + "SmtpClientPort": "587", + "PopHost": "pop.gmail.com", + "PopPort": "995", + "MailLogin": "fedotovilyabylabwork@gmail.com", + "MailPassword": "gyve lvpe gcna pscp" } diff --git a/Diner/DinerView/App.config b/Diner/DinerView/App.config new file mode 100644 index 0000000..31b0661 --- /dev/null +++ b/Diner/DinerView/App.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Diner/DinerView/DinerView.csproj b/Diner/DinerView/DinerView.csproj index c2857c7..5189608 100644 --- a/Diner/DinerView/DinerView.csproj +++ b/Diner/DinerView/DinerView.csproj @@ -54,4 +54,10 @@ + + + Always + + + \ No newline at end of file diff --git a/Diner/DinerView/FormMail.Designer.cs b/Diner/DinerView/FormMail.Designer.cs new file mode 100644 index 0000000..15fe79a --- /dev/null +++ b/Diner/DinerView/FormMail.Designer.cs @@ -0,0 +1,57 @@ +namespace DinerView { + partial class FormMail { + /// + /// 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.BorderStyle = BorderStyle.None; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.Name = "dataGridView"; + dataGridView.Size = new Size(800, 450); + dataGridView.TabIndex = 0; + // + // FormMail + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridView); + Name = "FormMail"; + Text = "FormMail"; + Load += FormMail_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridView; + } +} \ No newline at end of file diff --git a/Diner/DinerView/FormMail.cs b/Diner/DinerView/FormMail.cs new file mode 100644 index 0000000..0146ff6 --- /dev/null +++ b/Diner/DinerView/FormMail.cs @@ -0,0 +1,42 @@ +using DinerContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace DinerView { + public partial class FormMail : Form { + + private readonly ILogger _logger; + private readonly IMessageInfoLogic _logic; + + public FormMail(ILogger logger, IMessageInfoLogic logic) { + InitializeComponent(); + _logic = logic; + _logger = logger; + } + + private void FormMail_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/Diner/DinerView/FormMail.resx b/Diner/DinerView/FormMail.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/Diner/DinerView/FormMail.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/Diner/DinerView/FormMain.Designer.cs b/Diner/DinerView/FormMain.Designer.cs index 3858d91..e2c78f3 100644 --- a/Diner/DinerView/FormMain.Designer.cs +++ b/Diner/DinerView/FormMain.Designer.cs @@ -42,6 +42,7 @@ buttonCreateOrder = new Button(); buttonIsDelivery = new Button(); buttonUpdateList = new Button(); + toolStripMenuItemMail = new ToolStripMenuItem(); menuStrip.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); SuspendLayout(); @@ -49,7 +50,7 @@ // menuStrip // menuStrip.BackColor = SystemColors.Control; - menuStrip.Items.AddRange(new ToolStripItem[] { toolStripMenuItemMenu, toolStripMenuItemReport, toolStripMenuItemStartOfWork }); + menuStrip.Items.AddRange(new ToolStripItem[] { toolStripMenuItemMenu, toolStripMenuItemReport, toolStripMenuItemStartOfWork, toolStripMenuItemMail }); menuStrip.Location = new Point(0, 0); menuStrip.Name = "menuStrip"; menuStrip.Size = new Size(1114, 24); @@ -173,6 +174,13 @@ buttonUpdateList.UseVisualStyleBackColor = true; buttonUpdateList.Click += buttonUpdateList_Click; // + // toolStripMenuItemMail + // + toolStripMenuItemMail.Name = "toolStripMenuItemMail"; + toolStripMenuItemMail.Size = new Size(53, 20); + toolStripMenuItemMail.Text = "Почта"; + toolStripMenuItemMail.Click += toolStripMenuItemMail_Click; + // // FormMain // AutoScaleDimensions = new SizeF(7F, 15F); @@ -212,5 +220,6 @@ private ToolStripMenuItem toolStripMenuItemClient; private ToolStripMenuItem toolStripMenuItemStartOfWork; private ToolStripMenuItem toolStripMenuItemImplementer; + private ToolStripMenuItem toolStripMenuItemMail; } } \ No newline at end of file diff --git a/Diner/DinerView/FormMain.cs b/Diner/DinerView/FormMain.cs index 458ecb4..a5bc9a0 100644 --- a/Diner/DinerView/FormMain.cs +++ b/Diner/DinerView/FormMain.cs @@ -178,5 +178,12 @@ namespace DinerView MessageBox.Show("Процесс обработки запущен", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); } + + private void toolStripMenuItemMail_Click(object sender, EventArgs e) { + var service = Program.ServiceProvider?.GetService(typeof(FormMail)); + if (service is FormMail form) { + form.ShowDialog(); + } + } } } diff --git a/Diner/DinerView/Program.cs b/Diner/DinerView/Program.cs index 99e5c7a..64aaa36 100644 --- a/Diner/DinerView/Program.cs +++ b/Diner/DinerView/Program.cs @@ -1,9 +1,11 @@ +using DinerContracts.BindingModels; using DinerContracts.BusinessLogicsContacts; using DinerContracts.BusinessLogicsContracts; using DinerContracts.SearchModels; using DinerContracts.StoragesContracts; using DinerDataBaseImplement.Implements; using DineryBusinessLogic.BusinessLogic; +using DineryBusinessLogic.MailWorker; using DineryBusinessLogic.OfficePackage; using DineryBusinessLogic.OfficePackage.Implements; using Microsoft.Extensions.DependencyInjection; @@ -28,6 +30,26 @@ namespace DinerView var services = new ServiceCollection(); ConfigureServices(services); _serviceProvider = services.BuildServiceProvider(); + + try { + var mailSender = _serviceProvider.GetService(); + mailSender?.MailConfig(new MailConfigBindingModel { + MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty, + MailPassword = System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? string.Empty, + SmtpClientHost = System.Configuration.ConfigurationManager.AppSettings["SmtpClientHost"] ?? string.Empty, + SmtpClientPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SmtpClientPort"]), + PopHost = System.Configuration.ConfigurationManager.AppSettings["PopHost"] ?? string.Empty, + PopPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["PopPort"]) + }); + + // + var timer = new System.Threading.Timer(new TimerCallback(MailCheck!), null, 0, 100000); + } + catch (Exception ex) { + var logger = _serviceProvider.GetService(); + logger?.LogError(ex, " "); + } + Application.Run(_serviceProvider.GetRequiredService()); } @@ -54,6 +76,8 @@ namespace DinerView services.AddTransient(); services.AddTransient(); + services.AddSingleton(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -70,6 +94,10 @@ namespace DinerView 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/Diner/DineryBusinessLogic/BusinessLogic/ClientLogic.cs b/Diner/DineryBusinessLogic/BusinessLogic/ClientLogic.cs index 369d38c..9839a3f 100644 --- a/Diner/DineryBusinessLogic/BusinessLogic/ClientLogic.cs +++ b/Diner/DineryBusinessLogic/BusinessLogic/ClientLogic.cs @@ -51,7 +51,7 @@ namespace DineryBusinessLogic.BusinessLogic { return true; } - public ClientViewModel? ReadELement(ClientSearchModel model) { + public ClientViewModel? ReadElement(ClientSearchModel model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } diff --git a/Diner/DineryBusinessLogic/BusinessLogic/MessageInfoLogic.cs b/Diner/DineryBusinessLogic/BusinessLogic/MessageInfoLogic.cs index e63a221..b0d3a5d 100644 --- a/Diner/DineryBusinessLogic/BusinessLogic/MessageInfoLogic.cs +++ b/Diner/DineryBusinessLogic/BusinessLogic/MessageInfoLogic.cs @@ -59,12 +59,6 @@ namespace DineryBusinessLogic.BusinessLogic { if (string.IsNullOrEmpty((model.DateDelivery).ToString())) { throw new ArgumentNullException("Нет даты письма", nameof(model.DateDelivery)); } - if (string.IsNullOrEmpty(model.Subject)) { - throw new ArgumentNullException("Нет заголовка письма", nameof(model.Subject)); - } - if (string.IsNullOrEmpty(model.Body)) { - throw new ArgumentNullException("Нет тела письма", nameof(model.Body)); - } _logger.LogInformation($"MessageInfo. MessageID:{model.MessageID}.ClientID:{model.ClientID}.DataDelivery:{model.DateDelivery}." + $"Subject:{model.Subject}.Body:{model.Body}"); } diff --git a/Diner/DineryBusinessLogic/BusinessLogic/OrderLogic.cs b/Diner/DineryBusinessLogic/BusinessLogic/OrderLogic.cs index 384fd7a..7db8bd3 100644 --- a/Diner/DineryBusinessLogic/BusinessLogic/OrderLogic.cs +++ b/Diner/DineryBusinessLogic/BusinessLogic/OrderLogic.cs @@ -1,9 +1,11 @@ using DinerContracts.BindingModels; using DinerContracts.BusinessLogicsContacts; +using DinerContracts.BusinessLogicsContracts; using DinerContracts.SearchModels; using DinerContracts.StoragesContracts; using DinerContracts.ViewModels; using DinerDataModels.Enums; +using DineryBusinessLogic.MailWorker; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; @@ -17,22 +19,29 @@ namespace DineryBusinessLogic.BusinessLogic { private readonly ILogger _logger; private readonly IOrderStorage _orderStorage; + private readonly AbstractMailWorker _mailWorker; + private readonly IClientLogic _clientLogic; - public OrderLogic(ILogger logger, IOrderStorage orderStorage) { + public OrderLogic(ILogger logger, IOrderStorage orderStorage, AbstractMailWorker mailWorker, IClientLogic clientLogic) { _logger = logger; _orderStorage = orderStorage; + _mailWorker = mailWorker; + _clientLogic = clientLogic; } public bool CreateOrder(OrderBindingModel model) { CheckModel(model); model.Status = OrderStatus.Принят; - if (_orderStorage.Insert(model) == null) { + var result = _orderStorage.Insert(model); + if (result == null) { model.Status = OrderStatus.Неизвестен; _logger.LogWarning("Insert operation failed"); return false; } - return true; + SendOrderStatusMail(result.ClientID, $"Новый заказ создан. Номер заказа #{result.ID}", $"Заказ #{result.ID} от " + + $"{result.DateCreate} на сумму {result.Sum:0.00} принят"); + return true; } public bool DeliveryOrder(OrderBindingModel model) @@ -118,12 +127,25 @@ namespace DineryBusinessLogic.BusinessLogic } CheckModel(model, false); - - if (_orderStorage.Update(model) == null) { + var result = _orderStorage.Update(model); + if (result == null) { _logger.LogWarning("Update operarion failed"); return false; } - return true; + SendOrderStatusMail(result.ClientID, $"Изменен статус заказа #{result.ID}", $"Заказ #{model.ID} изменен статус на {result.Status}"); + return true; } - } + 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/Diner/DineryBusinessLogic/DineryBusinessLogic.csproj b/Diner/DineryBusinessLogic/DineryBusinessLogic.csproj index 5741c89..9ab5f2e 100644 --- a/Diner/DineryBusinessLogic/DineryBusinessLogic.csproj +++ b/Diner/DineryBusinessLogic/DineryBusinessLogic.csproj @@ -8,6 +8,7 @@ + diff --git a/Diner/DineryBusinessLogic/MailWorker/AbstractMailWorker.cs b/Diner/DineryBusinessLogic/MailWorker/AbstractMailWorker.cs new file mode 100644 index 0000000..8e1e10f --- /dev/null +++ b/Diner/DineryBusinessLogic/MailWorker/AbstractMailWorker.cs @@ -0,0 +1,77 @@ +using DinerContracts.BindingModels; +using DinerContracts.BusinessLogicsContracts; +using DineryBusinessLogic.BusinessLogic; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.WebSockets; +using System.Text; +using System.Threading.Tasks; + +namespace DineryBusinessLogic.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: {_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: {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: {list.Count} new mails"); + 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(); + } +} diff --git a/Diner/DineryBusinessLogic/MailWorker/MailKitWorker.cs b/Diner/DineryBusinessLogic/MailWorker/MailKitWorker.cs new file mode 100644 index 0000000..d9e3675 --- /dev/null +++ b/Diner/DineryBusinessLogic/MailWorker/MailKitWorker.cs @@ -0,0 +1,73 @@ +using DinerContracts.BindingModels; +using DinerContracts.BusinessLogicsContracts; +using DocumentFormat.OpenXml.Wordprocessing; +using MailKit.Net.Pop3; +using MailKit.Security; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Mail; +using System.Runtime.Intrinsics.X86; +using System.Text; +using System.Threading.Tasks; + +namespace DineryBusinessLogic.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; + } + + } +}