diff --git a/SushiBarFileImplement/DataFileSingleton.cs b/SushiBarFileImplement/DataFileSingleton.cs index 7f5603c..05eda16 100644 --- a/SushiBarFileImplement/DataFileSingleton.cs +++ b/SushiBarFileImplement/DataFileSingleton.cs @@ -13,9 +13,12 @@ namespace SushiBarFileImplement private readonly string SushiFileName = "Sushi.xml"; + private readonly string ClientFileName = "Client.xml"; + public List Components { get; private set; } public List Orders { get; private set; } public List Sushis { get; private set; } + public List Clients { get; private set; } public static DataFileSingleton GetInstance() { @@ -29,12 +32,14 @@ namespace SushiBarFileImplement public void SaveComponents() => SaveData(Components, ComponentFileName, "Components", x => x.GetXElement); public void SaveSushis() => SaveData(Sushis, SushiFileName, "Sushis", 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)!)!; Sushis = LoadData(SushiFileName, "Sushi", x => Sushi.Create(x)!)!; Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; + Clients = LoadData(ClientFileName, "Order", x => Client.Create(x)!)!; } private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) diff --git a/SushiBarFileImplement/Implements/ClientStorage.cs b/SushiBarFileImplement/Implements/ClientStorage.cs new file mode 100644 index 0000000..efc6a96 --- /dev/null +++ b/SushiBarFileImplement/Implements/ClientStorage.cs @@ -0,0 +1,71 @@ +using SushiBarContracts.BindingModel; +using SushiBarContracts.SearchModel; +using SushiBarContracts.ViewModels; +using SushiBarFileImplement.Models; + +namespace SushiBarFileImplement.Implements +{ + public class ClientStorage + { + private readonly DataFileSingleton source; + public ClientStorage() + { + source = DataFileSingleton.GetInstance(); + } + public List GetFullList() + { + return source.Clients.Select(x => x.GetViewModel).ToList(); + } + public List GetFilteredList(ClientSearchModel model) + { + if (string.IsNullOrEmpty(model.Email)) + { + return new(); + } + return source.Clients.Where(x => x.Email.Contains(model.Email)).Select(x => x.GetViewModel).ToList(); + } + public ClientViewModel? GetElement(ClientSearchModel model) + { + if (string.IsNullOrEmpty(model.Email) && !model.Id.HasValue) + { + return null; + } + return source.Clients.FirstOrDefault(x => (!string.IsNullOrEmpty(model.Email) && + x.Email == model.Email) || (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; + } + public ClientViewModel? Insert(ClientBindingModel model) + { + model.Id = source.Clients.Count > 0 ? source.Clients.Max(x => x.Id) + 1 : 1; + var newClient = Client.Create(model); + if (newClient == null) + { + return null; + } + source.Clients.Add(newClient); + source.SaveClients(); + return newClient.GetViewModel; + } + public ClientViewModel? Update(ClientBindingModel model) + { + var client = source.Clients.FirstOrDefault(x => x.Id == model.Id); + if (client == null) + { + return null; + } + client.Update(model); + source.SaveClients(); + return client.GetViewModel; + } + public ClientViewModel? Delete(ClientBindingModel model) + { + var element = source.Clients.FirstOrDefault(x => x.Id == model.Id); + if (element != null) + { + source.Clients.Remove(element); + source.SaveClients(); + return element.GetViewModel; + } + return null; + } + } +} diff --git a/SushiBarFileImplement/Models/Client.cs b/SushiBarFileImplement/Models/Client.cs new file mode 100644 index 0000000..5a837bd --- /dev/null +++ b/SushiBarFileImplement/Models/Client.cs @@ -0,0 +1,67 @@ +using SushiBarContracts.BindingModel; +using SushiBarContracts.ViewModels; +using SushiBarDataModels; +using System.Xml.Linq; + +namespace SushiBarFileImplement.Models +{ + public class Client : IClientModel + { + public int Id { get; private set; } + public string ClientFIO { get; private set; } = string.Empty; + public string Email { get; private set; } = string.Empty; + public string Password { get; private set; } = string.Empty; + public static Client? Create(ClientBindingModel model) + { + if (model == null) + { + return null; + } + return new Client() + { + Id = model.Id, + ClientFIO = model.ClientFIO, + Email = model.Email, + Password = model.Password + }; + } + public static Client? Create(XElement element) + { + if (element == null) + { + return null; + } + return new Client() + { + Id = Convert.ToInt32(element.Attribute("Id")!.Value), + ClientFIO = element.Element("ClientFIO")!.Value, + Email = element.Element("Email")!.Value, + Password = element.Element("Password")!.Value, + }; + } + public void Update(ClientBindingModel model) + { + if (model == null) + { + return; + } + ClientFIO = model.ClientFIO; + Email = model.Email; + Password = model.Password; + } + public ClientViewModel GetViewModel => new() + { + Id = Id, + ClientFIO = ClientFIO, + Email = Email, + Password = Password + }; + public XElement GetXElement => + new("Client", + new XAttribute("Id", Id), + new XElement("ClientFIO", ClientFIO), + new XElement("Email", Email), + new XElement("Password", Password) + ); + } +} diff --git a/SushiBarFileImplement/Models/Order.cs b/SushiBarFileImplement/Models/Order.cs index 6cb0e56..3e81a93 100644 --- a/SushiBarFileImplement/Models/Order.cs +++ b/SushiBarFileImplement/Models/Order.cs @@ -10,6 +10,7 @@ namespace SushiBarFileImplement.Models { public int Id { get; private set; } public int SushiId { 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; } = OrderStatus.Неизвестен; @@ -27,6 +28,7 @@ namespace SushiBarFileImplement.Models SushiId = model.SushiId, Count = model.Count, Sum = model.Sum, + ClientId = model.ClientId, Status = model.Status, DateCreate = model.DateCreate, DateImplement = model.DateImplement @@ -42,6 +44,7 @@ namespace SushiBarFileImplement.Models { Id = Convert.ToInt32(element.Attribute("Id")!.Value), SushiId = Convert.ToInt32(element.Element("SushiId")!.Value), + ClientId = Convert.ToInt32(element.Element("ClientId")!.Value), Count = Convert.ToInt32(element.Element("Count")!.Value), Sum = Convert.ToDouble(element.Element("Sum")!.Value), Status = (OrderStatus)Enum.Parse(typeof(OrderStatus), element.Element("Status")!.Value), @@ -68,11 +71,13 @@ namespace SushiBarFileImplement.Models Status = Status, DateCreate = DateCreate, DateImplement = DateImplement, + ClientId = ClientId, }; public XElement GetXElement => new("Order", new XAttribute("Id", Id), new XElement("SushiId", SushiId.ToString()), + new XElement("ClientId", ClientId.ToString()), new XElement("Count", SushiId.ToString()), new XElement("Sum", Sum.ToString()), new XElement("Status", Status.ToString()),