From 32132b644aada055ff513ed1b3d99941f1307e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9?= Date: Sat, 25 Mar 2023 20:38:11 +0400 Subject: [PATCH] =?UTF-8?q?=D1=8F=20=D0=BD=D0=B5=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=B4=D1=83=D0=BC=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FoodOrders/FoodOrders/FormClients.cs | 3 +- FoodOrders/FoodOrders/Program.cs | 1 + .../BusinessLogics/ClientLogic.cs | 92 +++++++- .../BusinessLogics/ComponentLogic.cs | 3 +- .../BusinessLogics/OrderLogic.cs | 4 + .../ViewModels/OrderViewModel.cs | 5 + .../Models/IOrderModel.cs | 1 + .../FoodOrdersDatabase.cs | 2 + .../Implements/ClientStorage.cs | 57 ++++- .../Implements/OrderStorage.cs | 8 + .../FoodOrdersDatabaseModelSnapshot.cs | 204 ++++++++++++++++++ .../Models/Order.cs | 7 + .../DataFileSingleton.cs | 5 + .../Implements/OrderStorage.cs | 8 + .../FoodOrdersFileImplement/Models/Client.cs | 3 +- .../FoodOrdersFileImplement/Models/Order.cs | 6 + .../DataListSingleton.cs | 2 + .../Implements/ClientStorage.cs | 26 ++- .../Implements/ComponentStorage.cs | 3 +- .../Implements/OrderStorage.cs | 19 ++ .../FoodOrdersListImplement/Models/Client.cs | 2 +- .../FoodOrdersListImplement/Models/Order.cs | 5 +- 22 files changed, 444 insertions(+), 22 deletions(-) create mode 100644 FoodOrders/FoodOrdersDatabaseImplement/Migrations/FoodOrdersDatabaseModelSnapshot.cs diff --git a/FoodOrders/FoodOrders/FormClients.cs b/FoodOrders/FoodOrders/FormClients.cs index 55039f3..2ab552f 100644 --- a/FoodOrders/FoodOrders/FormClients.cs +++ b/FoodOrders/FoodOrders/FormClients.cs @@ -1,4 +1,5 @@ -using FoodOrdersContracts.BindingModels; + +using FoodOrdersContracts.BindingModels; using FoodOrdersContracts.BusinessLogicsContracts; using Microsoft.Extensions.Logging; diff --git a/FoodOrders/FoodOrders/Program.cs b/FoodOrders/FoodOrders/Program.cs index 6500c9d..9dde389 100644 --- a/FoodOrders/FoodOrders/Program.cs +++ b/FoodOrders/FoodOrders/Program.cs @@ -48,6 +48,7 @@ namespace FoodOrdersView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/FoodOrders/FoodOrdersBusinessLogic/BusinessLogics/ClientLogic.cs b/FoodOrders/FoodOrdersBusinessLogic/BusinessLogics/ClientLogic.cs index 669bd93..f0e609b 100644 --- a/FoodOrders/FoodOrdersBusinessLogic/BusinessLogics/ClientLogic.cs +++ b/FoodOrders/FoodOrdersBusinessLogic/BusinessLogics/ClientLogic.cs @@ -1,35 +1,117 @@ using FoodOrdersContracts.BindingModels; using FoodOrdersContracts.BusinessLogicsContracts; using FoodOrdersContracts.SearchModels; +using FoodOrdersContracts.StoragesContracts; using FoodOrdersContracts.ViewModels; +using Microsoft.Extensions.Logging; namespace FoodOrdersBusinessLogic.BusinessLogics { public class ClientLogic : IClientLogic { + private readonly ILogger _logger; + private readonly IClientStorage _clienttStorage; + public ClientLogic(ILogger logger, IClientStorage ClientStorage) + { + _logger = logger; + _clienttStorage = ClientStorage; + } public bool Create(ClientBindingModel model) { - throw new NotImplementedException(); + CheckModel(model); + if (_clienttStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; } public bool Delete(ClientBindingModel model) { - throw new NotImplementedException(); + CheckModel(model, false); + _logger.LogInformation("Delete. Id:{Id}", model.Id); + if (_clienttStorage.Delete(model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + return true; } public ClientViewModel? ReadElement(ClientSearchModel model) { - throw new NotImplementedException(); + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("Client. ClientFIO:{ClientFIO}. Email:{Email}. Id:{Id}", model.ClientFIO, model.Email, model.Id); + var element = _clienttStorage.GetElement(model); + if (element == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); + return element; } public List? ReadList(ClientSearchModel? model) { - throw new NotImplementedException(); + _logger.LogInformation("Client. ClientFIO:{ClientFIO}. Email:{Email}. Id:{Id}", model?.ClientFIO, model?.Email, model?.Id); + var list = model == null ? _clienttStorage.GetFullList() : _clienttStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + _logger.LogInformation("ReadList. Count:{Count}", list.Count); + return list; } public bool Update(ClientBindingModel model) { - throw new NotImplementedException(); + CheckModel(model); + if (_clienttStorage.Update(model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + return true; + } + + private void CheckModel(ClientBindingModel model, bool withParams = true) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + if (!withParams) + { + return; + } + if (string.IsNullOrEmpty(model.ClientFIO)) + { + throw new ArgumentNullException("Нет ФИО клиента", nameof(model.ClientFIO)); + } + if (string.IsNullOrEmpty(model.Email)) + { + throw new ArgumentNullException("Нет логина клиента", nameof(model.Email)); + } + if (string.IsNullOrEmpty(model.Password)) + { + throw new ArgumentNullException("Нет пароля клиента", nameof(model.Password)); + } + + _logger.LogInformation("Client. ClientFIO:{ClientFIO}. Email:{Email}. Password:{Password} Id:{Id}", model.ClientFIO, model.Email, model.Password, model.Id); + var element = _clienttStorage.GetElement(new ClientSearchModel + { + Email = model.Email + }); + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Клиент с таким логином уже есть"); + } } } } \ No newline at end of file diff --git a/FoodOrders/FoodOrdersBusinessLogic/BusinessLogics/ComponentLogic.cs b/FoodOrders/FoodOrdersBusinessLogic/BusinessLogics/ComponentLogic.cs index b9f263b..d26920f 100644 --- a/FoodOrders/FoodOrdersBusinessLogic/BusinessLogics/ComponentLogic.cs +++ b/FoodOrders/FoodOrdersBusinessLogic/BusinessLogics/ComponentLogic.cs @@ -11,8 +11,7 @@ namespace FoodOrdersBusinessLogic.BusinessLogics { private readonly ILogger _logger; private readonly IComponentStorage _componentStorage; - public ComponentLogic(ILogger logger, IComponentStorage - ComponentStorage) + public ComponentLogic(ILogger logger, IComponentStorage ComponentStorage) { _logger = logger; _componentStorage = ComponentStorage; diff --git a/FoodOrders/FoodOrdersBusinessLogic/BusinessLogics/OrderLogic.cs b/FoodOrders/FoodOrdersBusinessLogic/BusinessLogics/OrderLogic.cs index 4ae8577..474e3a6 100644 --- a/FoodOrders/FoodOrdersBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/FoodOrders/FoodOrdersBusinessLogic/BusinessLogics/OrderLogic.cs @@ -78,6 +78,10 @@ namespace FoodOrdersBusinessLogic.BusinessLogics { throw new ArgumentNullException("Некорректный идентификатор у продукта", nameof(model.Id)); } + if (model.ClientId < 0) + { + throw new ArgumentNullException("Некорректный идентификатор у клиента", nameof(model.ClientId)); + } if (model.Count <= 0) { throw new ArgumentNullException("Количество продуктов в заказе должно быть больше 0", nameof(model.Count)); diff --git a/FoodOrders/FoodOrdersContracts/ViewModels/OrderViewModel.cs b/FoodOrders/FoodOrdersContracts/ViewModels/OrderViewModel.cs index 34f541f..eb94ab9 100644 --- a/FoodOrders/FoodOrdersContracts/ViewModels/OrderViewModel.cs +++ b/FoodOrders/FoodOrdersContracts/ViewModels/OrderViewModel.cs @@ -13,6 +13,11 @@ namespace FoodOrdersContracts.ViewModels [DisplayName("Набор")] public string DishName { get; set; } = string.Empty; + public int ClientId { get; set; } + + [DisplayName("Клиент")] + public string ClientFIO { get; set; } = string.Empty; + [DisplayName("Количество")] public int Count { get; set; } diff --git a/FoodOrders/FoodOrdersDataModels/Models/IOrderModel.cs b/FoodOrders/FoodOrdersDataModels/Models/IOrderModel.cs index a0cfe81..4fea55c 100644 --- a/FoodOrders/FoodOrdersDataModels/Models/IOrderModel.cs +++ b/FoodOrders/FoodOrdersDataModels/Models/IOrderModel.cs @@ -5,6 +5,7 @@ namespace FoodOrdersDataModels.Models public interface IOrderModel : IId { int DishId { get; } + int ClientId { get; } int Count { get; } double Sum { get; } OrderStatus Status { get; } diff --git a/FoodOrders/FoodOrdersDatabaseImplement/FoodOrdersDatabase.cs b/FoodOrders/FoodOrdersDatabaseImplement/FoodOrdersDatabase.cs index 5bf8737..c244f4b 100644 --- a/FoodOrders/FoodOrdersDatabaseImplement/FoodOrdersDatabase.cs +++ b/FoodOrders/FoodOrdersDatabaseImplement/FoodOrdersDatabase.cs @@ -21,5 +21,7 @@ namespace FoodOrdersDatabaseImplement public virtual DbSet DishComponents { set; get; } public virtual DbSet Orders { set; get; } + + public virtual DbSet Clients { set; get; } } } \ No newline at end of file diff --git a/FoodOrders/FoodOrdersDatabaseImplement/Implements/ClientStorage.cs b/FoodOrders/FoodOrdersDatabaseImplement/Implements/ClientStorage.cs index 116076a..3c92933 100644 --- a/FoodOrders/FoodOrdersDatabaseImplement/Implements/ClientStorage.cs +++ b/FoodOrders/FoodOrdersDatabaseImplement/Implements/ClientStorage.cs @@ -2,6 +2,7 @@ using FoodOrdersContracts.SearchModels; using FoodOrdersContracts.StoragesContracts; using FoodOrdersContracts.ViewModels; +using FoodOrdersDatabaseImplement.Models; namespace FoodOrdersDatabaseImplement.Implements { @@ -9,32 +10,76 @@ namespace FoodOrdersDatabaseImplement.Implements { public ClientViewModel? Delete(ClientBindingModel model) { - throw new NotImplementedException(); + using var context = new FoodOrdersDatabase(); + var element = context.Clients.FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + context.Clients.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; } public ClientViewModel? GetElement(ClientSearchModel model) { - throw new NotImplementedException(); + if (string.IsNullOrEmpty(model.Email) && !model.Id.HasValue) + { + return null; + } + using var context = new FoodOrdersDatabase(); + return context.Clients + .FirstOrDefault(x => (x.Email == model.Email) || (x.Id == model.Id)) + ?.GetViewModel; } public List GetFilteredList(ClientSearchModel model) { - throw new NotImplementedException(); + { + if (string.IsNullOrEmpty(model.Email)) + { + return new(); + } + using var context = new FoodOrdersDatabase(); + return context.Clients + .Where(x => x.Email.Contains(model.Email)) + .Select(x => x.GetViewModel) + .ToList(); + } } public List GetFullList() { - throw new NotImplementedException(); + using var context = new FoodOrdersDatabase(); + return context.Clients + .Select(x => x.GetViewModel) + .ToList(); } public ClientViewModel? Insert(ClientBindingModel model) { - throw new NotImplementedException(); + var newClient = Client.Create(model); + if (newClient == null) + { + return null; + } + using var context = new FoodOrdersDatabase(); + context.Clients.Add(newClient); + context.SaveChanges(); + return newClient.GetViewModel; } public ClientViewModel? Update(ClientBindingModel model) { - throw new NotImplementedException(); + using var context = new FoodOrdersDatabase(); + var client = context.Clients.FirstOrDefault(x => x.Id == model.Id); + if (client == null) + { + return null; + } + client.Update(model); + context.SaveChanges(); + return client.GetViewModel; } } } \ No newline at end of file diff --git a/FoodOrders/FoodOrdersDatabaseImplement/Implements/OrderStorage.cs b/FoodOrders/FoodOrdersDatabaseImplement/Implements/OrderStorage.cs index 559a3fe..feb54cb 100644 --- a/FoodOrders/FoodOrdersDatabaseImplement/Implements/OrderStorage.cs +++ b/FoodOrders/FoodOrdersDatabaseImplement/Implements/OrderStorage.cs @@ -21,6 +21,14 @@ namespace FoodOrdersDatabaseImplement.Implements public List GetFilteredList(OrderSearchModel model) { using var context = new FoodOrdersDatabase(); + if (model.ClientId.HasValue) + { + return context.Orders + .Include(x => x.Client) + .Where(x => x.ClientId == model.ClientId) + .Select(x => x.GetViewModel) + .ToList(); + } if (!model.Id.HasValue && model.DateFrom.HasValue && model.DateTo.HasValue) { return context.Orders diff --git a/FoodOrders/FoodOrdersDatabaseImplement/Migrations/FoodOrdersDatabaseModelSnapshot.cs b/FoodOrders/FoodOrdersDatabaseImplement/Migrations/FoodOrdersDatabaseModelSnapshot.cs new file mode 100644 index 0000000..5cf26ef --- /dev/null +++ b/FoodOrders/FoodOrdersDatabaseImplement/Migrations/FoodOrdersDatabaseModelSnapshot.cs @@ -0,0 +1,204 @@ +// +using System; +using FoodOrdersDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace FoodOrdersDatabaseImplement.Migrations +{ + [DbContext(typeof(FoodOrdersDatabase))] + partial class FoodOrdersDatabaseModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.3") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("FoodOrdersDatabaseImplement.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", (string)null); + }); + + modelBuilder.Entity("FoodOrdersDatabaseImplement.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", (string)null); + }); + + modelBuilder.Entity("FoodOrdersDatabaseImplement.Models.Dish", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DishName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Price") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Dishes", (string)null); + }); + + modelBuilder.Entity("FoodOrdersDatabaseImplement.Models.DishComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("DishId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ComponentId"); + + b.HasIndex("DishId"); + + b.ToTable("DishComponents", (string)null); + }); + + modelBuilder.Entity("FoodOrdersDatabaseImplement.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("DishId") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Sum") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.HasIndex("DishId"); + + b.ToTable("Orders", (string)null); + }); + + modelBuilder.Entity("FoodOrdersDatabaseImplement.Models.DishComponent", b => + { + b.HasOne("FoodOrdersDatabaseImplement.Models.Component", "Component") + .WithMany("DishComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FoodOrdersDatabaseImplement.Models.Dish", "Dish") + .WithMany("Components") + .HasForeignKey("DishId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Dish"); + }); + + modelBuilder.Entity("FoodOrdersDatabaseImplement.Models.Order", b => + { + b.HasOne("FoodOrdersDatabaseImplement.Models.Client", "Client") + .WithMany() + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("FoodOrdersDatabaseImplement.Models.Dish", "Dish") + .WithMany() + .HasForeignKey("DishId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Client"); + + b.Navigation("Dish"); + }); + + modelBuilder.Entity("FoodOrdersDatabaseImplement.Models.Component", b => + { + b.Navigation("DishComponents"); + }); + + modelBuilder.Entity("FoodOrdersDatabaseImplement.Models.Dish", b => + { + b.Navigation("Components"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/FoodOrders/FoodOrdersDatabaseImplement/Models/Order.cs b/FoodOrders/FoodOrdersDatabaseImplement/Models/Order.cs index 9a5ac96..331c900 100644 --- a/FoodOrders/FoodOrdersDatabaseImplement/Models/Order.cs +++ b/FoodOrders/FoodOrdersDatabaseImplement/Models/Order.cs @@ -12,6 +12,8 @@ namespace FoodOrdersDatabaseImplement.Models [Required] public int DishId { get; set; } + [Required] + public int ClientId { get; set; } [Required] public int Count { get; set; } @@ -27,6 +29,8 @@ namespace FoodOrdersDatabaseImplement.Models public virtual Dish Dish { get; set; } + public virtual Client Client { get; set; } + public DateTime? DateImplement { get; set; } public static Order? Create(OrderBindingModel? model) @@ -39,6 +43,7 @@ namespace FoodOrdersDatabaseImplement.Models { Id = model.Id, DishId = model.DishId, + ClientId = model.ClientId, Count = model.Count, Sum = model.Sum, Status = model.Status, @@ -61,6 +66,8 @@ namespace FoodOrdersDatabaseImplement.Models { Id = Id, DishId = DishId, + ClientId = ClientId, + ClientFIO = Client.ClientFIO, Count = Count, Sum = Sum, Status = Status, diff --git a/FoodOrders/FoodOrdersFileImplement/DataFileSingleton.cs b/FoodOrders/FoodOrdersFileImplement/DataFileSingleton.cs index b3e5803..e16012c 100644 --- a/FoodOrders/FoodOrdersFileImplement/DataFileSingleton.cs +++ b/FoodOrders/FoodOrdersFileImplement/DataFileSingleton.cs @@ -8,9 +8,12 @@ namespace FoodOrdersFileImplement private readonly string ComponentFileName = "Component.xml"; private readonly string OrderFileName = "Order.xml"; private readonly string DishFileName = "Dish.xml"; + private readonly string ClientFileName = "Clients.xml"; public List Components { get; private set; } public List Orders { get; private set; } public List Dishes { get; private set; } + public List Clients { get; private set; } + public static DataFileSingleton GetInstance() { if (instance == null) @@ -22,11 +25,13 @@ namespace FoodOrdersFileImplement public void SaveComponents() => SaveData(Components, ComponentFileName, "Components", x => x.GetXElement); public void SaveDishes() => SaveData(Dishes, DishFileName, "Dishes", x => x.GetXElement); public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); + public void SaveClients() => SaveData(Clients, ClientFileName, "Clients", x => x.GetXElement); private DataFileSingleton() { Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!; Dishes = LoadData(DishFileName, "Dish", x => Dish.Create(x)!)!; Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; + Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!; } private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) { diff --git a/FoodOrders/FoodOrdersFileImplement/Implements/OrderStorage.cs b/FoodOrders/FoodOrdersFileImplement/Implements/OrderStorage.cs index edb9b87..ed8b9c5 100644 --- a/FoodOrders/FoodOrdersFileImplement/Implements/OrderStorage.cs +++ b/FoodOrders/FoodOrdersFileImplement/Implements/OrderStorage.cs @@ -21,6 +21,13 @@ namespace FoodOrdersFileImplement.Implements } public List GetFilteredList(OrderSearchModel model) { + if (model.ClientId.HasValue) + { + return _source.Orders + .Where(x => x.ClientId == model.ClientId) + .Select(x => GetViewModel(x)) + .ToList(); + } if (!model.Id.HasValue && model.DateFrom.HasValue && model.DateTo.HasValue) { return _source.Orders @@ -44,6 +51,7 @@ namespace FoodOrdersFileImplement.Implements { var viewModel = order.GetViewModel; viewModel.DishName = _source.Dishes.FirstOrDefault(x => (x.Id == order.DishId))?.DishName; + viewModel.ClientFIO = _source.Clients.FirstOrDefault(x => (x.Id == order.ClientId))?.ClientFIO; return viewModel; } diff --git a/FoodOrders/FoodOrdersFileImplement/Models/Client.cs b/FoodOrders/FoodOrdersFileImplement/Models/Client.cs index 07ff24b..edba1c4 100644 --- a/FoodOrders/FoodOrdersFileImplement/Models/Client.cs +++ b/FoodOrders/FoodOrdersFileImplement/Models/Client.cs @@ -1,10 +1,9 @@ using FoodOrdersContracts.BindingModels; using FoodOrdersContracts.ViewModels; using FoodOrdersDataModels.Models; -using System.Reflection; using System.Xml.Linq; -namespace FoodOrdersFileImplement.ViewModels +namespace FoodOrdersFileImplement.Models { public class Client : IClientModel { diff --git a/FoodOrders/FoodOrdersFileImplement/Models/Order.cs b/FoodOrders/FoodOrdersFileImplement/Models/Order.cs index 4dafdb7..cc0bd14 100644 --- a/FoodOrders/FoodOrdersFileImplement/Models/Order.cs +++ b/FoodOrders/FoodOrdersFileImplement/Models/Order.cs @@ -2,6 +2,7 @@ using FoodOrdersContracts.ViewModels; using FoodOrdersDataModels.Enums; using FoodOrdersDataModels.Models; +using System.Reflection; using System.Reflection.Metadata; using System.Xml.Linq; @@ -11,6 +12,7 @@ namespace FoodOrdersFileImplement.Models { public int Id { get; private set; } public int DishId { get; private set; } + public int ClientId { get; private set; } public int Count { get; private set; } public double Sum { get; private set; } public OrderStatus Status { get; private set; } @@ -26,6 +28,7 @@ namespace FoodOrdersFileImplement.Models return new Order() { Id = Convert.ToInt32(element.Attribute("Id")!.Value), + ClientId = Convert.ToInt32(element.Element("ClientId")!.Value), DishId = Convert.ToInt32(element.Element("DishId")!.Value), Sum = Convert.ToDouble(element.Element("Sum")!.Value), Count = Convert.ToInt32(element.Element("Count")!.Value), @@ -45,6 +48,7 @@ namespace FoodOrdersFileImplement.Models { Id = model.Id, DishId = model.DishId, + ClientId = model.ClientId, Count = model.Count, Sum = model.Sum, Status = model.Status, @@ -65,6 +69,7 @@ namespace FoodOrdersFileImplement.Models { Id = Id, DishId = DishId, + ClientId = ClientId, Count = Count, Sum = Sum, Status = Status, @@ -76,6 +81,7 @@ namespace FoodOrdersFileImplement.Models "Order", new XAttribute("Id", Id), new XElement("DishId", DishId.ToString()), + new XElement("ClientId", ClientId.ToString()), new XElement("Count", Count.ToString()), new XElement("Sum", Sum.ToString()), new XElement("Status", Status.ToString()), diff --git a/FoodOrders/FoodOrdersListImplement/DataListSingleton.cs b/FoodOrders/FoodOrdersListImplement/DataListSingleton.cs index 87ce9fe..e8528ab 100644 --- a/FoodOrders/FoodOrdersListImplement/DataListSingleton.cs +++ b/FoodOrders/FoodOrdersListImplement/DataListSingleton.cs @@ -8,11 +8,13 @@ namespace FoodOrdersListImplement public List Components { get; set; } public List Orders { get; set; } public List Dishes { get; set; } + public List Clients { get; set; } private DataListSingleton() { Components = new List(); Orders = new List(); Dishes = new List(); + Clients = new List(); } public static DataListSingleton GetInstance() { diff --git a/FoodOrders/FoodOrdersListImplement/Implements/ClientStorage.cs b/FoodOrders/FoodOrdersListImplement/Implements/ClientStorage.cs index 543a5db..fd8fe63 100644 --- a/FoodOrders/FoodOrdersListImplement/Implements/ClientStorage.cs +++ b/FoodOrders/FoodOrdersListImplement/Implements/ClientStorage.cs @@ -7,6 +7,11 @@ namespace FoodOrdersListImplement.Implements { public class ClientStorage : IClientStorage { + private readonly DataListSingleton _source; + public ClientStorage() + { + _source = DataListSingleton.GetInstance(); + } public ClientViewModel? Delete(ClientBindingModel model) { throw new NotImplementedException(); @@ -19,12 +24,29 @@ namespace FoodOrdersListImplement.Implements public List GetFilteredList(ClientSearchModel model) { - throw new NotImplementedException(); + var result = new List(); + if (string.IsNullOrEmpty(model.Email)) + { + return result; + } + foreach (var component in _source.Clients) + { + if (component.Email.Contains(model.Email)) + { + result.Add(component.GetViewModel); + } + } + return result; } public List GetFullList() { - throw new NotImplementedException(); + var result = new List(); + foreach (var component in _source.Clients) + { + result.Add(component.GetViewModel); + } + return result; } public ClientViewModel? Insert(ClientBindingModel model) diff --git a/FoodOrders/FoodOrdersListImplement/Implements/ComponentStorage.cs b/FoodOrders/FoodOrdersListImplement/Implements/ComponentStorage.cs index 6986ceb..647ba43 100644 --- a/FoodOrders/FoodOrdersListImplement/Implements/ComponentStorage.cs +++ b/FoodOrders/FoodOrdersListImplement/Implements/ComponentStorage.cs @@ -22,8 +22,7 @@ namespace FoodOrdersListImplement.Implements } return result; } - public List GetFilteredList(ComponentSearchModel - model) + public List GetFilteredList(ComponentSearchModel model) { var result = new List(); if (string.IsNullOrEmpty(model.ComponentName)) diff --git a/FoodOrders/FoodOrdersListImplement/Implements/OrderStorage.cs b/FoodOrders/FoodOrdersListImplement/Implements/OrderStorage.cs index 736be23..539844c 100644 --- a/FoodOrders/FoodOrdersListImplement/Implements/OrderStorage.cs +++ b/FoodOrders/FoodOrdersListImplement/Implements/OrderStorage.cs @@ -30,6 +30,17 @@ namespace FoodOrdersListImplement.Implements public List GetFilteredList(OrderSearchModel model) { var result = new List(); + if (model.ClientId.HasValue) + { + foreach (var order in _source.Orders) + { + if (order.ClientId == model.ClientId) + { + result.Add(GetViewModel(order)); + } + } + return result; + } if (!model.Id.HasValue && model.DateFrom.HasValue && model.DateTo.HasValue) { foreach (var order in _source.Orders) @@ -78,6 +89,14 @@ namespace FoodOrdersListImplement.Implements break; } } + foreach (var client in _source.Clients) + { + if (client.Id == order.ClientId) + { + viewModel.ClientFIO = client.ClientFIO; + break; + } + } return viewModel; } diff --git a/FoodOrders/FoodOrdersListImplement/Models/Client.cs b/FoodOrders/FoodOrdersListImplement/Models/Client.cs index f5b497b..2657ed5 100644 --- a/FoodOrders/FoodOrdersListImplement/Models/Client.cs +++ b/FoodOrders/FoodOrdersListImplement/Models/Client.cs @@ -3,7 +3,7 @@ using FoodOrdersContracts.ViewModels; using FoodOrdersDataModels.Models; using System.Reflection; -namespace FoodOrdersListImplement.ViewModels +namespace FoodOrdersListImplement.Models { public class Client : IClientModel { diff --git a/FoodOrders/FoodOrdersListImplement/Models/Order.cs b/FoodOrders/FoodOrdersListImplement/Models/Order.cs index 6e34f50..a6b2b3e 100644 --- a/FoodOrders/FoodOrdersListImplement/Models/Order.cs +++ b/FoodOrders/FoodOrdersListImplement/Models/Order.cs @@ -9,6 +9,7 @@ namespace FoodOrdersListImplement.Models public class Order : IOrderModel { public int Id { get; private set; } + public int ClientId { get; private set; } public int DishId { get; private set; } public int Count { get; private set; } public double Sum { get; private set; } @@ -24,8 +25,9 @@ namespace FoodOrdersListImplement.Models } return new Order() { - Id = model.Id, + Id = model.Id, DishId = model.DishId, + ClientId = model.ClientId, Count = model.Count, Sum = model.Sum, Status = model.Status, @@ -46,6 +48,7 @@ namespace FoodOrdersListImplement.Models { Id = Id, DishId = DishId, + ClientId = ClientId, Count = Count, Sum = Sum, Status = Status,