ISEbd-21.Fedotov.I.A.LabWork07 #7

Closed
Ilfedotov.01 wants to merge 2 commits from ISEbd-21.Fedotov.I.A.LabWork07 into ISEbd-21.Fedotov.I.A.LabWork06
19 changed files with 542 additions and 5 deletions
Showing only changes of commit 0fc1db980f - Show all commits

View File

@ -0,0 +1,22 @@
using DinerDataModels.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DinerContracts.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;
}
}

View File

@ -0,0 +1,17 @@
using DinerContracts.BindingModels;
using DinerContracts.SearchModels;
using DinerContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DinerContracts.BusinessLogicsContracts {
public interface IMessageInfoLogic {
List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model);
bool Create(MessageInfoBindingModel model);
}
}

View File

@ -0,0 +1,17 @@
using DinerContracts.BindingModels;
using DinerContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DinerContracts.SearchModels {
public interface IMessageInfoStorage {
List<MessageInfoViewModel> GetFullList();
List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model);
MessageInfoViewModel? GetElement(MessageInfoSearchModel model);
MessageInfoViewModel? Insert(MessageInfoBindingModel model);
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DinerContracts.SearchModels
{
public class MessageInfoSearchModel
{
public int? ClientID { get; set; }
public string? MessageID { get; set; }
}
}

View File

@ -0,0 +1,27 @@
using DinerDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DinerContracts.ViewModels {
public class MessageInfoViewModel : IMessageInfoModel {
public string MessageID { get; set; } = string.Empty;
public int? ClientID { get; set; }
[DisplayName("Отправитель")]
public string SenderName { get; set; } = string.Empty;
[DisplayName("Дата письма")]
public DateTime DateDelivery { get; set; }
[DisplayName("Заголовоск")]
public string Subject { get; set; } = string.Empty;
[DisplayName("Текст")]
public string Body { get; set; } = string.Empty;
}
}

View File

@ -17,5 +17,6 @@ namespace DinerDataBaseImplement
public virtual DbSet<Order> Orders { get; set; } public virtual DbSet<Order> Orders { get; set; }
public virtual DbSet<Client> Clients { get; set; } public virtual DbSet<Client> Clients { get; set; }
public virtual DbSet<Implementer> Implementers { get; set; } public virtual DbSet<Implementer> Implementers { get; set; }
public virtual DbSet<MessageInfo> MessageInfos { get; set; }
} }
} }

View File

@ -0,0 +1,50 @@
using DinerContracts.BindingModels;
using DinerContracts.SearchModels;
using DinerContracts.ViewModels;
using DinerDataBaseImplement.Models;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DinerDataBaseImplement.Implements {
public class MessageInfoStorage : IMessageInfoStorage {
public MessageInfoViewModel? Insert(MessageInfoBindingModel model) {
using var context = new DinerDatabaseBy6Work();
var newMessageInfo = MessageInfo.Create(context, model);
if (newMessageInfo == null) {
return null;
}
context.MessageInfos.Add(newMessageInfo);
context.SaveChanges();
return newMessageInfo.GetViewModel;
}
public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) {
using var context = new DinerDatabaseBy6Work();
if (!string.IsNullOrEmpty(model.MessageID)) {
return context.MessageInfos.FirstOrDefault(x => string.IsNullOrEmpty(model.MessageID) &&
model.MessageID == x.MessageID)?.GetViewModel;
}
return new();
}
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model) {
if (string.IsNullOrEmpty(model.MessageID)) {
return new();
}
using var context = new DinerDatabaseBy6Work();
return context.MessageInfos.
Where(x => x.MessageID.Contains(model.MessageID)).Select(x => x.GetViewModel).ToList();
}
public List<MessageInfoViewModel> GetFullList() {
using var context = new DinerDatabaseBy6Work();
return context.MessageInfos.Select(x => x.GetViewModel).ToList();
}
}
}

View File

@ -0,0 +1,57 @@
using DinerContracts.BindingModels;
using DinerContracts.ViewModels;
using DinerDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DinerDataBaseImplement.Models {
public class MessageInfo : IMessageInfoModel {
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) {
if (model == null) {
return null;
}
return new MessageInfo() {
MessageID = model.MessageID,
SenderName = model.SenderName,
DateDelivery = model.DateDelivery,
Subject = model.Subject,
Body = model.Body,
Client = context.Clients.FirstOrDefault(x => x.Email == model.SenderName)
};
}
public MessageInfoViewModel GetViewModel => new() {
MessageID = MessageID,
ClientID = ClientID,
SenderName = SenderName,
DateDelivery = DateDelivery,
Subject = Subject,
Body = Body,
};
}
}

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DinerDataModels.Models {
public interface IMessageInfoModel {
string MessageID { get; }
int? ClientID { get; }
string SenderName { get; }
DateTime DateDelivery { get; }
string Subject { get; }
string Body { get; }
}
}

View File

@ -16,6 +16,7 @@ namespace DinerListImplement
public List<Order> Orders { get; set; } public List<Order> Orders { get; set; }
public List<Client> Clients { get; set; } public List<Client> Clients { get; set; }
public List<Implementer> Implementers { get; set; } public List<Implementer> Implementers { get; set; }
public List<MessageInfo> MessageInfos { get; set; }
private DataListSingleton() { private DataListSingleton() {
Foods = new List<Food>(); Foods = new List<Food>();
@ -23,6 +24,7 @@ namespace DinerListImplement
Orders = new List<Order>(); Orders = new List<Order>();
Clients = new List<Client>(); Clients = new List<Client>();
Implementers = new List<Implementer>(); Implementers = new List<Implementer>();
MessageInfos = new List<MessageInfo>();
} }
public static DataListSingleton GetInstance() { public static DataListSingleton GetInstance() {
if (_instance == null) _instance = new DataListSingleton(); if (_instance == null) _instance = new DataListSingleton();

View File

@ -0,0 +1,65 @@
using DinerContracts.BindingModels;
using DinerContracts.SearchModels;
using DinerContracts.ViewModels;
using DinerListImplement.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace DinerListImplement.Implements {
public class MessageInfoStorage : IMessageInfoStorage {
private readonly DataListSingleton _source;
public MessageInfoStorage() {
_source = DataListSingleton.GetInstance();
}
public MessageInfoViewModel? Insert(MessageInfoBindingModel model) {
var newMessageInfo = MessageInfo.Create(model);
if (newMessageInfo == null) {
return null;
}
_source.MessageInfos.Add(newMessageInfo);
return newMessageInfo.GetViewModel;
}
public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) {
if (string.IsNullOrEmpty(model.MessageID)) {
return null;
}
foreach(var messageInfos in _source.MessageInfos) {
if ((!string.IsNullOrEmpty(model.MessageID) &&
messageInfos.MessageID == model.MessageID)) {
return messageInfos.GetViewModel;
}
}
return null;
}
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model) {
var result = new List<MessageInfoViewModel>();
if (string.IsNullOrEmpty(model.MessageID)) {
return result;
}
foreach (var messageInfos in _source.MessageInfos) {
if (messageInfos.MessageID.Contains(model.MessageID)) {
result.Add(messageInfos.GetViewModel);
}
}
return result;
}
public List<MessageInfoViewModel> GetFullList() {
var result = new List<MessageInfoViewModel>();
foreach (var messageInfos in _source.MessageInfos) {
result.Add(messageInfos.GetViewModel);
}
return result;
}
}
}

View File

@ -28,6 +28,7 @@ namespace DinerListImplement.Models {
Password = model.Password, Password = model.Password,
WorkExperience = model.WorkExperience, WorkExperience = model.WorkExperience,
Qualification = model.Qualification, Qualification = model.Qualification,
ID = model.ID,
}; };
} }
public void Update(ImplementerBindingModel? model) { public void Update(ImplementerBindingModel? model) {

View File

@ -0,0 +1,47 @@
using DinerContracts.BindingModels;
using DinerContracts.ViewModels;
using DinerDataModels.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DinerListImplement.Models {
public class MessageInfo : IMessageInfoModel {
public string MessageID { get; private set; } = string.Empty;
public int? ClientID { get; set; }
public string SenderName { get; private set; } = string.Empty;
public DateTime DateDelivery { get; set; }
public string Subject { get; private set; } = string.Empty;
public string Body { get; private set; } = string.Empty;
public static MessageInfo? Create(MessageInfoBindingModel? model) {
if (model == null) {
return null;
}
return new MessageInfo() {
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
};
}
}

View File

@ -22,11 +22,14 @@ namespace DinerFileImplement
private readonly string ImplementerFileName = "Implementer.xml"; private readonly string ImplementerFileName = "Implementer.xml";
private readonly string MessageInfoFileName = "MessageInfo.xml";
public List<Food> Foods { get; set; } public List<Food> Foods { get; set; }
public List<Order> Orders { get; private set; } public List<Order> Orders { get; private set; }
public List<Snack> Snacks { get; private set; } public List<Snack> Snacks { get; private set; }
public List<Client> Clients { get; private set; } public List<Client> Clients { get; private set; }
public List<Implementer> Implementers { get; private set; } public List<Implementer> Implementers { get; private set; }
public List<MessageInfo> MessageInfos { get; private set; }
private DataFileSingleton() { private DataFileSingleton() {
Foods = LoadData(FoodFileName, "Food", x => Food.Create(x)!)!; Foods = LoadData(FoodFileName, "Food", x => Food.Create(x)!)!;
@ -34,6 +37,7 @@ namespace DinerFileImplement
Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!;
Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!; Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!;
Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!; Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!;
MessageInfos = LoadData(MessageInfoFileName, "MessageInfo", x => MessageInfo.Create(x)!)!;
} }
public static DataFileSingleton GetInstance() { public static DataFileSingleton GetInstance() {
if (instance == null) instance = new DataFileSingleton(); if (instance == null) instance = new DataFileSingleton();
@ -49,6 +53,8 @@ namespace DinerFileImplement
x => x.GetXElement); x => x.GetXElement);
public void SaveImplementer() => SaveData(Implementers, ImplementerFileName, "Implementers", public void SaveImplementer() => SaveData(Implementers, ImplementerFileName, "Implementers",
x => x.GetXElement); x => x.GetXElement);
public void SaveMessageInfo() => SaveData(MessageInfos, MessageInfoFileName, "MessageInfo",
x => x.GetXElement);
private static void SaveData<T>(List<T> data, string filename, string xmlNodeName, private static void SaveData<T>(List<T> data, string filename, string xmlNodeName,
Func<T, XElement> selectFunction) Func<T, XElement> selectFunction)

View File

@ -0,0 +1,50 @@
using DinerContracts.BindingModels;
using DinerContracts.SearchModels;
using DinerContracts.ViewModels;
using DinerFileImplement.Models;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DinerFileImplement.Implements {
public class MessageInfoStorage : IMessageInfoStorage {
private readonly DataFileSingleton _source;
private MessageInfoStorage() {
_source = DataFileSingleton.GetInstance();
}
public MessageInfoViewModel? Insert(MessageInfoBindingModel model) {
var newMessageInfo = MessageInfo.Create(model);
if (newMessageInfo == null) {
return null;
}
_source.MessageInfos.Add(newMessageInfo);
_source.SaveMessageInfo();
return newMessageInfo.GetViewModel;
}
public MessageInfoViewModel? GetElement(MessageInfoSearchModel model) {
if (string.IsNullOrEmpty(model.MessageID)) {
return null;
}
return _source.MessageInfos.FirstOrDefault(x => (!string.IsNullOrEmpty(model.MessageID) &&
x.MessageID == model.MessageID))?.GetViewModel;
}
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model) {
if (string.IsNullOrEmpty(model.MessageID)) {
return new();
}
return _source.MessageInfos.Where(x => x.MessageID.Contains(model.MessageID)).Select(x => x.GetViewModel).ToList();
}
public List<MessageInfoViewModel> GetFullList() {
return _source.MessageInfos.Select(x => x.GetViewModel).ToList();
}
}
}

View File

@ -0,0 +1,69 @@
using DinerContracts.BindingModels;
using DinerContracts.ViewModels;
using DinerDataModels.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace DinerFileImplement.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 MessageInfo() {
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 MessageInfo() {
MessageID = element.Element("MessageID")!.Value,
ClientID = Convert.ToInt32(element.Element("ClientID")!.Value),
SenderName = element.Element("SenderName")!.Value,
DateDelivery = Convert.ToDateTime(element.Element("DateImplement")!.Value),
Subject = element.Element("Subject")!.Value,
Body = element.Element("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 XElement("ClientID", ClientID.ToString()),
new XElement("SenderName", SenderName),
new XElement("DateDelivery", DateDelivery.ToString()),
new XElement("Subject", Subject),
new XElement("Body", Body));
}
}

View File

@ -1,5 +1,6 @@
using DinerContracts.BusinessLogicsContacts; using DinerContracts.BusinessLogicsContacts;
using DinerContracts.BusinessLogicsContracts; using DinerContracts.BusinessLogicsContracts;
using DinerContracts.SearchModels;
using DinerContracts.StoragesContracts; using DinerContracts.StoragesContracts;
using DinerDataBaseImplement.Implements; using DinerDataBaseImplement.Implements;
using DineryBusinessLogic.BusinessLogic; using DineryBusinessLogic.BusinessLogic;
@ -42,6 +43,7 @@ namespace DinerView
services.AddTransient<IImplementerStorage, ImplementerStorage>(); services.AddTransient<IImplementerStorage, ImplementerStorage>();
services.AddTransient<ISnackStorage, SnackStorage>(); services.AddTransient<ISnackStorage, SnackStorage>();
services.AddTransient<IClientStorage, ClientStorage>(); services.AddTransient<IClientStorage, ClientStorage>();
services.AddTransient<IMessageInfoStorage, MessageInfoStorage>();
services.AddTransient<IClientLogic, ClientLogic>(); services.AddTransient<IClientLogic, ClientLogic>();
services.AddTransient<IFoodLogic, FoodLogic>(); services.AddTransient<IFoodLogic, FoodLogic>();
@ -50,8 +52,9 @@ namespace DinerView
services.AddTransient<ISnackLogic, SnackLogic>(); services.AddTransient<ISnackLogic, SnackLogic>();
services.AddTransient<IReportLogic, ReportLogic>(); services.AddTransient<IReportLogic, ReportLogic>();
services.AddTransient<IWorkProcess, WorkModelling>(); services.AddTransient<IWorkProcess, WorkModelling>();
services.AddTransient<IMessageInfoLogic, MessageInfoLogic>();
services.AddTransient<AbstractSaveToExcel, SaveToExcel>(); services.AddTransient<AbstractSaveToExcel, SaveToExcel>();
services.AddTransient<AbstractSaveToWord, SaveToWord>(); services.AddTransient<AbstractSaveToWord, SaveToWord>();
services.AddTransient<AbstractSaveToPdf, SaveToPdf>(); services.AddTransient<AbstractSaveToPdf, SaveToPdf>();

View File

@ -3,6 +3,7 @@ using DinerContracts.BusinessLogicsContracts;
using DinerContracts.SearchModels; using DinerContracts.SearchModels;
using DinerContracts.StoragesContracts; using DinerContracts.StoragesContracts;
using DinerContracts.ViewModels; using DinerContracts.ViewModels;
using DocumentFormat.OpenXml.Office2016.Drawing.Command;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -87,16 +88,16 @@ namespace DineryBusinessLogic.BusinessLogic {
throw new ArgumentNullException("Нет ФИО исполнителя", nameof(model.ImplementerFIO)); throw new ArgumentNullException("Нет ФИО исполнителя", nameof(model.ImplementerFIO));
} }
if (string.IsNullOrEmpty(model.Password)) { if (string.IsNullOrEmpty(model.Password)) {
throw new ArgumentNullException("Нет пароля"); throw new ArgumentNullException("Нет пароля", nameof(model.Password));
} }
if (string.IsNullOrEmpty((model.WorkExperience).ToString())) { if (string.IsNullOrEmpty((model.WorkExperience).ToString())) {
throw new ArgumentNullException("Не указан стаж"); throw new ArgumentNullException("Не указан стаж", nameof(model.WorkExperience));
} }
if (string.IsNullOrEmpty((model.Qualification).ToString())) { if (string.IsNullOrEmpty((model.Qualification).ToString())) {
throw new ArgumentNullException("Нет квалификации"); throw new ArgumentNullException("Нет квалификации", nameof(model.Qualification));
} }
if (string.IsNullOrEmpty((model.ID).ToString())) { if (string.IsNullOrEmpty((model.ID).ToString())) {
throw new ArgumentNullException("Нет ID пользователя", nameof(model.ID)); throw new ArgumentNullException("Нет ID исполнителя", nameof(model.ID));
} }
_logger.LogInformation($"Implementer. ID:{model.ID}.ImplementerFIO:{model.ImplementerFIO}.WorkExperience:{model.WorkExperience}." + _logger.LogInformation($"Implementer. ID:{model.ID}.ImplementerFIO:{model.ImplementerFIO}.WorkExperience:{model.WorkExperience}." +
$"Qualification:{model.Qualification}"); $"Qualification:{model.Qualification}");

View File

@ -0,0 +1,72 @@
using DinerContracts.BindingModels;
using DinerContracts.BusinessLogicsContracts;
using DinerContracts.SearchModels;
using DinerContracts.ViewModels;
using DocumentFormat.OpenXml.Packaging;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Reflection.Metadata.Ecma335;
using System.Text;
using System.Threading.Tasks;
namespace DineryBusinessLogic.BusinessLogic {
public class MessageInfoLogic : IMessageInfoLogic {
private readonly ILogger _logger;
private readonly IMessageInfoStorage _storage;
public MessageInfoLogic(ILogger<MessageInfoLogic> logger, IMessageInfoStorage storage) {
_logger = logger;
_storage = storage;
}
public bool Create(MessageInfoBindingModel model) {
CheckModel(model);
if (_storage.Insert(model) == null) {
_logger.LogWarning("Insert operation failed");
return false;
}
return true;
}
public List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model) {
_logger.LogInformation($"ReadList. MessageID:{model?.MessageID}");
var list = model == null ? _storage.GetFullList() : _storage.GetFilteredList(model);
if (list == null) {
_logger.LogWarning("ReadList. return null list");
return null;
}
_logger.LogInformation($"ReadList. Count:{list.Count}");
return list;
}
private void CheckModel(MessageInfoBindingModel model, bool withParams = true) {
if (model == null) {
throw new ArgumentNullException(nameof(model));
}
if (!withParams) {
return;
}
if (string.IsNullOrEmpty(model.MessageID)) {
throw new ArgumentNullException("Нет ID письма", nameof(model.MessageID));
}
if (string.IsNullOrEmpty((model.ClientID).ToString())) {
throw new ArgumentNullException("Нет ID клиента", nameof(model.ClientID));
}
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}");
}
}
}