diff --git a/Confectionery/ConfectionaryContracts/BindingModels/MessageInfoBindingModel.cs b/Confectionery/ConfectionaryContracts/BindingModels/MessageInfoBindingModel.cs new file mode 100644 index 0000000..85b4c39 --- /dev/null +++ b/Confectionery/ConfectionaryContracts/BindingModels/MessageInfoBindingModel.cs @@ -0,0 +1,19 @@ +using ConfectioneryDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryContracts.BindingModels +{ + public class MessageInfoBindingModel : IMessageInfoModel + { + public string MessageId { get; set; } = string.Empty; + public int? ClientId { get; set; } + public string SenderName { get; set; } = string.Empty; + public DateTime DateDelivery { get; set; } + public string Subject { get; set; } = string.Empty; + public string Body { get; set; } = string.Empty; + } +} diff --git a/Confectionery/ConfectionaryContracts/BusinessLogicsContracts/IMessageInfoLogic.cs b/Confectionery/ConfectionaryContracts/BusinessLogicsContracts/IMessageInfoLogic.cs new file mode 100644 index 0000000..a7898e6 --- /dev/null +++ b/Confectionery/ConfectionaryContracts/BusinessLogicsContracts/IMessageInfoLogic.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ConfectioneryContracts.SearchModels; +using ConfectioneryContracts.ViewModels; +using ConfectioneryContracts.BindingModels; + +namespace ConfectioneryContracts.BusinessLogicsContracts +{ + public interface IMessageInfoLogic + { + List? ReadList(MessageInfoSearchModel? model); + bool Create(MessageInfoBindingModel model); + } +} diff --git a/Confectionery/ConfectionaryContracts/SearchModels/MessageInfoSearchModel.cs b/Confectionery/ConfectionaryContracts/SearchModels/MessageInfoSearchModel.cs new file mode 100644 index 0000000..65a02d4 --- /dev/null +++ b/Confectionery/ConfectionaryContracts/SearchModels/MessageInfoSearchModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryContracts.SearchModels +{ + public class MessageInfoSearchModel + { + public string? MessageId { get; set; } + public int? ClientId { get; set; } + } +} diff --git a/Confectionery/ConfectionaryContracts/StoragesContracts/IMessageInfoStorage.cs b/Confectionery/ConfectionaryContracts/StoragesContracts/IMessageInfoStorage.cs new file mode 100644 index 0000000..18885ee --- /dev/null +++ b/Confectionery/ConfectionaryContracts/StoragesContracts/IMessageInfoStorage.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ConfectioneryContracts.ViewModels; +using ConfectioneryContracts.SearchModels; +using ConfectioneryContracts.BindingModels; + +namespace ConfectioneryContracts.StoragesContracts +{ + public interface IMessageInfoStorage + { + List GetFullList(); + List GetFilteredList(MessageInfoSearchModel model); + MessageInfoViewModel? GetElement(MessageInfoSearchModel model); + MessageInfoViewModel? Insert(MessageInfoBindingModel model); + } +} diff --git a/Confectionery/ConfectionaryContracts/ViewModels/MessageInfoViewModel.cs b/Confectionery/ConfectionaryContracts/ViewModels/MessageInfoViewModel.cs new file mode 100644 index 0000000..97bed74 --- /dev/null +++ b/Confectionery/ConfectionaryContracts/ViewModels/MessageInfoViewModel.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryContracts.ViewModels +{ + public class MessageInfoViewModel + { + public string MessageId { get; set; } = string.Empty; + public int? ClientId { get; set; } + [DisplayName("Отправитель")] + public string SenderName { get; set; } = string.Empty; + [DisplayName("Дата письма")] + public DateTime DateDelivery { get; set; } + [DisplayName("Заголовок")] + public string Subject { get; set; } = string.Empty; + [DisplayName("Текст")] + public string Body { get; set; } = string.Empty; + } +} diff --git a/Confectionery/ConfectionaryDataModels/Models/IMessageInfoModel.cs b/Confectionery/ConfectionaryDataModels/Models/IMessageInfoModel.cs new file mode 100644 index 0000000..b9ef9d2 --- /dev/null +++ b/Confectionery/ConfectionaryDataModels/Models/IMessageInfoModel.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryDataModels.Models +{ + public interface IMessageInfoModel + { + string MessageId { get; } + int? ClientId { get; } + string SenderName { get; } + DateTime DateDelivery { get; } + string Subject { get; } + string Body { get; } + } +} diff --git a/Confectionery/ConfectioneryBusinessLogic/BusinessLogics/MessageInfoLogic.cs b/Confectionery/ConfectioneryBusinessLogic/BusinessLogics/MessageInfoLogic.cs new file mode 100644 index 0000000..475e02c --- /dev/null +++ b/Confectionery/ConfectioneryBusinessLogic/BusinessLogics/MessageInfoLogic.cs @@ -0,0 +1,53 @@ +using ConfectioneryContracts.BusinessLogicsContracts; +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.SearchModels; +using ConfectioneryContracts.StoragesContracts; +using ConfectioneryContracts.ViewModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryBusinessLogic.BusinessLogics +{ + public class MessageInfoLogic : IMessageInfoLogic + { + private readonly ILogger _logger; + private readonly IMessageInfoStorage _messageStorage; + public MessageInfoLogic(ILogger logger, IMessageInfoStorage messageStorage) + { + _logger = logger; + _messageStorage = messageStorage; + } + public List? ReadList(MessageInfoSearchModel? model) + { + _logger.LogInformation("ReadList. MessageId: {MessageId}. ClientId: {ClientId}", model?.MessageId, model?.ClientId); + + var list = model == null ? _messageStorage.GetFullList() : _messageStorage.GetFilteredList(model); + if (list == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + + _logger.LogInformation("ReadList. Count: {Count}", list.Count); + return list; + } + public bool Create(MessageInfoBindingModel model) + { + if (model == null) + { + return false; + } + + if (_messageStorage.Insert(model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + return true; + } + } +} diff --git a/Confectionery/ConfectioneryDatabaseImplement/ConfectioneryDatabase.cs b/Confectionery/ConfectioneryDatabaseImplement/ConfectioneryDatabase.cs index 01c96dc..1a2e1a3 100644 --- a/Confectionery/ConfectioneryDatabaseImplement/ConfectioneryDatabase.cs +++ b/Confectionery/ConfectioneryDatabaseImplement/ConfectioneryDatabase.cs @@ -24,5 +24,6 @@ namespace ConfectioneryDatabaseImplement public virtual DbSet Orders { set; get; } public virtual DbSet Clients { set; get; } public virtual DbSet Implementers { set; get; } + public virtual DbSet MessagesInfo { get; set; } } } diff --git a/Confectionery/ConfectioneryDatabaseImplement/Implements/MessageInfoStorage.cs b/Confectionery/ConfectioneryDatabaseImplement/Implements/MessageInfoStorage.cs new file mode 100644 index 0000000..ccf9df9 --- /dev/null +++ b/Confectionery/ConfectioneryDatabaseImplement/Implements/MessageInfoStorage.cs @@ -0,0 +1,61 @@ +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.SearchModels; +using ConfectioneryContracts.ViewModels; +using ConfectioneryDatabaseImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryDatabaseImplement.Implements +{ + public class MessageInfoStorage + { + public List GetFullList() + { + using var context = new ConfectioneryDatabase(); + return context.MessagesInfo + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(MessageInfoSearchModel model) + { + if (!model.ClientId.HasValue) + { + return new(); + } + + using var context = new ConfectioneryDatabase(); + return context.MessagesInfo + .Where(x => x.ClientId == model.ClientId) + .Select(x => x.GetViewModel) + .ToList(); + } + public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) + { + if (string.IsNullOrEmpty(model.MessageId)) + { + return null; + } + + using var context = new ConfectioneryDatabase(); + return context.MessagesInfo + .FirstOrDefault(x => x.MessageId == model.MessageId) + ?.GetViewModel; + } + public MessageInfoViewModel? Insert(MessageInfoBindingModel model) + { + var newMessage = MessageInfo.Create(model); + if (newMessage == null) + { + return null; + } + + using var context = new ConfectioneryDatabase(); + context.MessagesInfo.Add(newMessage); + context.SaveChanges(); + return newMessage.GetViewModel; + } + } +} diff --git a/Confectionery/ConfectioneryDatabaseImplement/Models/MessageInfo.cs b/Confectionery/ConfectioneryDatabaseImplement/Models/MessageInfo.cs new file mode 100644 index 0000000..5810f24 --- /dev/null +++ b/Confectionery/ConfectioneryDatabaseImplement/Models/MessageInfo.cs @@ -0,0 +1,54 @@ +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.ViewModels; +using ConfectioneryDataModels.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryDatabaseImplement.Models +{ + public class MessageInfo : IMessageInfoModel + { + [Key] + public string MessageId { get; set; } = string.Empty; + public int? ClientId { get; set; } + public virtual Client? Client { 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 static MessageInfo? Create(MessageInfoBindingModel model) + { + if (model == null) + { + return null; + } + + return new() + { + MessageId = model.MessageId, + ClientId = model.ClientId, + SenderName = model.SenderName, + DateDelivery = model.DateDelivery, + Subject = model.Subject, + Body = model.Body, + }; + } + public MessageInfoViewModel GetViewModel => new() + { + MessageId = MessageId, + ClientId = ClientId, + SenderName = SenderName, + DateDelivery = DateDelivery, + Subject = Subject, + Body = Body + }; + } +} diff --git a/Confectionery/ConfectioneryFileImplement/DataFileSingleton.cs b/Confectionery/ConfectioneryFileImplement/DataFileSingleton.cs index 3160170..1fa4ed2 100644 --- a/Confectionery/ConfectioneryFileImplement/DataFileSingleton.cs +++ b/Confectionery/ConfectioneryFileImplement/DataFileSingleton.cs @@ -17,11 +17,13 @@ namespace ConfectioneryFileImplement private readonly string PastryFileName = "Pastry.xml"; private readonly string ClientFileName = "Client.xml"; private readonly string ImplementerFileName = "Implementer.xml"; + private readonly string MessageInfoFileName = "MessageInfo.xml"; public List Components { get; private set; } public List Orders { get; private set; } public List Pastries { get; private set; } public List Clients { get; private set; } public List Implementers { get; private set; } + public List MessagesInfo { get; private set; } public static DataFileSingleton GetInstance() { if (instance == null) @@ -35,6 +37,7 @@ namespace ConfectioneryFileImplement public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); public void SaveClients() => SaveData(Clients, ClientFileName, "Clients", x => x.GetXElement); public void SaveImplementers() => SaveData(Implementers, ImplementerFileName, "Implementers", x => x.GetXElement); + public void SaveMessagesInfo() => SaveData(MessagesInfo, MessageInfoFileName, "MessagesInfo", x => x.GetXElement); private DataFileSingleton() { Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!; @@ -42,6 +45,7 @@ namespace ConfectioneryFileImplement Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!; Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!; + MessagesInfo = LoadData(MessageInfoFileName, "MessageInfo", x => MessageInfo.Create(x)!)!; } private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) diff --git a/Confectionery/ConfectioneryFileImplement/Implements/MessageInfoStorage.cs b/Confectionery/ConfectioneryFileImplement/Implements/MessageInfoStorage.cs new file mode 100644 index 0000000..ff44f11 --- /dev/null +++ b/Confectionery/ConfectioneryFileImplement/Implements/MessageInfoStorage.cs @@ -0,0 +1,62 @@ +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.SearchModels; +using ConfectioneryContracts.ViewModels; +using ConfectioneryFileImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryFileImplement.Implements +{ + public class MessageInfoStorage + { + private readonly DataFileSingleton _source; + public MessageInfoStorage() + { + _source = DataFileSingleton.GetInstance(); + } + public List GetFullList() + { + return _source.MessagesInfo + .Select(x => x.GetViewModel) + .ToList(); + } + public List GetFilteredList(MessageInfoSearchModel model) + { + if (!model.ClientId.HasValue) + { + return new(); + } + + return _source.MessagesInfo + .Where(x => x.ClientId == model.ClientId) + .Select(x => x.GetViewModel) + .ToList(); + } + public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) + { + if (string.IsNullOrEmpty(model.MessageId)) + { + return null; + } + + return _source.MessagesInfo + .FirstOrDefault(x => x.MessageId == model.MessageId) + ?.GetViewModel; + } + public MessageInfoViewModel? Insert(MessageInfoBindingModel model) + { + var newMessage = MessageInfo.Create(model); + if (newMessage == null) + { + return null; + } + + _source.MessagesInfo.Add(newMessage); + _source.SaveMessagesInfo(); + return newMessage.GetViewModel; + } + } +} diff --git a/Confectionery/ConfectioneryFileImplement/Models/MessageInfo.cs b/Confectionery/ConfectioneryFileImplement/Models/MessageInfo.cs new file mode 100644 index 0000000..4e0fff1 --- /dev/null +++ b/Confectionery/ConfectioneryFileImplement/Models/MessageInfo.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.ViewModels; +using System.Xml.Linq; +using ConfectioneryDataModels.Models; + +namespace ConfectioneryFileImplement.Models +{ + public class MessageInfo : IMessageInfoModel + { + public string MessageId { get; set; } = string.Empty; + public int? ClientId { get; set; } + public string SenderName { get; set; } = string.Empty; + public DateTime DateDelivery { get; set; } + public string Subject { get; set; } = string.Empty; + public string Body { get; set; } = string.Empty; + public static MessageInfo? Create(MessageInfoBindingModel model) + { + if (model == null) + { + return null; + } + + return new() + { + MessageId = model.MessageId, + ClientId = model.ClientId, + SenderName = model.SenderName, + DateDelivery = model.DateDelivery, + Subject = model.Subject, + Body = model.Body, + }; + } + public static MessageInfo? Create(XElement element) + { + if (element == null) + { + return null; + } + + return new() + { + MessageId = element.Attribute("MessageId")!.Value, + ClientId = Convert.ToInt32(element.Attribute("ClientId")!.Value), + SenderName = element.Attribute("SenderName")!.Value, + DateDelivery = Convert.ToDateTime(element.Attribute("DateDelivery")!.Value), + Subject = element.Attribute("Subject")!.Value, + Body = element.Attribute("Body")!.Value + }; + } + public MessageInfoViewModel GetViewModel => new() + { + MessageId = MessageId, + ClientId = ClientId, + SenderName = SenderName, + DateDelivery = DateDelivery, + Subject = Subject, + Body = Body + }; + public XElement GetXElement => new("MessageInfo", + new XAttribute("MessageId", MessageId), + new XAttribute("ClientId", ClientId), + new XAttribute("SenderName", SenderName), + new XAttribute("DateDelivery", DateDelivery), + new XAttribute("Subject", Subject), + new XAttribute("Body", Body)); + } +} diff --git a/Confectionery/ConfectioneryListImplement/DataListSingleton.cs b/Confectionery/ConfectioneryListImplement/DataListSingleton.cs index 40b202d..02826ef 100644 --- a/Confectionery/ConfectioneryListImplement/DataListSingleton.cs +++ b/Confectionery/ConfectioneryListImplement/DataListSingleton.cs @@ -15,6 +15,7 @@ namespace ConfectioneryListImplement public List Pastries { get; set; } public List Clients { get; set; } public List Implementers { get; set; } + public List MessagesInfo { get; set; } private DataListSingleton() { Components = new List(); @@ -22,6 +23,7 @@ namespace ConfectioneryListImplement Pastries = new List(); Clients = new List(); Implementers = new List(); + MessagesInfo = new List(); } public static DataListSingleton GetInstance() { diff --git a/Confectionery/ConfectioneryListImplement/Implements/MessageInfoStorage.cs b/Confectionery/ConfectioneryListImplement/Implements/MessageInfoStorage.cs new file mode 100644 index 0000000..aba6ebd --- /dev/null +++ b/Confectionery/ConfectioneryListImplement/Implements/MessageInfoStorage.cs @@ -0,0 +1,73 @@ +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.SearchModels; +using ConfectioneryContracts.ViewModels; +using ConfectioneryListImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryListImplement.Implements +{ + public class MessageInfoStorage + { + private readonly DataListSingleton _source; + public MessageInfoStorage() + { + _source = DataListSingleton.GetInstance(); + } + public List GetFullList() + { + var result = new List(); + foreach (var message in _source.MessagesInfo) + { + result.Add(message.GetViewModel); + } + return result; + } + public List GetFilteredList(MessageInfoSearchModel model) + { + var result = new List(); + + if (!model.ClientId.HasValue) + { + return new(); + } + + foreach (var message in _source.MessagesInfo) + { + if (message.ClientId == model.ClientId) + { + result.Add(message.GetViewModel); + } + } + return result; + } + public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) + { + if (string.IsNullOrEmpty(model.MessageId)) + { + return null; + } + + foreach (var message in _source.MessagesInfo) + { + if (model.MessageId.Equals(message.MessageId)) + return message.GetViewModel; + } + return null; + } + public MessageInfoViewModel? Insert(MessageInfoBindingModel model) + { + var newMessage = MessageInfo.Create(model); + if (newMessage == null) + { + return null; + } + + _source.MessagesInfo.Add(newMessage); + return newMessage.GetViewModel; + } + } +} diff --git a/Confectionery/ConfectioneryListImplement/Models/MessageInfo.cs b/Confectionery/ConfectioneryListImplement/Models/MessageInfo.cs new file mode 100644 index 0000000..50eb1e1 --- /dev/null +++ b/Confectionery/ConfectioneryListImplement/Models/MessageInfo.cs @@ -0,0 +1,46 @@ +using ConfectioneryContracts.BindingModels; +using ConfectioneryContracts.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConfectioneryListImplement.Models +{ + public class MessageInfo + { + public string MessageId { get; set; } = string.Empty; + public int? ClientId { get; set; } + public string SenderName { get; set; } = string.Empty; + public DateTime DateDelivery { get; set; } + public string Subject { get; set; } = string.Empty; + public string Body { get; set; } = string.Empty; + public static MessageInfo? Create(MessageInfoBindingModel model) + { + if (model == null) + { + return null; + } + + return new() + { + MessageId = model.MessageId, + ClientId = model.ClientId, + SenderName = model.SenderName, + DateDelivery = model.DateDelivery, + Subject = model.Subject, + Body = model.Body, + }; + } + public MessageInfoViewModel GetViewModel => new() + { + MessageId = MessageId, + ClientId = ClientId, + SenderName = SenderName, + DateDelivery = DateDelivery, + Subject = Subject, + Body = Body + }; + } +}