сделано
This commit is contained in:
parent
757998190a
commit
53c43da5a9
@ -1,194 +0,0 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using SushiBarContracts.BindingModels;
|
|
||||||
using SushiBarContracts.BusinessLogicsContracts;
|
|
||||||
using SushiBarContracts.SearchModels;
|
|
||||||
using SushiBarContracts.StoragesContracts;
|
|
||||||
using SushiBarContracts.ViewModels;
|
|
||||||
using SushiBarDataModels.Enums;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace SushiBarBusinessLogic.BusinessLogics
|
|
||||||
{
|
|
||||||
public class OrderLogic : IOrderLogic
|
|
||||||
{
|
|
||||||
|
|
||||||
private readonly ILogger _logger;
|
|
||||||
private readonly IOrderStorage _orderStorage;
|
|
||||||
static readonly object _locker = new object();
|
|
||||||
private readonly IShopStorage _shopStorage;
|
|
||||||
|
|
||||||
public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage, IShopStorage shopStorage)
|
|
||||||
{
|
|
||||||
_logger = logger;
|
|
||||||
_orderStorage = orderStorage;
|
|
||||||
_shopStorage = shopStorage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public OrderViewModel? ReadElement(OrderSearchModel model)
|
|
||||||
{
|
|
||||||
if (model == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(model));
|
|
||||||
}
|
|
||||||
_logger.LogInformation("ReadElement. ClientId:{ClientId}.Status:{Status}.ImplementerId:{ImplementerId}.DateFrom:{DateFrom}.DateTo:{DateTo}OrderId:{Id}",
|
|
||||||
model.ClientId, model.Status, model.ImplementerId, model.DateFrom, model.DateTo, model.Id);
|
|
||||||
var element = _orderStorage.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<OrderViewModel>? ReadList(OrderSearchModel? model)
|
|
||||||
{
|
|
||||||
_logger.LogInformation("ReadList. ClientId:{ClientId}.Status:{Status}.ImplementerId:{ImplementerId}.DateFrom:{DateFrom}.DateTo:{DateTo}OrderId:{Id}",
|
|
||||||
model?.ClientId, model?.Status, model?.ImplementerId, model?.DateFrom, model?.DateTo, model?.Id);
|
|
||||||
var list = model == null ? _orderStorage.GetFullList() : _orderStorage.GetFilteredList(model);
|
|
||||||
if (list == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("ReadList return null list");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool CreateOrder(OrderBindingModel model)
|
|
||||||
{
|
|
||||||
CheckModel(model);
|
|
||||||
if (model.Status != OrderStatus.Неизвестен)
|
|
||||||
return false;
|
|
||||||
model.Status = OrderStatus.Принят;
|
|
||||||
if (_orderStorage.Insert(model) == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Insert operation failed");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TakeOrderInWork(OrderBindingModel model)
|
|
||||||
{
|
|
||||||
lock (_locker)
|
|
||||||
{
|
|
||||||
return ChangeStatus(model, OrderStatus.Выполняется);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool FinishOrder(OrderBindingModel model)
|
|
||||||
{
|
|
||||||
return ChangeStatus(model, OrderStatus.Готов);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool DeliveryOrder(OrderBindingModel model)
|
|
||||||
{
|
|
||||||
lock (_locker)
|
|
||||||
{
|
|
||||||
model = FillOrderBindingModel(model);
|
|
||||||
if (model.Status != OrderStatus.Готов && model.Status != OrderStatus.Ожидает)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Changing status operation faled: Current-{Status}:required-Выдан.", model.Status);
|
|
||||||
throw new InvalidOperationException($"Невозможно приствоить статус выдан заказу с текущим статусом {model.Status}");
|
|
||||||
}
|
|
||||||
if (!_shopStorage.RestockingShops(new SupplyBindingModel
|
|
||||||
{
|
|
||||||
SushiId = model.SushiId,
|
|
||||||
Count = model.Count
|
|
||||||
}))
|
|
||||||
{
|
|
||||||
if (model.Status == OrderStatus.Готов || model.Status == OrderStatus.Ожидает)
|
|
||||||
{
|
|
||||||
model.Status = OrderStatus.Ожидает;
|
|
||||||
return UpdateOrder(model);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
model.Status = OrderStatus.Выдан;
|
|
||||||
return UpdateOrder(model);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CheckModel(OrderBindingModel model, bool withParams = true)
|
|
||||||
{
|
|
||||||
if (model == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(model));
|
|
||||||
}
|
|
||||||
if (!withParams)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (model.Count <= 0)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("Колличество пиццы в заказе не может быть меньше 1", nameof(model.Count));
|
|
||||||
}
|
|
||||||
if (model.Sum <= 0)
|
|
||||||
{
|
|
||||||
throw new ArgumentException("Стоимость заказа на может быть меньше 1", nameof(model.Sum));
|
|
||||||
}
|
|
||||||
if (model.DateImplement.HasValue && model.DateImplement < model.DateCreate)
|
|
||||||
{
|
|
||||||
throw new ArithmeticException($"Дата выдачи заказа {model.DateImplement} не может быть раньше даты его создания {model.DateCreate}");
|
|
||||||
}
|
|
||||||
_logger.LogInformation("Sushi. SushiId:{SushiId}.Count:{Count}.Sum:{Sum}Id:{Id}",
|
|
||||||
model.SushiId, model.Count, model.Sum, model.Id);
|
|
||||||
}
|
|
||||||
private bool ChangeStatus(OrderBindingModel model, OrderStatus requiredStatus)
|
|
||||||
{
|
|
||||||
model = FillOrderBindingModel(model);
|
|
||||||
|
|
||||||
if (requiredStatus - model.Status == 1)
|
|
||||||
{
|
|
||||||
model.Status = requiredStatus;
|
|
||||||
if (model.Status == OrderStatus.Готов)
|
|
||||||
model.DateImplement = DateTime.Now;
|
|
||||||
return UpdateOrder(model);
|
|
||||||
}
|
|
||||||
_logger.LogWarning("Changing status operation faled: Current-{Status}:required-{requiredStatus}.", model.Status, requiredStatus);
|
|
||||||
throw new InvalidOperationException($"Невозможно приствоить статус {requiredStatus} заказу с текущим статусом {model.Status}");
|
|
||||||
}
|
|
||||||
|
|
||||||
private OrderBindingModel FillOrderBindingModel(OrderBindingModel model)
|
|
||||||
{
|
|
||||||
CheckModel(model, false);
|
|
||||||
var element = _orderStorage.GetElement(new OrderSearchModel()
|
|
||||||
{
|
|
||||||
Id = model.Id
|
|
||||||
});
|
|
||||||
if (element == null)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException(nameof(element));
|
|
||||||
}
|
|
||||||
model.Id = element.Id;
|
|
||||||
model.DateCreate = element.DateCreate;
|
|
||||||
model.SushiId = element.SushiId;
|
|
||||||
model.DateImplement = element.DateImplement;
|
|
||||||
model.ClientId = element.ClientId;
|
|
||||||
model.Status = element.Status;
|
|
||||||
model.Count = element.Count;
|
|
||||||
model.Sum = element.Sum;
|
|
||||||
if (!model.ImplementerId.HasValue)
|
|
||||||
{
|
|
||||||
model.ImplementerId = element.ImplementerId;
|
|
||||||
}
|
|
||||||
return model;
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool UpdateOrder(OrderBindingModel model)
|
|
||||||
{
|
|
||||||
if (_orderStorage.Update(model) == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Update operation failed");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
_logger.LogWarning("Update operation sucsess");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -15,75 +15,119 @@ namespace SushiBarBusinessLogic.MailWorker
|
|||||||
{
|
{
|
||||||
public abstract class AbstractMailWorker
|
public abstract class AbstractMailWorker
|
||||||
{
|
{
|
||||||
protected string _mailLogin = string.Empty;
|
protected string _mailLogin = string.Empty;
|
||||||
protected string _mailPassword = string.Empty;
|
protected string _mailPassword = string.Empty;
|
||||||
protected string _smtpClientHost = string.Empty;
|
protected string _smtpClientHost = string.Empty;
|
||||||
protected int _smtpClientPort;
|
protected int _smtpClientPort;
|
||||||
protected string _popHost = string.Empty;
|
protected string _popHost = string.Empty;
|
||||||
protected int _popPort;
|
protected int _popPort;
|
||||||
private readonly IMessageInfoLogic _messageInfoLogic;
|
private readonly IMessageInfoLogic _messageInfoLogic;
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
public AbstractMailWorker(ILogger<AbstractMailWorker> logger, IMessageInfoLogic messageInfoLogic)
|
public AbstractMailWorker(ILogger<AbstractMailWorker> logger, IMessageInfoLogic messageInfoLogic)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_messageInfoLogic = messageInfoLogic;
|
_messageInfoLogic = messageInfoLogic;
|
||||||
}
|
}
|
||||||
public void MailConfig(MailConfigBindingModel config)
|
public void MailConfig(MailConfigBindingModel config)
|
||||||
{
|
{
|
||||||
_mailLogin = config.MailLogin;
|
_mailLogin = config.MailLogin;
|
||||||
_mailPassword = config.MailPassword;
|
_mailPassword = config.MailPassword;
|
||||||
_smtpClientHost = config.SmtpClientHost;
|
_smtpClientHost = config.SmtpClientHost;
|
||||||
_smtpClientPort = config.SmtpClientPort;
|
_smtpClientPort = config.SmtpClientPort;
|
||||||
_popHost = config.PopHost;
|
_popHost = config.PopHost;
|
||||||
_popPort = config.PopPort;
|
_popPort = config.PopPort;
|
||||||
_logger.LogDebug("Config: {login}, {password}, {clientHost}, {clientPOrt}, {popHost}, {popPort}", _mailLogin, _mailPassword.Length, _smtpClientHost, _smtpClientPort, _popHost, _popPort);
|
_logger.LogDebug("Config: {login}, {password}, {clientHost}, {clientPOrt}, {popHost}, {popPort}", _mailLogin, _mailPassword.Length, _smtpClientHost, _smtpClientPort, _popHost, _popPort);
|
||||||
}
|
}
|
||||||
public async void MailSendAsync(MailSendInfoBindingModel info)
|
public async void MailSendAsync(MailSendInfoBindingModel info)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(_mailLogin) || string.IsNullOrEmpty(_mailPassword))
|
if (string.IsNullOrEmpty(_mailLogin) || string.IsNullOrEmpty(_mailPassword))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(_smtpClientHost) || _smtpClientPort == 0)
|
if (string.IsNullOrEmpty(_smtpClientHost) || _smtpClientPort == 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(info.MailAddress) || string.IsNullOrEmpty(info.Subject) || string.IsNullOrEmpty(info.Text))
|
if (string.IsNullOrEmpty(info.MailAddress) || string.IsNullOrEmpty(info.Subject) || string.IsNullOrEmpty(info.Text))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogDebug("Send Mail: {To}, {Subject}", info.MailAddress, info.Subject);
|
_logger.LogDebug("Send Mail: {To}, {Subject}", info.MailAddress, info.Subject);
|
||||||
await SendMailAsync(info);
|
await SendMailAsync(info);
|
||||||
}
|
}
|
||||||
public async void MailCheck()
|
public async void MailCheck()
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(_mailLogin) || string.IsNullOrEmpty(_mailPassword))
|
if (string.IsNullOrEmpty(_mailLogin) || string.IsNullOrEmpty(_mailPassword))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(_popHost) || _popPort == 0)
|
if (string.IsNullOrEmpty(_popHost) || _popPort == 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_messageInfoLogic == null)
|
if (_messageInfoLogic == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var list = await ReceiveMailAsync();
|
var list = await ReceiveMailAsync();
|
||||||
_logger.LogDebug("Check Mail: {Count} new mails", list.Count);
|
_logger.LogDebug("Check Mail: {Count} new mails", list.Count);
|
||||||
foreach (var mail in list)
|
foreach (var mail in list)
|
||||||
{
|
{
|
||||||
_messageInfoLogic.Create(mail);
|
_messageInfoLogic.Create(mail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
protected abstract Task SendMailAsync(MailSendInfoBindingModel info);
|
|
||||||
protected abstract Task<List<MessageInfoBindingModel>> ReceiveMailAsync();
|
public async void MailSendReplyAsync(MailReplySendInfoBindingModel 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) || string.IsNullOrEmpty(info.ParentMessageId))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogDebug("Send Mail as reply: {To}, {Subject}, {parentId}", info.MailAddress, info.Subject, info.ParentMessageId);
|
||||||
|
|
||||||
|
string? messageId = await SendMailAsync(info);
|
||||||
|
if (string.IsNullOrEmpty(messageId))
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("Непредвиденная ошибка при отправке сообщения в ответ");
|
||||||
|
}
|
||||||
|
if (_messageInfoLogic.Create(new MessageInfoBindingModel
|
||||||
|
{
|
||||||
|
MessageId = messageId,
|
||||||
|
DateDelivery = DateTime.Now,
|
||||||
|
SenderName = _mailLogin,
|
||||||
|
IsReply = true,
|
||||||
|
Subject = info.Subject,
|
||||||
|
Body = info.Text,
|
||||||
|
}))
|
||||||
|
{
|
||||||
|
_messageInfoLogic.Update(new MessageInfoBindingModel()
|
||||||
|
{
|
||||||
|
MessageId = info.ParentMessageId,
|
||||||
|
ReplyMessageId = messageId,
|
||||||
|
IsReaded = true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract Task<string?> SendMailAsync(MailSendInfoBindingModel info);
|
||||||
|
protected abstract Task<List<MessageInfoBindingModel>> ReceiveMailAsync();
|
||||||
|
}
|
||||||
|
}
|
@ -15,69 +15,90 @@ namespace SushiBarBusinessLogic.MailWorker
|
|||||||
{
|
{
|
||||||
public class MailKitWorker : AbstractMailWorker
|
public class MailKitWorker : AbstractMailWorker
|
||||||
{
|
{
|
||||||
public MailKitWorker(ILogger<MailKitWorker> logger, IMessageInfoLogic messageInfoLogic) : base(logger, messageInfoLogic) { }
|
public MailKitWorker(ILogger<MailKitWorker> logger, IMessageInfoLogic messageInfoLogic) : base(logger, messageInfoLogic) { }
|
||||||
|
|
||||||
protected override async Task SendMailAsync(MailSendInfoBindingModel info)
|
protected override async Task<string?> SendMailAsync(MailSendInfoBindingModel info)
|
||||||
{
|
{
|
||||||
using var objMailMessage = new MailMessage();
|
string? resount = null;
|
||||||
using var objSmtpClient = new SmtpClient(_smtpClientHost, _smtpClientPort);
|
using var objMailMessage = new MailMessage();
|
||||||
try
|
using var objSmtpClient = new SmtpClient(_smtpClientHost, _smtpClientPort);
|
||||||
{
|
try
|
||||||
objMailMessage.From = new MailAddress(_mailLogin);
|
{
|
||||||
objMailMessage.To.Add(new MailAddress(info.MailAddress));
|
ConfigurateSmtpClient(objSmtpClient);
|
||||||
objMailMessage.Subject = info.Subject;
|
CreateMessage(objMailMessage, info);
|
||||||
objMailMessage.Body = info.Text;
|
|
||||||
objMailMessage.SubjectEncoding = Encoding.UTF8;
|
|
||||||
objMailMessage.BodyEncoding = Encoding.UTF8;
|
|
||||||
|
|
||||||
|
|
||||||
objSmtpClient.UseDefaultCredentials = false;
|
if (info is MailReplySendInfoBindingModel replyInfo)
|
||||||
objSmtpClient.EnableSsl = true;
|
{
|
||||||
objSmtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
|
objMailMessage.Headers.Add("In-Reply-To", replyInfo.ParentMessageId);
|
||||||
objSmtpClient.Credentials = new NetworkCredential(_mailLogin, _mailPassword);
|
objMailMessage.Headers.Add("References", replyInfo.ParentMessageId);
|
||||||
|
|
||||||
await Task.Run(() => objSmtpClient.Send(objMailMessage));
|
string messageGuid = Guid.NewGuid().ToString();
|
||||||
}
|
objMailMessage.Headers.Add("Message-Id", messageGuid);
|
||||||
catch (Exception)
|
resount = messageGuid;
|
||||||
{
|
}
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override async Task<List<MessageInfoBindingModel>> ReceiveMailAsync()
|
await Task.Run(() => objSmtpClient.Send(objMailMessage));
|
||||||
{
|
}
|
||||||
var list = new List<MessageInfoBindingModel>();
|
catch (Exception)
|
||||||
using var client = new Pop3Client();
|
{
|
||||||
await Task.Run(() =>
|
throw;
|
||||||
{
|
}
|
||||||
try
|
return resount;
|
||||||
{
|
}
|
||||||
client.Connect(_popHost, _popPort, SecureSocketOptions.SslOnConnect);
|
|
||||||
client.Authenticate(_mailLogin, _mailPassword);
|
protected override async Task<List<MessageInfoBindingModel>> ReceiveMailAsync()
|
||||||
for (int i = 0; i < client.Count; i++)
|
{
|
||||||
{
|
var list = new List<MessageInfoBindingModel>();
|
||||||
var message = client.GetMessage(i);
|
using var client = new Pop3Client();
|
||||||
foreach (var mail in message.From.Mailboxes)
|
await Task.Run(() =>
|
||||||
{
|
{
|
||||||
list.Add(new MessageInfoBindingModel
|
try
|
||||||
{
|
{
|
||||||
DateDelivery = message.Date.DateTime,
|
client.Connect(_popHost, _popPort, SecureSocketOptions.SslOnConnect);
|
||||||
MessageId = message.MessageId,
|
client.Authenticate(_mailLogin, _mailPassword);
|
||||||
SenderName = mail.Address,
|
for (int i = 0; i < client.Count; i++)
|
||||||
Subject = message.Subject,
|
{
|
||||||
Body = message.TextBody
|
var message = client.GetMessage(i);
|
||||||
});
|
foreach (var mail in message.From.Mailboxes)
|
||||||
}
|
{
|
||||||
}
|
list.Add(new MessageInfoBindingModel
|
||||||
}
|
{
|
||||||
catch (MailKit.Security.AuthenticationException)
|
DateDelivery = message.Date.DateTime,
|
||||||
{ }
|
MessageId = message.MessageId,
|
||||||
finally
|
SenderName = mail.Address,
|
||||||
{
|
Subject = message.Subject,
|
||||||
client.Disconnect(true);
|
Body = message.TextBody
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
return list;
|
}
|
||||||
}
|
}
|
||||||
}
|
catch (MailKit.Security.AuthenticationException)
|
||||||
}
|
{ }
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
client.Disconnect(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateMessage(MailMessage objMailMessage, MailSendInfoBindingModel info)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ConfigurateSmtpClient(SmtpClient objSmtpClient)
|
||||||
|
{
|
||||||
|
|
||||||
|
objSmtpClient.UseDefaultCredentials = false;
|
||||||
|
objSmtpClient.EnableSsl = true;
|
||||||
|
objSmtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
|
||||||
|
objSmtpClient.Credentials = new NetworkCredential(_mailLogin, _mailPassword);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -28,8 +28,12 @@ namespace SushiBarBusinessLogic
|
|||||||
}
|
}
|
||||||
public List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model)
|
public List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("ReadList. MessageId:{MessageId}.ClientId:{ClientId}", model?.MessageId, model?.ClientId);
|
if (model == null)
|
||||||
var list = model == null ? _messageInfoStorage.GetFullList() : _messageInfoStorage.GetFilteredList(model);
|
{
|
||||||
|
throw new ArgumentNullException(nameof(model));
|
||||||
|
}
|
||||||
|
_logger.LogInformation("ReadList. MessageId:{MessageId}.ClientId:{ClientId}.PageLength:{PageLength}.PageCount:{PageIndex}", model?.MessageId, model?.ClientId, model?.PageLength, model?.PageIndex);
|
||||||
|
var list = _messageInfoStorage.GetFilteredList(model);
|
||||||
if (list == null)
|
if (list == null)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("ReadList return null list");
|
_logger.LogWarning("ReadList return null list");
|
||||||
@ -41,7 +45,8 @@ namespace SushiBarBusinessLogic
|
|||||||
public bool Create(MessageInfoBindingModel model)
|
public bool Create(MessageInfoBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
if (_messageInfoStorage.Insert(model) == null)
|
var message = _messageInfoStorage.Insert(model);
|
||||||
|
if (message == null)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Insert operation failed");
|
_logger.LogWarning("Insert operation failed");
|
||||||
return false;
|
return false;
|
||||||
@ -54,27 +59,26 @@ namespace SushiBarBusinessLogic
|
|||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(model));
|
throw new ArgumentNullException(nameof(model));
|
||||||
}
|
}
|
||||||
if (!withParams)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (string.IsNullOrEmpty(model.MessageId))
|
if (string.IsNullOrEmpty(model.MessageId))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Не указан id сообщения", nameof(model.MessageId));
|
throw new ArgumentNullException("Не указан id сообщения", nameof(model.MessageId));
|
||||||
}
|
}
|
||||||
|
if (!withParams)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (string.IsNullOrEmpty(model.SenderName))
|
if (string.IsNullOrEmpty(model.SenderName))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Не указао почта", nameof(model.SenderName));
|
throw new ArgumentNullException("Не указао имя отправителя(электронная почта)", nameof(model.SenderName));
|
||||||
}
|
}
|
||||||
if (string.IsNullOrEmpty(model.Subject))
|
if (string.IsNullOrEmpty(model.Subject))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Не указана тема", nameof(model.Subject));
|
throw new ArgumentNullException("Не указана темма", nameof(model.Subject));
|
||||||
}
|
}
|
||||||
if (string.IsNullOrEmpty(model.Body))
|
if (string.IsNullOrEmpty(model.Body))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("Не указан текст сообщения", nameof(model.Subject));
|
throw new ArgumentNullException("Не указан текст сообщения", nameof(model.Subject));
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogInformation("MessageInfo. MessageId:{MessageId}.SenderName:{SenderName}.Subject:{Subject}.Body:{Body}", model.MessageId, model.SenderName, model.Subject, model.Body);
|
_logger.LogInformation("MessageInfo. MessageId:{MessageId}.SenderName:{SenderName}.Subject:{Subject}.Body:{Body}", model.MessageId, model.SenderName, model.Subject, model.Body);
|
||||||
var element = _clientStorage.GetElement(new ClientSearchModel
|
var element = _clientStorage.GetElement(new ClientSearchModel
|
||||||
{
|
{
|
||||||
@ -89,5 +93,33 @@ namespace SushiBarBusinessLogic
|
|||||||
model.ClientId = element.Id;
|
model.ClientId = element.Id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MessageInfoViewModel? ReadElement(MessageInfoSearchModel model)
|
||||||
|
{
|
||||||
|
if (model == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(model));
|
||||||
|
}
|
||||||
|
_logger.LogInformation("ReadElement. MessageId:{MessageId}", model?.MessageId);
|
||||||
|
var element = _messageInfoStorage.GetElement(model);
|
||||||
|
if (element == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("ReadElement element not found");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
_logger.LogInformation("ReadElement find. Id:{Id}", element.MessageId);
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Update(MessageInfoBindingModel model)
|
||||||
|
{
|
||||||
|
CheckModel(model, withParams: false);
|
||||||
|
if (_messageInfoStorage.Update(model) == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Update operation failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -19,18 +19,39 @@ namespace SushiBarBusinessLogic.BusinessLogics
|
|||||||
{
|
{
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private readonly IOrderStorage _orderStorage;
|
private readonly IOrderStorage _orderStorage;
|
||||||
private readonly AbstractMailWorker _mailWorker;
|
private readonly AbstractMailWorker _mailWorker;
|
||||||
static readonly object _locker = new object();
|
static readonly object _locker = new object();
|
||||||
public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage, AbstractMailWorker mailWorker)
|
private readonly IShopStorage _shopStorage;
|
||||||
{
|
public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage, IShopStorage shopStorage, AbstractMailWorker mailWorker)
|
||||||
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_orderStorage = orderStorage;
|
_orderStorage = orderStorage;
|
||||||
_mailWorker = mailWorker;
|
_shopStorage = shopStorage;
|
||||||
}
|
_mailWorker = mailWorker;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderViewModel? ReadElement(OrderSearchModel model)
|
||||||
|
{
|
||||||
|
if (model == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(model));
|
||||||
|
}
|
||||||
|
_logger.LogInformation("ReadElement. ClientId:{ClientId}.Status:{Status}.ImplementerId:{ImplementerId}.DateFrom:{DateFrom}.DateTo:{DateTo}OrderId:{Id}",
|
||||||
|
model.ClientId, model.Status, model.ImplementerId, model.DateFrom, model.DateTo, model.Id);
|
||||||
|
var element = _orderStorage.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<OrderViewModel>? ReadList(OrderSearchModel? model)
|
public List<OrderViewModel>? ReadList(OrderSearchModel? model)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("ReadList. ClientId:{ClientId}.Status:{Status}.ImplementerId:{ImplementerId}.DateFrom:{DateFrom}.DateTo:{DateTo}OrderId:{Id}",
|
_logger.LogInformation("ReadList. ClientId:{ClientId}.Status:{Status}.ImplementerId:{ImplementerId}.DateFrom:{DateFrom}.DateTo:{DateTo}OrderId:{Id}",
|
||||||
model?.ClientId, model?.Status, model?.ImplementerId, model?.DateFrom, model?.DateTo, model?.Id);
|
model?.ClientId, model?.Status, model?.ImplementerId, model?.DateFrom, model?.DateTo, model?.Id);
|
||||||
var list = model == null ? _orderStorage.GetFullList() : _orderStorage.GetFilteredList(model);
|
var list = model == null ? _orderStorage.GetFullList() : _orderStorage.GetFilteredList(model);
|
||||||
if (list == null)
|
if (list == null)
|
||||||
{
|
{
|
||||||
@ -40,25 +61,26 @@ namespace SushiBarBusinessLogic.BusinessLogics
|
|||||||
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
_logger.LogInformation("ReadList. Count:{Count}", list.Count);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CreateOrder(OrderBindingModel model)
|
public bool CreateOrder(OrderBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model);
|
CheckModel(model);
|
||||||
if (model.Status != OrderStatus.Неизвестен)
|
if (model.Status != OrderStatus.Неизвестен)
|
||||||
return false;
|
return false;
|
||||||
model.Status = OrderStatus.Принят;
|
model.Status = OrderStatus.Принят;
|
||||||
var element = _orderStorage.Insert(model);
|
var element = _orderStorage.Insert(model);
|
||||||
if (element == null)
|
if (element == null)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Insert operation failed");
|
_logger.LogWarning("Insert operation failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Task.Run(() => _mailWorker.MailSendAsync(new MailSendInfoBindingModel
|
Task.Run(() => _mailWorker.MailSendAsync(new MailSendInfoBindingModel
|
||||||
{
|
{
|
||||||
MailAddress = element.ClientEmail,
|
MailAddress = element.ClientEmail,
|
||||||
Subject = $"Изменение статуса заказа номер {element.Id}",
|
Subject = $"Изменение статуса заказа номер {element.Id}",
|
||||||
Text = $"Ваш заказ номер {element.Id} на суши {element.SushiName} от {element.DateCreate} на сумму {element.Sum} принят."
|
Text = $"Ваш заказ номер {element.Id} на пиццу {element.SushiName} от {element.DateCreate} на сумму {element.Sum} принят."
|
||||||
}));
|
}));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool TakeOrderInWork(OrderBindingModel model)
|
public bool TakeOrderInWork(OrderBindingModel model)
|
||||||
@ -76,7 +98,31 @@ namespace SushiBarBusinessLogic.BusinessLogics
|
|||||||
|
|
||||||
public bool DeliveryOrder(OrderBindingModel model)
|
public bool DeliveryOrder(OrderBindingModel model)
|
||||||
{
|
{
|
||||||
return ChangeStatus(model, OrderStatus.Выдан);
|
lock (_locker)
|
||||||
|
{
|
||||||
|
(model, var element) = FillOrderBindingModel(model);
|
||||||
|
if (model.Status != OrderStatus.Готов && model.Status != OrderStatus.Ожидает)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Changing status operation faled: Current-{Status}:required-Выдан.", model.Status);
|
||||||
|
throw new InvalidOperationException($"Невозможно приствоить статус выдан заказу с текущим статусом {model.Status}");
|
||||||
|
}
|
||||||
|
if (!_shopStorage.RestockingShops(new SupplyBindingModel
|
||||||
|
{
|
||||||
|
SushiId = model.SushiId,
|
||||||
|
Count = model.Count
|
||||||
|
}))
|
||||||
|
{
|
||||||
|
if (model.Status == OrderStatus.Готов)
|
||||||
|
{
|
||||||
|
model.Status = OrderStatus.Ожидает;
|
||||||
|
|
||||||
|
UpdateOrder(model, element);
|
||||||
|
}
|
||||||
|
throw new ArgumentException("Недостаточно места в магазинах для поставки");
|
||||||
|
}
|
||||||
|
model.Status = OrderStatus.Выдан;
|
||||||
|
return UpdateOrder(model, element);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CheckModel(OrderBindingModel model, bool withParams = true)
|
private void CheckModel(OrderBindingModel model, bool withParams = true)
|
||||||
@ -104,8 +150,22 @@ namespace SushiBarBusinessLogic.BusinessLogics
|
|||||||
_logger.LogInformation("Sushi. SushiId:{SushiId}.Count:{Count}.Sum:{Sum}Id:{Id}",
|
_logger.LogInformation("Sushi. SushiId:{SushiId}.Count:{Count}.Sum:{Sum}Id:{Id}",
|
||||||
model.SushiId, model.Count, model.Sum, model.Id);
|
model.SushiId, model.Count, model.Sum, model.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool ChangeStatus(OrderBindingModel model, OrderStatus requiredStatus)
|
private bool ChangeStatus(OrderBindingModel model, OrderStatus requiredStatus)
|
||||||
|
{
|
||||||
|
(model, var element) = FillOrderBindingModel(model);
|
||||||
|
|
||||||
|
if (requiredStatus - model.Status == 1)
|
||||||
|
{
|
||||||
|
model.Status = requiredStatus;
|
||||||
|
if (model.Status == OrderStatus.Готов)
|
||||||
|
model.DateImplement = DateTime.Now;
|
||||||
|
return UpdateOrder(model, element);
|
||||||
|
}
|
||||||
|
_logger.LogWarning("Changing status operation faled: Current-{Status}:required-{requiredStatus}.", model.Status, requiredStatus);
|
||||||
|
throw new InvalidOperationException($"Невозможно приствоить статус {requiredStatus} заказу с текущим статусом {model.Status}");
|
||||||
|
}
|
||||||
|
|
||||||
|
private (OrderBindingModel, OrderViewModel) FillOrderBindingModel(OrderBindingModel model)
|
||||||
{
|
{
|
||||||
CheckModel(model, false);
|
CheckModel(model, false);
|
||||||
var element = _orderStorage.GetElement(new OrderSearchModel()
|
var element = _orderStorage.GetElement(new OrderSearchModel()
|
||||||
@ -116,59 +176,38 @@ namespace SushiBarBusinessLogic.BusinessLogics
|
|||||||
{
|
{
|
||||||
throw new InvalidOperationException(nameof(element));
|
throw new InvalidOperationException(nameof(element));
|
||||||
}
|
}
|
||||||
|
model.Id = element.Id;
|
||||||
model.DateCreate = element.DateCreate;
|
model.DateCreate = element.DateCreate;
|
||||||
model.SushiId = element.SushiId;
|
model.SushiId = element.SushiId;
|
||||||
model.DateImplement = element.DateImplement;
|
model.DateImplement = element.DateImplement;
|
||||||
model.ClientId = element.ClientId;
|
model.ClientId = element.ClientId;
|
||||||
|
model.Status = element.Status;
|
||||||
|
model.Count = element.Count;
|
||||||
|
model.Sum = element.Sum;
|
||||||
if (!model.ImplementerId.HasValue)
|
if (!model.ImplementerId.HasValue)
|
||||||
{
|
{
|
||||||
model.ImplementerId = element.ImplementerId;
|
model.ImplementerId = element.ImplementerId;
|
||||||
}
|
}
|
||||||
model.Status = element.Status;
|
return (model, element);
|
||||||
model.Count = element.Count;
|
|
||||||
model.Sum = element.Sum;
|
|
||||||
if (requiredStatus - model.Status == 1)
|
|
||||||
{
|
|
||||||
model.Status = requiredStatus;
|
|
||||||
if (model.Status == OrderStatus.Готов)
|
|
||||||
{
|
|
||||||
model.DateImplement = DateTime.Now;
|
|
||||||
}
|
|
||||||
if (_orderStorage.Update(model) == null)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Update operation failed");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
string DateInfo = model.DateImplement.HasValue ? $"Дата выполнения {model.DateImplement}" : "";
|
|
||||||
Task.Run(() => _mailWorker.MailSendAsync(new MailSendInfoBindingModel
|
|
||||||
{
|
|
||||||
MailAddress = element.ClientEmail,
|
|
||||||
Subject = $"Изменение статуса заказа номер {element.Id}",
|
|
||||||
Text = $"Ваш заказ номер {element.Id} на суши {element.SushiName} от {element.DateCreate} на сумму {element.Sum} {model.Status}. {DateInfo}"
|
|
||||||
}));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
_logger.LogWarning("Changing status operation faled: Current-{Status}:required-{requiredStatus}.", model.Status, requiredStatus);
|
|
||||||
throw new InvalidOperationException($"Невозможно приствоить статус {requiredStatus} заказу с текущим статусом {model.Status}");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public OrderViewModel? ReadElement(OrderSearchModel model)
|
private bool UpdateOrder(OrderBindingModel model, OrderViewModel MailNotificationModel)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (_orderStorage.Update(model) == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(model));
|
_logger.LogWarning("Update operation failed");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
_logger.LogInformation("ReadElement. ClientId:{ClientId}.Status:{Status}.ImplementerId:{ImplementerId}.DateFrom:{DateFrom}.DateTo:{DateTo}OrderId:{Id}",
|
_logger.LogWarning("Update operation sucsess");
|
||||||
model.ClientId, model.Status, model.ImplementerId, model.DateFrom, model.DateTo, model.Id);
|
string DateInfo = model.DateImplement.HasValue ? $"Дата выполнения {model.DateImplement}" : "";
|
||||||
var element = _orderStorage.GetElement(model);
|
Task.Run(() => _mailWorker.MailSendAsync(new MailSendInfoBindingModel
|
||||||
if (element == null)
|
|
||||||
{
|
{
|
||||||
_logger.LogWarning("ReadElement element not found");
|
MailAddress = MailNotificationModel.ClientEmail,
|
||||||
return null;
|
Subject = $"Изменение статуса заказа номер {MailNotificationModel.Id}",
|
||||||
}
|
Text = $"Ваш заказ номер {MailNotificationModel.Id} на изделие {MailNotificationModel.SushiName} от" +
|
||||||
_logger.LogInformation("ReadElement find. Id:{Id}", element.Id);
|
$" {MailNotificationModel.DateCreate} на сумму {MailNotificationModel.Sum} {model.Status}. {DateInfo}"
|
||||||
return element;
|
}));
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -12,7 +12,9 @@ namespace SushiBarClientApp
|
|||||||
private static readonly HttpClient _client = new();
|
private static readonly HttpClient _client = new();
|
||||||
|
|
||||||
public static string? Password { get; set; }
|
public static string? Password { get; set; }
|
||||||
|
public static ClientViewModel? Client { get; set; } = null;
|
||||||
|
public static int MailPage { get; set; } = 1;
|
||||||
|
|
||||||
public static void Connect(IConfiguration configuration)
|
public static void Connect(IConfiguration configuration)
|
||||||
{
|
{
|
||||||
_client.BaseAddress = new Uri(configuration["IPAddress"]);
|
_client.BaseAddress = new Uri(configuration["IPAddress"]);
|
||||||
|
@ -17,152 +17,15 @@ namespace SushiBarClientApp.Controllers
|
|||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IActionResult Index()
|
|
||||||
{
|
|
||||||
if (APIClient.Password == null)
|
|
||||||
{
|
|
||||||
return Redirect("~/Home/Enter");
|
|
||||||
}
|
|
||||||
return View(APIClient.GetRequest<List<ShopViewModel>>($"api/shop/getshoplist?password={APIClient.Password}"));
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet]
|
|
||||||
public IActionResult Enter()
|
|
||||||
{
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpPost]
|
|
||||||
public void Enter(string password)
|
|
||||||
{
|
|
||||||
bool resout = APIClient.GetRequest<bool>($"/api/shop/authentication?password={password}");
|
|
||||||
if (!resout)
|
|
||||||
{
|
|
||||||
Response.Redirect("../Home/Enter");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
APIClient.Password = password;
|
|
||||||
Response.Redirect("Index");
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet]
|
|
||||||
public IActionResult Create()
|
|
||||||
{
|
|
||||||
if (APIClient.Password == null)
|
|
||||||
{
|
|
||||||
return Redirect("~/Home/Enter");
|
|
||||||
}
|
|
||||||
return View("Shop");
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpPost]
|
|
||||||
public void Create(int id, string shopname, string adress, DateTime openingdate, int maxcount)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(shopname) || string.IsNullOrEmpty(adress))
|
|
||||||
{
|
|
||||||
throw new Exception("Название или адрес не может быть пустым");
|
|
||||||
}
|
|
||||||
if (openingdate == default(DateTime))
|
|
||||||
{
|
|
||||||
throw new Exception("Дата открытия не может быть пустой");
|
|
||||||
}
|
|
||||||
|
|
||||||
APIClient.PostRequest($"api/shop/createshop?password={APIClient.Password}", new ShopBindingModel
|
|
||||||
{
|
|
||||||
Id = id,
|
|
||||||
ShopName = shopname,
|
|
||||||
Adress = adress,
|
|
||||||
OpeningDate = openingdate,
|
|
||||||
SushiMaxCount = maxcount
|
|
||||||
});
|
|
||||||
Response.Redirect("Index");
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet]
|
|
||||||
public IActionResult Update(int Id)
|
|
||||||
{
|
|
||||||
if (APIClient.Password == null)
|
|
||||||
{
|
|
||||||
return Redirect("~/Home/Enter");
|
|
||||||
}
|
|
||||||
return View("Shop", APIClient.GetRequest<ShopSushiViewModel>($"api/shop/getshop?shopId={Id}&password={APIClient.Password}"));
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpPost]
|
|
||||||
public void Update(int id, string shopname, string adress, DateTime openingdate, int maxcount)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(shopname) || string.IsNullOrEmpty(adress))
|
|
||||||
{
|
|
||||||
throw new Exception("Название или адрес не может быть пустым");
|
|
||||||
}
|
|
||||||
if (openingdate == default(DateTime))
|
|
||||||
{
|
|
||||||
throw new Exception("Дата открытия не может быть пустой");
|
|
||||||
}
|
|
||||||
APIClient.PostRequest($"api/shop/updateshop?password={APIClient.Password}", new ShopBindingModel
|
|
||||||
{
|
|
||||||
Id = id,
|
|
||||||
ShopName = shopname,
|
|
||||||
Adress = adress,
|
|
||||||
OpeningDate = openingdate,
|
|
||||||
SushiMaxCount = maxcount
|
|
||||||
});
|
|
||||||
Response.Redirect("../Index");
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpPost]
|
|
||||||
public void Delete(int Id)
|
|
||||||
{
|
|
||||||
APIClient.DeleteRequest($"api/shop/deleteshop?shopId={Id}&password={APIClient.Password}");
|
|
||||||
Response.Redirect("../Index");
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet]
|
|
||||||
public IActionResult Supply()
|
|
||||||
{
|
|
||||||
if (APIClient.Password == null)
|
|
||||||
{
|
|
||||||
return Redirect("~/Home/Enter");
|
|
||||||
}
|
|
||||||
|
|
||||||
ViewBag.Shops = APIClient.GetRequest<List<ShopViewModel>>($"api/shop/getshoplist?password={APIClient.Password}");
|
|
||||||
ViewBag.Sushis = APIClient.GetRequest<List<SushiViewModel>>($"api/main/getsushilist");
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpPost]
|
|
||||||
public void Supply(int shop, int sushi, int count)
|
|
||||||
{
|
|
||||||
APIClient.PostRequest($"api/shop/makesypply?password={APIClient.Password}", new SupplyBindingModel
|
|
||||||
{
|
|
||||||
ShopId = shop,
|
|
||||||
SushiId = sushi,
|
|
||||||
Count = count
|
|
||||||
});
|
|
||||||
Response.Redirect("Index");
|
|
||||||
}
|
|
||||||
|
|
||||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
|
||||||
public IActionResult Error()
|
|
||||||
{
|
|
||||||
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private readonly ILogger<HomeController> _logger;
|
|
||||||
public HomeController(ILogger<HomeController> logger)
|
|
||||||
{
|
|
||||||
_logger = logger;
|
|
||||||
}
|
|
||||||
public IActionResult Index()
|
public IActionResult Index()
|
||||||
{
|
{
|
||||||
if (APIClient.Client == null)
|
if (APIClient.Client == null)
|
||||||
{
|
{
|
||||||
return Redirect("~/Home/Enter");
|
return Redirect("~/Home/Enter");
|
||||||
}
|
}
|
||||||
return
|
return View(APIClient.GetRequest<List<OrderViewModel>>($"api/main/getorders?clientId={APIClient.Client.Id}"));
|
||||||
View(APIClient.GetRequest<List<OrderViewModel>>($"api/main/getorders?clientId={APIClient.Client.Id}"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IActionResult Privacy()
|
public IActionResult Privacy()
|
||||||
{
|
{
|
||||||
@ -172,6 +35,7 @@ namespace SushiBarClientApp.Controllers
|
|||||||
}
|
}
|
||||||
return View(APIClient.Client);
|
return View(APIClient.Client);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public void Privacy(string login, string password, string fio)
|
public void Privacy(string login, string password, string fio)
|
||||||
{
|
{
|
||||||
@ -179,70 +43,65 @@ namespace SushiBarClientApp.Controllers
|
|||||||
{
|
{
|
||||||
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
|
throw new Exception("Вы как суда попали? Суда вход только авторизованным");
|
||||||
}
|
}
|
||||||
if (string.IsNullOrEmpty(login) ||
|
if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(fio))
|
||||||
string.IsNullOrEmpty(password) || string.IsNullOrEmpty(fio))
|
|
||||||
{
|
{
|
||||||
throw new Exception("Введите логин, пароль и ФИО");
|
throw new Exception("Введите логин, пароль и ФИО");
|
||||||
}
|
}
|
||||||
APIClient.PostRequest("api/client/updatedata", new
|
APIClient.PostRequest("api/client/updatedata", new ClientBindingModel
|
||||||
ClientBindingModel
|
|
||||||
{
|
{
|
||||||
Id = APIClient.Client.Id,
|
Id = APIClient.Client.Id,
|
||||||
ClientFIO = fio,
|
ClientFIO = fio,
|
||||||
Email = login,
|
Email = login,
|
||||||
Password = password
|
Password = password
|
||||||
});
|
});
|
||||||
|
|
||||||
APIClient.Client.ClientFIO = fio;
|
APIClient.Client.ClientFIO = fio;
|
||||||
APIClient.Client.Email = login;
|
APIClient.Client.Email = login;
|
||||||
APIClient.Client.Password = password;
|
APIClient.Client.Password = password;
|
||||||
Response.Redirect("Index");
|
Response.Redirect("Index");
|
||||||
}
|
}
|
||||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None,
|
|
||||||
NoStore = true)]
|
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||||
public IActionResult Error()
|
public IActionResult Error()
|
||||||
{
|
{
|
||||||
return View(new ErrorViewModel
|
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
|
||||||
{
|
|
||||||
RequestId =
|
|
||||||
Activity.Current?.Id ?? HttpContext.TraceIdentifier
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IActionResult Enter()
|
public IActionResult Enter()
|
||||||
{
|
{
|
||||||
return View();
|
return View();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public void Enter(string login, string password)
|
public void Enter(string login, string password)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(login) ||
|
if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password))
|
||||||
string.IsNullOrEmpty(password))
|
|
||||||
{
|
{
|
||||||
throw new Exception("Введите логин и пароль");
|
throw new Exception("Введите логин и пароль");
|
||||||
}
|
}
|
||||||
APIClient.Client =
|
APIClient.Client = APIClient.GetRequest<ClientViewModel>($"api/client/login?login={login}&password={password}");
|
||||||
APIClient.GetRequest<ClientViewModel>($"api/client/login?login={login}&password={password}");
|
|
||||||
if (APIClient.Client == null)
|
if (APIClient.Client == null)
|
||||||
{
|
{
|
||||||
throw new Exception("Неверный логин/пароль");
|
throw new Exception("Неверный логин/пароль");
|
||||||
}
|
}
|
||||||
Response.Redirect("Index");
|
Response.Redirect("Index");
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IActionResult Register()
|
public IActionResult Register()
|
||||||
{
|
{
|
||||||
return View();
|
return View();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public void Register(string login, string password, string fio)
|
public void Register(string login, string password, string fio)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(login) ||
|
if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(fio))
|
||||||
string.IsNullOrEmpty(password) || string.IsNullOrEmpty(fio))
|
|
||||||
{
|
{
|
||||||
throw new Exception("Введите логин, пароль и ФИО");
|
throw new Exception("Введите логин, пароль и ФИО");
|
||||||
}
|
}
|
||||||
APIClient.PostRequest("api/client/register", new
|
APIClient.PostRequest("api/client/register", new ClientBindingModel
|
||||||
ClientBindingModel
|
|
||||||
{
|
{
|
||||||
ClientFIO = fio,
|
ClientFIO = fio,
|
||||||
Email = login,
|
Email = login,
|
||||||
@ -251,15 +110,16 @@ namespace SushiBarClientApp.Controllers
|
|||||||
Response.Redirect("Enter");
|
Response.Redirect("Enter");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IActionResult Create()
|
public IActionResult Create()
|
||||||
{
|
{
|
||||||
ViewBag.Sushis =
|
ViewBag.Sushis = APIClient.GetRequest<List<SushiViewModel>>("api/main/getSushilist");
|
||||||
APIClient.GetRequest<List<SushiViewModel>>("api/main/getsushilist");
|
|
||||||
return View();
|
return View();
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public void Create(int sushi, int count)
|
public void Create(int Sushi, int count)
|
||||||
{
|
{
|
||||||
if (APIClient.Client == null)
|
if (APIClient.Client == null)
|
||||||
{
|
{
|
||||||
@ -272,31 +132,31 @@ namespace SushiBarClientApp.Controllers
|
|||||||
APIClient.PostRequest("api/main/createorder", new OrderBindingModel
|
APIClient.PostRequest("api/main/createorder", new OrderBindingModel
|
||||||
{
|
{
|
||||||
ClientId = APIClient.Client.Id,
|
ClientId = APIClient.Client.Id,
|
||||||
SushiId = sushi,
|
SushiId = Sushi,
|
||||||
Count = count,
|
Count = count,
|
||||||
Sum = Calc(count, sushi)
|
Sum = Calc(count, Sushi)
|
||||||
});
|
});
|
||||||
Response.Redirect("Index");
|
Response.Redirect("Index");
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public double Calc(int count, int sushi)
|
public double Calc(int count, int Sushi)
|
||||||
{
|
{
|
||||||
var prod =
|
var sus = APIClient.GetRequest<SushiViewModel>($"api/main/getSushi?SushiId={Sushi}");
|
||||||
APIClient.GetRequest<SushiViewModel>($"api/main/getsushi?sushiId={sushi}"
|
return count * (sus?.Price ?? 1);
|
||||||
);
|
|
||||||
return count * (prod?.Price ?? 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IActionResult Mails()
|
public IActionResult Mails(int page = 1)
|
||||||
{
|
{
|
||||||
if (APIClient.Client == null)
|
if (APIClient.Client == null)
|
||||||
{
|
{
|
||||||
return Redirect("~/Home/Enter");
|
return Redirect("~/Home/Enter");
|
||||||
}
|
}
|
||||||
return View(APIClient.GetRequest<List<MessageInfoViewModel>>($"api/client/getmessages?clientId={APIClient.Client.Id}"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
page = Math.Max(page, 1);
|
||||||
|
return View(APIClient.GetRequest<List<MessageInfoViewModel>>($"api/client/getmessages?clientId={APIClient.Client.Id}&page={page}"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,68 +1,75 @@
|
|||||||
@using SushiBarContracts.ViewModels
|
@using SushiBarContracts.ViewModels
|
||||||
|
|
||||||
@model List<ShopViewModel>
|
@model List<OrderViewModel>
|
||||||
|
|
||||||
@{
|
@{
|
||||||
ViewData["Title"] = "Home Page";
|
ViewData["Title"] = "Home Page";
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<h1 class="display-4">Магазины</h1>
|
<h1 class="display-4">Заказы</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="text-center ">
|
<div class="text-center">
|
||||||
<p>
|
@{
|
||||||
<a asp-action="Create">Создать магазин</a>
|
if (Model == null)
|
||||||
</p>
|
{
|
||||||
|
<h3 class="display-4">Авторизируйтесь</h3>
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
<table class="table">
|
<p>
|
||||||
<thead>
|
<a asp-action="Create">Создать заказ</a>
|
||||||
<tr>
|
</p>
|
||||||
<th>
|
<table class="table">
|
||||||
Номер
|
<thead>
|
||||||
</th>
|
<tr>
|
||||||
<th>
|
<th>
|
||||||
Название
|
Номер
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
Адрес
|
Пицца
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
Дата открытия
|
Дата создания
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
Максимальная вместимость
|
Количество
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
|
Сумма
|
||||||
</th>
|
</th>
|
||||||
</tr>
|
<th>
|
||||||
</thead>
|
Статус
|
||||||
<tbody>
|
</th>
|
||||||
@foreach (var item in Model)
|
</tr>
|
||||||
{
|
</thead>
|
||||||
<tr>
|
<tbody>
|
||||||
<td>
|
@foreach (var item in Model)
|
||||||
@Html.DisplayFor(modelItem => item.Id)
|
{
|
||||||
</td>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
@Html.DisplayFor(modelItem => item.ShopName)
|
@Html.DisplayFor(modelItem => item.Id)
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
@Html.DisplayFor(modelItem => item.Adress)
|
@Html.DisplayFor(modelItem => item.SushiName)
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
@Html.DisplayFor(modelItem => item.OpeningDate)
|
@Html.DisplayFor(modelItem => item.DateCreate)
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
@Html.DisplayFor(modelItem => item.SushiMaxCount)
|
@Html.DisplayFor(modelItem => item.Count)
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a class="btn btn-primary" asp-action="Update" asp-route-Id="@(item.Id)" role="button">Изменить</a>
|
@Html.DisplayFor(modelItem => item.Sum)
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
<td>
|
||||||
}
|
@Html.DisplayFor(modelItem => item.Status)
|
||||||
</tbody>
|
</td>
|
||||||
</table>
|
</tr>
|
||||||
|
}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
@ -1,6 +1,7 @@
|
|||||||
@using SushiBarContracts.ViewModels
|
@using SushiBarContracts.ViewModels
|
||||||
|
|
||||||
@model List<MessageInfoViewModel>
|
@model List<MessageInfoViewModel>
|
||||||
|
@Url.ActionContext.RouteData.Values["page"]
|
||||||
|
|
||||||
@{
|
@{
|
||||||
ViewData["Title"] = "Mails";
|
ViewData["Title"] = "Mails";
|
||||||
@ -16,40 +17,58 @@
|
|||||||
@{
|
@{
|
||||||
if (Model == null)
|
if (Model == null)
|
||||||
{
|
{
|
||||||
<h3 class="display-4">Авторизируйтесь</h3>
|
<h3 class="display-4">Авторизируйтесь</h3>
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
<table class="table">
|
<table class="table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>
|
<th>
|
||||||
Дата письма
|
Дата письма
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
Заголовок
|
Заголовок
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
Текст
|
Текст
|
||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@foreach (var item in Model)
|
@foreach (var item in Model)
|
||||||
{
|
{
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
@Html.DisplayFor(modelItem => item.DateDelivery)
|
@Html.DisplayFor(modelItem => item.DateDelivery)
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
@Html.DisplayFor(modelItem => item.Subject)
|
@Html.DisplayFor(modelItem => item.Subject)
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
@Html.DisplayFor(modelItem => item.Body)
|
@Html.DisplayFor(modelItem => item.Body)
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<div class="d-flex justify-content-center align-items-center">
|
||||||
|
@{
|
||||||
|
int page = int.Parse(Context.Request.Query["page"]);
|
||||||
|
<div class="m-1">
|
||||||
|
<input type="number" class="form-control" min="1" step="1" asp-action="Mails" name="page" value="@(page)" readonly>
|
||||||
|
</div>
|
||||||
|
if (page > 1)
|
||||||
|
{
|
||||||
|
<a name="page" class="btn btn-primary" type="button" asp-action="Mails" asp-route-page="@(page-1)"><-</a>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<p class="btn btn-primary my-auto"><-</p>
|
||||||
|
}
|
||||||
|
|
||||||
|
<a name="" id="" class="btn btn-primary" type="button" asp-action="Mails" asp-route-page="@(page+1)">-></a>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
@ -14,7 +14,7 @@
|
|||||||
<header>
|
<header>
|
||||||
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
|
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">PizzeriaShopsApi</a>
|
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">SushiBarShopsApi</a>
|
||||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
|
||||||
aria-expanded="false" aria-label="Toggle navigation">
|
aria-expanded="false" aria-label="Toggle navigation">
|
||||||
<span class="navbar-toggler-icon"></span>
|
<span class="navbar-toggler-icon"></span>
|
||||||
@ -28,14 +28,14 @@
|
|||||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Личные данные</a>
|
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Личные данные</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Mails">Письма</a>
|
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Mails" asp-route-page="1">Письма</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Enter">Вход</a>
|
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Enter">Вход</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Register">Регистрация</a>
|
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Register">Регистрация</a>
|
||||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Supply">Поставка</a>
|
@* <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Supply">Поставка</a> *@
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace SushiBarContracts.BindingModels
|
||||||
|
{
|
||||||
|
public class MailReplySendInfoBindingModel : MailSendInfoBindingModel
|
||||||
|
{
|
||||||
|
public string ParentMessageId { get; set; } = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
@ -15,5 +15,8 @@ namespace SushiBarContracts.BindingModels
|
|||||||
public string Subject { get; set; } = string.Empty;
|
public string Subject { get; set; } = string.Empty;
|
||||||
public string Body { get; set; } = string.Empty;
|
public string Body { get; set; } = string.Empty;
|
||||||
public DateTime DateDelivery { get; set; }
|
public DateTime DateDelivery { get; set; }
|
||||||
|
public bool IsReaded { get; set; }
|
||||||
|
public string? ReplyMessageId { get; set; }
|
||||||
|
public bool IsReply { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,8 @@ namespace SushiBarContracts.BusinessLogicsContracts
|
|||||||
public interface IMessageInfoLogic
|
public interface IMessageInfoLogic
|
||||||
{
|
{
|
||||||
List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model);
|
List<MessageInfoViewModel>? ReadList(MessageInfoSearchModel? model);
|
||||||
|
MessageInfoViewModel? ReadElement(MessageInfoSearchModel model);
|
||||||
bool Create(MessageInfoBindingModel model);
|
bool Create(MessageInfoBindingModel model);
|
||||||
|
bool Update(MessageInfoBindingModel model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,5 +10,7 @@ namespace SushiBarContracts.SearchModels
|
|||||||
{
|
{
|
||||||
public int? ClientId { get; set; }
|
public int? ClientId { get; set; }
|
||||||
public string? MessageId { get; set; }
|
public string? MessageId { get; set; }
|
||||||
|
public int? PageLength { get; set; }
|
||||||
|
public int? PageIndex { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,5 +15,6 @@ namespace SushiBarContracts.StoragesContracts
|
|||||||
List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model);
|
List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model);
|
||||||
MessageInfoViewModel? GetElement(MessageInfoSearchModel model);
|
MessageInfoViewModel? GetElement(MessageInfoSearchModel model);
|
||||||
MessageInfoViewModel? Insert(MessageInfoBindingModel model);
|
MessageInfoViewModel? Insert(MessageInfoBindingModel model);
|
||||||
|
MessageInfoViewModel? Update(MessageInfoBindingModel model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,5 +25,14 @@ namespace SushiBarContracts.ViewModels
|
|||||||
|
|
||||||
[DisplayName("Текст")]
|
[DisplayName("Текст")]
|
||||||
public string Body { get; set; } = string.Empty;
|
public string Body { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
[DisplayName("Прочитанно")]
|
||||||
|
public bool IsReaded { get; set; }
|
||||||
|
|
||||||
|
public string? ReplyMessageId { get; set; }
|
||||||
|
|
||||||
|
public IMessageInfoModel? Reply { get; set; }
|
||||||
|
|
||||||
|
public bool IsReply { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,11 +8,14 @@ namespace SushiBarDataModels.Models
|
|||||||
{
|
{
|
||||||
public interface IMessageInfoModel
|
public interface IMessageInfoModel
|
||||||
{
|
{
|
||||||
string MessageId { get; }
|
string MessageId { get; }
|
||||||
int? ClientId { get; }
|
int? ClientId { get; }
|
||||||
string SenderName { get; }
|
string SenderName { get; }
|
||||||
DateTime DateDelivery { get; }
|
DateTime DateDelivery { get; }
|
||||||
string Subject { get; }
|
string Subject { get; }
|
||||||
string Body { get; }
|
string Body { get; }
|
||||||
}
|
bool IsReaded { get; }
|
||||||
|
string? ReplyMessageId { get; }
|
||||||
|
bool IsReply { get; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,42 +11,72 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace SushiBarDatabaseImplement.Implements
|
namespace SushiBarDatabaseImplement.Implements
|
||||||
{
|
{
|
||||||
public class MessageInfoStorage : IMessageInfoStorage
|
public class MessageInfoStorage : IMessageInfoStorage
|
||||||
{
|
{
|
||||||
public List<MessageInfoViewModel> GetFullList()
|
public List<MessageInfoViewModel> GetFullList()
|
||||||
{
|
{
|
||||||
using var context = new SushiBarDatabase();
|
using var context = new SushiBarDatabase();
|
||||||
return context.MessageInfos.Select(x => x.GetViewModel).ToList();
|
return context.MessageInfos.Select(x => x.GetViewModel).ToList();
|
||||||
}
|
}
|
||||||
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
|
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
|
||||||
{
|
{
|
||||||
if (!model.ClientId.HasValue)
|
if (!model.ClientId.HasValue && !model.PageLength.HasValue && !model.PageIndex.HasValue)
|
||||||
{
|
{
|
||||||
return new();
|
return new();
|
||||||
}
|
}
|
||||||
using var context = new SushiBarDatabase();
|
using var context = new SushiBarDatabase();
|
||||||
return context.MessageInfos.Where(x => x.ClientId.HasValue && x.ClientId == model.ClientId).Select(x => x.GetViewModel).ToList();
|
IEnumerable<MessageInfo> request = context.MessageInfos.Where(x => !x.IsReply);
|
||||||
}
|
if (model.ClientId.HasValue)
|
||||||
public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
|
request = request.Where(x => x.ClientId.HasValue && x.ClientId == model.ClientId);
|
||||||
{
|
if (model.PageLength.HasValue)
|
||||||
if (string.IsNullOrEmpty(model.MessageId))
|
{
|
||||||
{
|
int skipRows = model.PageIndex.HasValue ? (model.PageIndex.Value - 1) * model.PageLength.Value : 0;
|
||||||
return new();
|
request = request.Skip(skipRows).Take(model.PageLength.Value);
|
||||||
}
|
}
|
||||||
using var context = new SushiBarDatabase();
|
|
||||||
return context.MessageInfos.FirstOrDefault(x => x.MessageId == model.MessageId)?.GetViewModel;
|
return request.Select(x => x.GetViewModel).ToList();
|
||||||
}
|
}
|
||||||
public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
|
|
||||||
{
|
public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
|
||||||
var newMessage = MessageInfo.Create(model);
|
{
|
||||||
if (newMessage == null)
|
if (string.IsNullOrEmpty(model.MessageId))
|
||||||
{
|
{
|
||||||
return null;
|
return new();
|
||||||
}
|
}
|
||||||
using var context = new SushiBarDatabase();
|
using var context = new SushiBarDatabase();
|
||||||
context.MessageInfos.Add(newMessage);
|
return context.MessageInfos.FirstOrDefault(x => x.MessageId == model.MessageId)?.GetViewModel;
|
||||||
context.SaveChanges();
|
}
|
||||||
return newMessage.GetViewModel;
|
public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
|
||||||
}
|
{
|
||||||
}
|
var newMessage = MessageInfo.Create(model);
|
||||||
}
|
if (newMessage == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
using var context = new SushiBarDatabase();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
context.MessageInfos.Add(newMessage);
|
||||||
|
context.SaveChanges();
|
||||||
|
return newMessage.GetViewModel;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessageInfoViewModel? Update(MessageInfoBindingModel model)
|
||||||
|
{
|
||||||
|
using var context = new SushiBarDatabase();
|
||||||
|
var message = context.MessageInfos.FirstOrDefault(x => x.MessageId == model.MessageId);
|
||||||
|
if (message == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
message.Update(context, model);
|
||||||
|
context.SaveChanges();
|
||||||
|
return message.GetViewModel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
392
SushiBar/SushiBarDatabaseImplement/Migrations/20240620075442_InitCreate.Designer.cs
generated
Normal file
392
SushiBar/SushiBarDatabaseImplement/Migrations/20240620075442_InitCreate.Designer.cs
generated
Normal file
@ -0,0 +1,392 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
using SushiBarDatabaseImplement;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace SushiBarDatabaseImplement.Migrations
|
||||||
|
{
|
||||||
|
[DbContext(typeof(SushiBarDatabase))]
|
||||||
|
[Migration("20240620075442_InitCreate")]
|
||||||
|
partial class InitCreate
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
#pragma warning disable 612, 618
|
||||||
|
modelBuilder
|
||||||
|
.HasAnnotation("ProductVersion", "7.0.17")
|
||||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 128);
|
||||||
|
|
||||||
|
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDataModels.Models.Implementer", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("ImplementerFIO")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<string>("Password")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<int>("Qualification")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int>("WorkExperience")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Implementers");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.Client", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("ClientFIO")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<string>("Email")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<string>("Password")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Clients");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.Component", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("ComponentName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<double>("Cost")
|
||||||
|
.HasColumnType("float");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Components");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.MessageInfo", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("MessageId")
|
||||||
|
.HasColumnType("nvarchar(450)");
|
||||||
|
|
||||||
|
b.Property<string>("Body")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<int?>("ClientId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<DateTime>("DateDelivery")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<bool>("IsReaded")
|
||||||
|
.HasColumnType("bit");
|
||||||
|
|
||||||
|
b.Property<bool>("IsReply")
|
||||||
|
.HasColumnType("bit");
|
||||||
|
|
||||||
|
b.Property<string>("ReplyMessageId")
|
||||||
|
.HasColumnType("nvarchar(450)");
|
||||||
|
|
||||||
|
b.Property<string>("SenderName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<string>("Subject")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.HasKey("MessageId");
|
||||||
|
|
||||||
|
b.HasIndex("ClientId");
|
||||||
|
|
||||||
|
b.HasIndex("ReplyMessageId");
|
||||||
|
|
||||||
|
b.ToTable("MessageInfos");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.Order", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<int>("ClientId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int>("Count")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<DateTime>("DateCreate")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("DateImplement")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<int?>("ImplementerId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int>("Status")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<double>("Sum")
|
||||||
|
.HasColumnType("float");
|
||||||
|
|
||||||
|
b.Property<int>("SushiId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("ClientId");
|
||||||
|
|
||||||
|
b.HasIndex("ImplementerId");
|
||||||
|
|
||||||
|
b.HasIndex("SushiId");
|
||||||
|
|
||||||
|
b.ToTable("Orders");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.Shop", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<string>("Adress")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<DateTime>("OpeningDate")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<string>("ShopName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.Property<int>("SushiMaxCount")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Shops");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.ShopSushis", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<int>("Count")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int>("ShopId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int>("SushiId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("ShopId");
|
||||||
|
|
||||||
|
b.HasIndex("SushiId");
|
||||||
|
|
||||||
|
b.ToTable("ShopSushis");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.Sushi", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<double>("Price")
|
||||||
|
.HasColumnType("float");
|
||||||
|
|
||||||
|
b.Property<string>("SushiName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("nvarchar(max)");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Sushis");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.SushiComponent", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<int>("ComponentId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int>("Count")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.Property<int>("SushiId")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("ComponentId");
|
||||||
|
|
||||||
|
b.HasIndex("SushiId");
|
||||||
|
|
||||||
|
b.ToTable("SushiComponents");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.MessageInfo", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("SushiBarDatabaseImplement.Models.Client", "Client")
|
||||||
|
.WithMany("ClientMessages")
|
||||||
|
.HasForeignKey("ClientId");
|
||||||
|
|
||||||
|
b.HasOne("SushiBarDatabaseImplement.Models.MessageInfo", "Reply")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("ReplyMessageId");
|
||||||
|
|
||||||
|
b.Navigation("Client");
|
||||||
|
|
||||||
|
b.Navigation("Reply");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.Order", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("SushiBarDatabaseImplement.Models.Client", "Client")
|
||||||
|
.WithMany("ClientOrders")
|
||||||
|
.HasForeignKey("ClientId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("SushiBarDataModels.Models.Implementer", "Implementer")
|
||||||
|
.WithMany("Order")
|
||||||
|
.HasForeignKey("ImplementerId");
|
||||||
|
|
||||||
|
b.HasOne("SushiBarDatabaseImplement.Models.Sushi", "Sushi")
|
||||||
|
.WithMany("Orders")
|
||||||
|
.HasForeignKey("SushiId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Client");
|
||||||
|
|
||||||
|
b.Navigation("Implementer");
|
||||||
|
|
||||||
|
b.Navigation("Sushi");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.ShopSushis", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("SushiBarDatabaseImplement.Models.Shop", "Shop")
|
||||||
|
.WithMany("Sushis")
|
||||||
|
.HasForeignKey("ShopId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("SushiBarDatabaseImplement.Models.Sushi", "Sushi")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("SushiId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Shop");
|
||||||
|
|
||||||
|
b.Navigation("Sushi");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.SushiComponent", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("SushiBarDatabaseImplement.Models.Component", "Component")
|
||||||
|
.WithMany("SushiComponents")
|
||||||
|
.HasForeignKey("ComponentId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("SushiBarDatabaseImplement.Models.Sushi", "Sushi")
|
||||||
|
.WithMany("Components")
|
||||||
|
.HasForeignKey("SushiId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Component");
|
||||||
|
|
||||||
|
b.Navigation("Sushi");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDataModels.Models.Implementer", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Order");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.Client", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("ClientMessages");
|
||||||
|
|
||||||
|
b.Navigation("ClientOrders");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.Component", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("SushiComponents");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.Shop", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Sushis");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.Sushi", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("Components");
|
||||||
|
|
||||||
|
b.Navigation("Orders");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,286 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace SushiBarDatabaseImplement.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class InitCreate : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "Clients",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
ClientFIO = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||||
|
Email = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||||
|
Password = table.Column<string>(type: "nvarchar(max)", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Clients", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "Components",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
ComponentName = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||||
|
Cost = table.Column<double>(type: "float", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Components", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "Implementers",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
ImplementerFIO = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||||
|
Password = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||||
|
WorkExperience = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Qualification = table.Column<int>(type: "int", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Implementers", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "Shops",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
ShopName = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||||
|
Adress = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||||
|
OpeningDate = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||||
|
SushiMaxCount = table.Column<int>(type: "int", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Shops", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "Sushis",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
SushiName = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||||
|
Price = table.Column<double>(type: "float", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Sushis", x => x.Id);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "MessageInfos",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
MessageId = table.Column<string>(type: "nvarchar(450)", nullable: false),
|
||||||
|
ClientId = table.Column<int>(type: "int", nullable: true),
|
||||||
|
SenderName = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||||
|
DateDelivery = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||||
|
Subject = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||||
|
Body = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
||||||
|
IsReaded = table.Column<bool>(type: "bit", nullable: false),
|
||||||
|
ReplyMessageId = table.Column<string>(type: "nvarchar(450)", nullable: true),
|
||||||
|
IsReply = table.Column<bool>(type: "bit", 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");
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_MessageInfos_MessageInfos_ReplyMessageId",
|
||||||
|
column: x => x.ReplyMessageId,
|
||||||
|
principalTable: "MessageInfos",
|
||||||
|
principalColumn: "MessageId");
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "Orders",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
ClientId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
SushiId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Count = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Sum = table.Column<double>(type: "float", nullable: false),
|
||||||
|
Status = table.Column<int>(type: "int", nullable: false),
|
||||||
|
DateCreate = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||||
|
DateImplement = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||||
|
ImplementerId = table.Column<int>(type: "int", nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Orders", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_Orders_Clients_ClientId",
|
||||||
|
column: x => x.ClientId,
|
||||||
|
principalTable: "Clients",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_Orders_Implementers_ImplementerId",
|
||||||
|
column: x => x.ImplementerId,
|
||||||
|
principalTable: "Implementers",
|
||||||
|
principalColumn: "Id");
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_Orders_Sushis_SushiId",
|
||||||
|
column: x => x.SushiId,
|
||||||
|
principalTable: "Sushis",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "ShopSushis",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
SushiId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
ShopId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Count = table.Column<int>(type: "int", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_ShopSushis", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ShopSushis_Shops_ShopId",
|
||||||
|
column: x => x.ShopId,
|
||||||
|
principalTable: "Shops",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_ShopSushis_Sushis_SushiId",
|
||||||
|
column: x => x.SushiId,
|
||||||
|
principalTable: "Sushis",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "SushiComponents",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<int>(type: "int", nullable: false)
|
||||||
|
.Annotation("SqlServer:Identity", "1, 1"),
|
||||||
|
SushiId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
ComponentId = table.Column<int>(type: "int", nullable: false),
|
||||||
|
Count = table.Column<int>(type: "int", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_SushiComponents", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_SushiComponents_Components_ComponentId",
|
||||||
|
column: x => x.ComponentId,
|
||||||
|
principalTable: "Components",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_SushiComponents_Sushis_SushiId",
|
||||||
|
column: x => x.SushiId,
|
||||||
|
principalTable: "Sushis",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_MessageInfos_ClientId",
|
||||||
|
table: "MessageInfos",
|
||||||
|
column: "ClientId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_MessageInfos_ReplyMessageId",
|
||||||
|
table: "MessageInfos",
|
||||||
|
column: "ReplyMessageId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Orders_ClientId",
|
||||||
|
table: "Orders",
|
||||||
|
column: "ClientId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Orders_ImplementerId",
|
||||||
|
table: "Orders",
|
||||||
|
column: "ImplementerId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Orders_SushiId",
|
||||||
|
table: "Orders",
|
||||||
|
column: "SushiId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ShopSushis_ShopId",
|
||||||
|
table: "ShopSushis",
|
||||||
|
column: "ShopId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_ShopSushis_SushiId",
|
||||||
|
table: "ShopSushis",
|
||||||
|
column: "SushiId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_SushiComponents_ComponentId",
|
||||||
|
table: "SushiComponents",
|
||||||
|
column: "ComponentId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_SushiComponents_SushiId",
|
||||||
|
table: "SushiComponents",
|
||||||
|
column: "SushiId");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "MessageInfos");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Orders");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "ShopSushis");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "SushiComponents");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Clients");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Implementers");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Shops");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Components");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Sushis");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -109,6 +109,15 @@ namespace SushiBarDatabaseImplement.Migrations
|
|||||||
b.Property<DateTime>("DateDelivery")
|
b.Property<DateTime>("DateDelivery")
|
||||||
.HasColumnType("datetime2");
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<bool>("IsReaded")
|
||||||
|
.HasColumnType("bit");
|
||||||
|
|
||||||
|
b.Property<bool>("IsReply")
|
||||||
|
.HasColumnType("bit");
|
||||||
|
|
||||||
|
b.Property<string>("ReplyMessageId")
|
||||||
|
.HasColumnType("nvarchar(450)");
|
||||||
|
|
||||||
b.Property<string>("SenderName")
|
b.Property<string>("SenderName")
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("nvarchar(max)");
|
.HasColumnType("nvarchar(max)");
|
||||||
@ -121,6 +130,8 @@ namespace SushiBarDatabaseImplement.Migrations
|
|||||||
|
|
||||||
b.HasIndex("ClientId");
|
b.HasIndex("ClientId");
|
||||||
|
|
||||||
|
b.HasIndex("ReplyMessageId");
|
||||||
|
|
||||||
b.ToTable("MessageInfos");
|
b.ToTable("MessageInfos");
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -272,7 +283,13 @@ namespace SushiBarDatabaseImplement.Migrations
|
|||||||
.WithMany("ClientMessages")
|
.WithMany("ClientMessages")
|
||||||
.HasForeignKey("ClientId");
|
.HasForeignKey("ClientId");
|
||||||
|
|
||||||
|
b.HasOne("SushiBarDatabaseImplement.Models.MessageInfo", "Reply")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("ReplyMessageId");
|
||||||
|
|
||||||
b.Navigation("Client");
|
b.Navigation("Client");
|
||||||
|
|
||||||
|
b.Navigation("Reply");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("SushiBarDatabaseImplement.Models.Order", b =>
|
modelBuilder.Entity("SushiBarDatabaseImplement.Models.Order", b =>
|
||||||
|
@ -11,54 +11,85 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace SushiBarDatabaseImplement.Models
|
namespace SushiBarDatabaseImplement.Models
|
||||||
{
|
{
|
||||||
public class MessageInfo : IMessageInfoModel
|
public class MessageInfo : IMessageInfoModel
|
||||||
{
|
{
|
||||||
[Key]
|
[Key]
|
||||||
[DatabaseGenerated(DatabaseGeneratedOption.None)]
|
[DatabaseGenerated(DatabaseGeneratedOption.None)]
|
||||||
public string MessageId { get; set; } = string.Empty;
|
public string MessageId { get; set; } = string.Empty;
|
||||||
|
|
||||||
public int? ClientId { get; set; }
|
public int? ClientId { get; set; }
|
||||||
|
|
||||||
public virtual Client? Client { get; set; }
|
public virtual Client? Client { get; set; }
|
||||||
|
|
||||||
[Required]
|
[Required]
|
||||||
public string SenderName { get; set; } = string.Empty;
|
public string SenderName { get; set; } = string.Empty;
|
||||||
|
|
||||||
[Required]
|
[Required]
|
||||||
public DateTime DateDelivery { get; set; }
|
public DateTime DateDelivery { get; set; }
|
||||||
|
|
||||||
[Required]
|
[Required]
|
||||||
public string Subject { get; set; } = string.Empty;
|
public string Subject { get; set; } = string.Empty;
|
||||||
|
|
||||||
[Required]
|
[Required]
|
||||||
public string Body { get; set; } = string.Empty;
|
public string Body { get; set; } = string.Empty;
|
||||||
|
|
||||||
public static MessageInfo? Create(MessageInfoBindingModel? model)
|
[Required]
|
||||||
{
|
public bool IsReaded { get; set; }
|
||||||
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 string? ReplyMessageId { get; set; }
|
||||||
}
|
|
||||||
|
|
||||||
public MessageInfoViewModel GetViewModel => new()
|
[ForeignKey("ReplyMessageId")]
|
||||||
{
|
public virtual MessageInfo? Reply { get; set; }
|
||||||
MessageId = MessageId,
|
|
||||||
ClientId = ClientId,
|
[Required]
|
||||||
SenderName = SenderName,
|
public bool IsReply { get; set; }
|
||||||
DateDelivery = DateDelivery,
|
|
||||||
Subject = Subject,
|
public static MessageInfo? Create(MessageInfoBindingModel? model)
|
||||||
Body = Body
|
{
|
||||||
};
|
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,
|
||||||
|
IsReaded = model.IsReaded,
|
||||||
|
ReplyMessageId = model.ReplyMessageId,
|
||||||
|
IsReply = model.IsReply
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Update(SushiBarDatabase context, MessageInfoBindingModel model)
|
||||||
|
{
|
||||||
|
if (model == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
IsReaded = model.IsReaded;
|
||||||
|
ReplyMessageId = model.ReplyMessageId;
|
||||||
|
if (!string.IsNullOrEmpty(ReplyMessageId))
|
||||||
|
{
|
||||||
|
Reply = context.MessageInfos.First(x => x.MessageId == ReplyMessageId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessageInfoViewModel GetViewModel => new()
|
||||||
|
{
|
||||||
|
MessageId = MessageId,
|
||||||
|
ClientId = ClientId,
|
||||||
|
SenderName = SenderName,
|
||||||
|
DateDelivery = DateDelivery,
|
||||||
|
Subject = Subject,
|
||||||
|
Body = Body,
|
||||||
|
IsReaded = IsReaded,
|
||||||
|
ReplyMessageId = ReplyMessageId,
|
||||||
|
Reply = Reply,
|
||||||
|
IsReply = IsReply
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -11,48 +11,61 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace SushiBarFileImplement.Implements
|
namespace SushiBarFileImplement.Implements
|
||||||
{
|
{
|
||||||
public class MessageInfoStorage : IMessageInfoStorage
|
public class MessageInfoStorage : IMessageInfoStorage
|
||||||
{
|
{
|
||||||
private readonly DataFileSingleton _source;
|
private readonly DataFileSingleton _source;
|
||||||
public MessageInfoStorage()
|
public MessageInfoStorage()
|
||||||
{
|
{
|
||||||
_source = DataFileSingleton.GetInstance();
|
_source = DataFileSingleton.GetInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
|
public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
|
||||||
{
|
{
|
||||||
if (model.MessageId != null)
|
if (model.MessageId != null)
|
||||||
{
|
{
|
||||||
return _source.Messages.FirstOrDefault(x => x.MessageId == model.MessageId)?.GetViewModel;
|
return _source.Messages.FirstOrDefault(x => x.MessageId == model.MessageId)?.GetViewModel;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
|
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
|
||||||
{
|
{
|
||||||
return _source.Messages
|
var res = _source.Messages.Where(x => !model.ClientId.HasValue || x.ClientId == model.ClientId).Select(x => x.GetViewModel);
|
||||||
.Where(x => x.ClientId == model.ClientId)
|
if (!(model.PageIndex.HasValue && model.PageLength.HasValue))
|
||||||
.Select(x => x.GetViewModel)
|
{
|
||||||
.ToList();
|
return res.ToList();
|
||||||
}
|
}
|
||||||
|
return res.Skip((model.PageIndex.Value - 1) * model.PageLength.Value).Take(model.PageLength.Value).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
public List<MessageInfoViewModel> GetFullList()
|
public List<MessageInfoViewModel> GetFullList()
|
||||||
{
|
{
|
||||||
return _source.Messages
|
return _source.Messages
|
||||||
.Select(x => x.GetViewModel)
|
.Select(x => x.GetViewModel)
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
|
public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
|
||||||
{
|
{
|
||||||
var newMessage = MessageInfo.Create(model);
|
var newMessage = MessageInfo.Create(model);
|
||||||
if (newMessage == null)
|
if (newMessage == null)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
_source.Messages.Add(newMessage);
|
_source.Messages.Add(newMessage);
|
||||||
_source.SaveMessages();
|
_source.SaveMessages();
|
||||||
return newMessage.GetViewModel;
|
return newMessage.GetViewModel;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
public MessageInfoViewModel? Update(MessageInfoBindingModel model)
|
||||||
|
{
|
||||||
|
var res = _source.Messages.FirstOrDefault(x => x.MessageId.Equals(model.MessageId));
|
||||||
|
if (res != null)
|
||||||
|
{
|
||||||
|
res.Update(model);
|
||||||
|
_source.SaveMessages();
|
||||||
|
}
|
||||||
|
return res?.GetViewModel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -12,69 +12,94 @@ namespace SushiBarFileImplement.Models
|
|||||||
{
|
{
|
||||||
public class MessageInfo : IMessageInfoModel
|
public class MessageInfo : IMessageInfoModel
|
||||||
{
|
{
|
||||||
public string MessageId { get; private set; } = string.Empty;
|
public string MessageId { get; private set; } = string.Empty;
|
||||||
|
|
||||||
public int? ClientId { get; private set; }
|
public int? ClientId { get; private set; }
|
||||||
|
|
||||||
public string SenderName { get; private set; } = string.Empty;
|
public string SenderName { get; private set; } = string.Empty;
|
||||||
|
|
||||||
public DateTime DateDelivery { get; private set; } = DateTime.Now;
|
public DateTime DateDelivery { get; private set; } = DateTime.Now;
|
||||||
|
|
||||||
public string Subject { get; private set; } = string.Empty;
|
public string Subject { get; private set; } = string.Empty;
|
||||||
|
|
||||||
public string Body { get; private set; } = string.Empty;
|
public string Body { get; private set; } = string.Empty;
|
||||||
|
public bool IsReaded { get; private set; }
|
||||||
|
public bool IsReply { get; private set; }
|
||||||
|
public string? ReplyMessageId { get; private set; } = string.Empty;
|
||||||
|
|
||||||
public static MessageInfo? Create(MessageInfoBindingModel model)
|
public static MessageInfo? Create(MessageInfoBindingModel model)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return new()
|
return new()
|
||||||
{
|
{
|
||||||
Body = model.Body,
|
Body = model.Body,
|
||||||
Subject = model.Subject,
|
IsReply = model.IsReply,
|
||||||
ClientId = model.ClientId,
|
IsReaded = model.IsReaded,
|
||||||
MessageId = model.MessageId,
|
Subject = model.Subject,
|
||||||
SenderName = model.SenderName,
|
ClientId = model.ClientId,
|
||||||
DateDelivery = model.DateDelivery,
|
MessageId = model.MessageId,
|
||||||
};
|
SenderName = model.SenderName,
|
||||||
}
|
DateDelivery = model.DateDelivery,
|
||||||
|
ReplyMessageId = model.ReplyMessageId,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public static MessageInfo? Create(XElement element)
|
public static MessageInfo? Create(XElement element)
|
||||||
{
|
{
|
||||||
if (element == null)
|
if (element == null)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return new()
|
return new()
|
||||||
{
|
{
|
||||||
Body = element.Attribute("Body")!.Value,
|
Body = element.Attribute("Body")!.Value,
|
||||||
Subject = element.Attribute("Subject")!.Value,
|
IsReply = Convert.ToBoolean(element.Attribute("IsReply")!.Value),
|
||||||
ClientId = Convert.ToInt32(element.Attribute("ClientId")!.Value),
|
IsReaded = Convert.ToBoolean(element.Attribute("HasRead")!.Value),
|
||||||
MessageId = element.Attribute("MessageId")!.Value,
|
Subject = element.Attribute("Subject")!.Value,
|
||||||
SenderName = element.Attribute("SenderName")!.Value,
|
ClientId = Convert.ToInt32(element.Attribute("ClientId")!.Value),
|
||||||
DateDelivery = Convert.ToDateTime(element.Attribute("DateDelivery")!.Value),
|
MessageId = element.Attribute("MessageId")!.Value,
|
||||||
};
|
ReplyMessageId = element.Attribute("ReplyMessageId")!.Value,
|
||||||
}
|
SenderName = element.Attribute("SenderName")!.Value,
|
||||||
|
DateDelivery = Convert.ToDateTime(element.Attribute("DateDelivery")!.Value),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public MessageInfoViewModel GetViewModel => new()
|
public void Update(MessageInfoBindingModel model)
|
||||||
{
|
{
|
||||||
Body = Body,
|
if (model == null)
|
||||||
Subject = Subject,
|
{
|
||||||
ClientId = ClientId,
|
return;
|
||||||
MessageId = MessageId,
|
}
|
||||||
SenderName = SenderName,
|
IsReply = model.IsReply;
|
||||||
DateDelivery = DateDelivery,
|
IsReaded = model.IsReaded;
|
||||||
};
|
}
|
||||||
|
|
||||||
public XElement GetXElement => new("MessageInfo",
|
public MessageInfoViewModel GetViewModel => new()
|
||||||
new XAttribute("Body", Body),
|
{
|
||||||
new XAttribute("Subject", Subject),
|
Body = Body,
|
||||||
new XAttribute("ClientId", ClientId),
|
IsReply = IsReply,
|
||||||
new XAttribute("MessageId", MessageId),
|
IsReaded = IsReaded,
|
||||||
new XAttribute("SenderName", SenderName),
|
Subject = Subject,
|
||||||
new XAttribute("DateDelivery", DateDelivery)
|
ClientId = ClientId,
|
||||||
);
|
MessageId = MessageId,
|
||||||
}
|
SenderName = SenderName,
|
||||||
}
|
DateDelivery = DateDelivery,
|
||||||
|
ReplyMessageId = ReplyMessageId,
|
||||||
|
};
|
||||||
|
|
||||||
|
public XElement GetXElement => new("MessageInfo",
|
||||||
|
new XAttribute("Body", Body),
|
||||||
|
new XAttribute("IsReply", IsReply),
|
||||||
|
new XAttribute("IsReaded", IsReaded),
|
||||||
|
new XAttribute("Subject", Subject),
|
||||||
|
new XAttribute("ClientId", ClientId),
|
||||||
|
new XAttribute("MessageId", MessageId),
|
||||||
|
new XAttribute("ReplyMessageId", ReplyMessageId),
|
||||||
|
new XAttribute("SenderName", SenderName),
|
||||||
|
new XAttribute("DateDelivery", DateDelivery)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -13,58 +13,83 @@ using SushiBarListImplement.Models;
|
|||||||
|
|
||||||
namespace SushiBarListImplement.Implements
|
namespace SushiBarListImplement.Implements
|
||||||
{
|
{
|
||||||
public class MessageInfoStorage : IMessageInfoStorage
|
public class MessageInfoStorage : IMessageInfoStorage
|
||||||
{
|
{
|
||||||
private readonly DataListSingleton _source;
|
private readonly DataListSingleton _source;
|
||||||
public MessageInfoStorage()
|
public MessageInfoStorage()
|
||||||
{
|
{
|
||||||
_source = DataListSingleton.GetInstance();
|
_source = DataListSingleton.GetInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<MessageInfoViewModel> GetFullList()
|
public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
|
||||||
{
|
{
|
||||||
List<MessageInfoViewModel> result = new();
|
foreach (var message in _source.Messages)
|
||||||
foreach (var item in _source.Messages)
|
{
|
||||||
{
|
if (model.MessageId != null && model.MessageId.Equals(message.MessageId))
|
||||||
result.Add(item.GetViewModel);
|
return message.GetViewModel;
|
||||||
}
|
}
|
||||||
return result;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
|
public List<MessageInfoViewModel> GetFilteredList(MessageInfoSearchModel model)
|
||||||
{
|
{
|
||||||
List<MessageInfoViewModel> result = new();
|
List<MessageInfoViewModel> result = new();
|
||||||
foreach (var item in _source.Messages)
|
foreach (var item in _source.Messages)
|
||||||
{
|
{
|
||||||
if (item.ClientId.HasValue && item.ClientId == model.ClientId)
|
if (item.ClientId.HasValue && item.ClientId == model.ClientId)
|
||||||
{
|
{
|
||||||
result.Add(item.GetViewModel);
|
result.Add(item.GetViewModel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MessageInfoViewModel? GetElement(MessageInfoSearchModel model)
|
if (!(model.PageIndex.HasValue && model.PageLength.HasValue))
|
||||||
{
|
{
|
||||||
foreach (var message in _source.Messages)
|
return result;
|
||||||
{
|
}
|
||||||
if (model.MessageId != null && model.MessageId.Equals(message.MessageId))
|
if (model.PageIndex * model.PageLength >= result.Count)
|
||||||
{
|
{
|
||||||
return message.GetViewModel;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
List<MessageInfoViewModel> filteredResult = new();
|
||||||
return null;
|
for (var i = (model.PageIndex.Value - 1) * model.PageLength.Value; i < model.PageIndex.Value * model.PageLength.Value; i++)
|
||||||
}
|
{
|
||||||
|
filteredResult.Add(result[i]);
|
||||||
|
}
|
||||||
|
return filteredResult;
|
||||||
|
}
|
||||||
|
|
||||||
public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
|
public List<MessageInfoViewModel> GetFullList()
|
||||||
{
|
{
|
||||||
var newMessage = MessageInfo.Create(model);
|
List<MessageInfoViewModel> result = new();
|
||||||
if (newMessage == null)
|
foreach (var item in _source.Messages)
|
||||||
{
|
{
|
||||||
return null;
|
result.Add(item.GetViewModel);
|
||||||
}
|
}
|
||||||
_source.Messages.Add(newMessage);
|
return result;
|
||||||
return newMessage.GetViewModel;
|
}
|
||||||
}
|
|
||||||
}
|
public MessageInfoViewModel? Insert(MessageInfoBindingModel model)
|
||||||
}
|
{
|
||||||
|
var newMessage = MessageInfo.Create(model);
|
||||||
|
if (newMessage == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
_source.Messages.Add(newMessage);
|
||||||
|
return newMessage.GetViewModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessageInfoViewModel? Update(MessageInfoBindingModel model)
|
||||||
|
{
|
||||||
|
foreach (var message in _source.Messages)
|
||||||
|
{
|
||||||
|
if (message.MessageId.Equals(model.MessageId))
|
||||||
|
{
|
||||||
|
message.Update(model);
|
||||||
|
return message.GetViewModel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -11,43 +11,62 @@ namespace SushiBarListImplement.Models
|
|||||||
{
|
{
|
||||||
public class MessageInfo : IMessageInfoModel
|
public class MessageInfo : IMessageInfoModel
|
||||||
{
|
{
|
||||||
public string MessageId { get; private set; } = string.Empty;
|
public string MessageId { get; private set; } = string.Empty;
|
||||||
|
|
||||||
public int? ClientId { get; private set; }
|
public int? ClientId { get; private set; }
|
||||||
|
|
||||||
public string SenderName { get; private set; } = string.Empty;
|
public string SenderName { get; private set; } = string.Empty;
|
||||||
|
|
||||||
public DateTime DateDelivery { get; private set; } = DateTime.Now;
|
public DateTime DateDelivery { get; private set; } = DateTime.Now;
|
||||||
|
|
||||||
public string Subject { get; private set; } = string.Empty;
|
public string Subject { get; private set; } = string.Empty;
|
||||||
|
|
||||||
public string Body { get; private set; } = string.Empty;
|
public string Body { get; private set; } = string.Empty;
|
||||||
|
public bool IsReaded { get; private set; }
|
||||||
|
public bool IsReply { get; private set; }
|
||||||
|
public string? ReplyMessageId { get; private set; }
|
||||||
|
|
||||||
public static MessageInfo? Create(MessageInfoBindingModel model)
|
public static MessageInfo? Create(MessageInfoBindingModel model)
|
||||||
{
|
{
|
||||||
if (model == null)
|
if (model == null)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return new()
|
return new()
|
||||||
{
|
{
|
||||||
Body = model.Body,
|
Body = model.Body,
|
||||||
Subject = model.Subject,
|
IsReply = model.IsReply,
|
||||||
ClientId = model.ClientId,
|
IsReaded = model.IsReaded,
|
||||||
MessageId = model.MessageId,
|
Subject = model.Subject,
|
||||||
SenderName = model.SenderName,
|
ClientId = model.ClientId,
|
||||||
DateDelivery = model.DateDelivery,
|
MessageId = model.MessageId,
|
||||||
};
|
SenderName = model.SenderName,
|
||||||
}
|
DateDelivery = model.DateDelivery,
|
||||||
|
ReplyMessageId = model.ReplyMessageId,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public MessageInfoViewModel GetViewModel => new()
|
public void Update(MessageInfoBindingModel model)
|
||||||
{
|
{
|
||||||
Body = Body,
|
if (model == null)
|
||||||
Subject = Subject,
|
{
|
||||||
ClientId = ClientId,
|
return;
|
||||||
MessageId = MessageId,
|
}
|
||||||
SenderName = SenderName,
|
IsReply = model.IsReply;
|
||||||
DateDelivery = DateDelivery,
|
IsReaded = model.IsReaded;
|
||||||
};
|
}
|
||||||
}
|
|
||||||
}
|
public MessageInfoViewModel GetViewModel => new()
|
||||||
|
{
|
||||||
|
Body = Body,
|
||||||
|
IsReply = IsReply,
|
||||||
|
IsReaded = IsReaded,
|
||||||
|
Subject = Subject,
|
||||||
|
ClientId = ClientId,
|
||||||
|
MessageId = MessageId,
|
||||||
|
SenderName = SenderName,
|
||||||
|
DateDelivery = DateDelivery,
|
||||||
|
ReplyMessageId = ReplyMessageId,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -11,80 +11,86 @@ using System.Net;
|
|||||||
|
|
||||||
namespace SushiBarRestApi.Controllers
|
namespace SushiBarRestApi.Controllers
|
||||||
{
|
{
|
||||||
[Route("api/[controller]/[action]")]
|
[Route("api/[controller]/[action]")]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
public class ClientController : Controller
|
public class ClientController : Controller
|
||||||
{
|
{
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private readonly IClientLogic _logic;
|
|
||||||
private readonly IMessageInfoLogic _mailLogic;
|
|
||||||
|
|
||||||
public ClientController(IClientLogic logic, ILogger<ClientController> logger, IMessageInfoLogic mailLogic)
|
private readonly IClientLogic _logic;
|
||||||
{
|
|
||||||
_logger = logger;
|
|
||||||
_logic = logic;
|
|
||||||
_mailLogic = mailLogic;
|
|
||||||
}
|
|
||||||
[HttpGet]
|
|
||||||
public ClientViewModel? Login(string login, string password)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return _logic.ReadElement(new ClientSearchModel
|
|
||||||
{
|
|
||||||
Email = login,
|
|
||||||
Password = password
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "Ошибка входа в систему");
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[HttpPost]
|
|
||||||
public void Register(ClientBindingModel model)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_logic.Create(model);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "Ошибка регистрации");
|
|
||||||
Response.StatusCode = (int)HttpStatusCode.NotAcceptable;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[HttpPost]
|
|
||||||
public void UpdateData(ClientBindingModel model)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_logic.Update(model);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "Ошибка обновления данных");
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[HttpGet]
|
|
||||||
public List<MessageInfoViewModel>? GetMessages(int clientId)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return _mailLogic.ReadList(new MessageInfoSearchModel
|
|
||||||
{
|
|
||||||
ClientId = clientId
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogError(ex, "Ошибка получения писем клиента");
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
private readonly IMessageInfoLogic _mailLogic;
|
||||||
}
|
|
||||||
|
|
||||||
|
public ClientController(IClientLogic logic, ILogger<ClientController> logger, IMessageInfoLogic mailLogic)
|
||||||
|
{
|
||||||
|
_logger = logger;
|
||||||
|
_logic = logic;
|
||||||
|
_mailLogic = mailLogic;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
public ClientViewModel? Login(string login, string password)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return _logic.ReadElement(new ClientSearchModel
|
||||||
|
{
|
||||||
|
Email = login,
|
||||||
|
Password = password
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Ошибка входа в систему");
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
public void Register(ClientBindingModel model)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_logic.Create(model);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Ошибка регистрации");
|
||||||
|
Response.StatusCode = (int)HttpStatusCode.NotAcceptable;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
public void UpdateData(ClientBindingModel model)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_logic.Update(model);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Ошибка обновления данных");
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
public List<MessageInfoViewModel>? GetMessages(int clientId, int page, int pagesize = 1)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return _mailLogic.ReadList(new MessageInfoSearchModel
|
||||||
|
{
|
||||||
|
ClientId = clientId,
|
||||||
|
PageLength = pagesize,
|
||||||
|
PageIndex = page
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Ошибка получения писем клиента");
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
182
SushiBar/SushiBarView/FormLetter.Designer.cs
generated
Normal file
182
SushiBar/SushiBarView/FormLetter.Designer.cs
generated
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
namespace SushiBarView
|
||||||
|
{
|
||||||
|
partial class FormLetter
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.textBoxEmail = new System.Windows.Forms.TextBox();
|
||||||
|
this.labelAdress = new System.Windows.Forms.Label();
|
||||||
|
this.labelSubject = new System.Windows.Forms.Label();
|
||||||
|
this.textBoxSubject = new System.Windows.Forms.TextBox();
|
||||||
|
this.labelBody = new System.Windows.Forms.Label();
|
||||||
|
this.textBoxBody = new System.Windows.Forms.TextBox();
|
||||||
|
this.buttonClose = new System.Windows.Forms.Button();
|
||||||
|
this.buttonReply = new System.Windows.Forms.Button();
|
||||||
|
this.labelDate = new System.Windows.Forms.Label();
|
||||||
|
this.textBoxDate = new System.Windows.Forms.TextBox();
|
||||||
|
this.buttonSend = new System.Windows.Forms.Button();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// textBoxEmail
|
||||||
|
//
|
||||||
|
this.textBoxEmail.Location = new System.Drawing.Point(72, 6);
|
||||||
|
this.textBoxEmail.Name = "textBoxEmail";
|
||||||
|
this.textBoxEmail.ReadOnly = true;
|
||||||
|
this.textBoxEmail.Size = new System.Drawing.Size(186, 27);
|
||||||
|
this.textBoxEmail.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// labelAdress
|
||||||
|
//
|
||||||
|
this.labelAdress.AutoSize = true;
|
||||||
|
this.labelAdress.Location = new System.Drawing.Point(12, 9);
|
||||||
|
this.labelAdress.Name = "labelAdress";
|
||||||
|
this.labelAdress.Size = new System.Drawing.Size(54, 20);
|
||||||
|
this.labelAdress.TabIndex = 1;
|
||||||
|
this.labelAdress.Text = "Адрес:";
|
||||||
|
//
|
||||||
|
// labelSubject
|
||||||
|
//
|
||||||
|
this.labelSubject.AutoSize = true;
|
||||||
|
this.labelSubject.Location = new System.Drawing.Point(12, 55);
|
||||||
|
this.labelSubject.Name = "labelSubject";
|
||||||
|
this.labelSubject.Size = new System.Drawing.Size(47, 20);
|
||||||
|
this.labelSubject.TabIndex = 2;
|
||||||
|
this.labelSubject.Text = "Тема:";
|
||||||
|
//
|
||||||
|
// textBoxSubject
|
||||||
|
//
|
||||||
|
this.textBoxSubject.Location = new System.Drawing.Point(72, 52);
|
||||||
|
this.textBoxSubject.Name = "textBoxSubject";
|
||||||
|
this.textBoxSubject.ReadOnly = true;
|
||||||
|
this.textBoxSubject.Size = new System.Drawing.Size(552, 27);
|
||||||
|
this.textBoxSubject.TabIndex = 3;
|
||||||
|
//
|
||||||
|
// labelBody
|
||||||
|
//
|
||||||
|
this.labelBody.AutoSize = true;
|
||||||
|
this.labelBody.Location = new System.Drawing.Point(12, 96);
|
||||||
|
this.labelBody.Name = "labelBody";
|
||||||
|
this.labelBody.Size = new System.Drawing.Size(104, 20);
|
||||||
|
this.labelBody.TabIndex = 4;
|
||||||
|
this.labelBody.Text = "Текст письма:";
|
||||||
|
//
|
||||||
|
// textBoxBody
|
||||||
|
//
|
||||||
|
this.textBoxBody.Location = new System.Drawing.Point(12, 119);
|
||||||
|
this.textBoxBody.Multiline = true;
|
||||||
|
this.textBoxBody.Name = "textBoxBody";
|
||||||
|
this.textBoxBody.ReadOnly = true;
|
||||||
|
this.textBoxBody.Size = new System.Drawing.Size(612, 186);
|
||||||
|
this.textBoxBody.TabIndex = 5;
|
||||||
|
//
|
||||||
|
// buttonClose
|
||||||
|
//
|
||||||
|
this.buttonClose.Location = new System.Drawing.Point(491, 326);
|
||||||
|
this.buttonClose.Name = "buttonClose";
|
||||||
|
this.buttonClose.Size = new System.Drawing.Size(111, 39);
|
||||||
|
this.buttonClose.TabIndex = 6;
|
||||||
|
this.buttonClose.Text = "Закрыть";
|
||||||
|
this.buttonClose.UseVisualStyleBackColor = true;
|
||||||
|
this.buttonClose.Click += new System.EventHandler(this.buttonClose_Click);
|
||||||
|
//
|
||||||
|
// buttonReply
|
||||||
|
//
|
||||||
|
this.buttonReply.Location = new System.Drawing.Point(290, 326);
|
||||||
|
this.buttonReply.Name = "buttonReply";
|
||||||
|
this.buttonReply.Size = new System.Drawing.Size(177, 39);
|
||||||
|
this.buttonReply.TabIndex = 7;
|
||||||
|
this.buttonReply.Text = "Ответить";
|
||||||
|
this.buttonReply.UseVisualStyleBackColor = true;
|
||||||
|
this.buttonReply.Click += new System.EventHandler(this.buttonReply_Click);
|
||||||
|
//
|
||||||
|
// labelDate
|
||||||
|
//
|
||||||
|
this.labelDate.AutoSize = true;
|
||||||
|
this.labelDate.Location = new System.Drawing.Point(278, 9);
|
||||||
|
this.labelDate.Name = "labelDate";
|
||||||
|
this.labelDate.Size = new System.Drawing.Size(127, 20);
|
||||||
|
this.labelDate.TabIndex = 8;
|
||||||
|
this.labelDate.Text = "Дата получения: ";
|
||||||
|
//
|
||||||
|
// textBoxDate
|
||||||
|
//
|
||||||
|
this.textBoxDate.Location = new System.Drawing.Point(411, 6);
|
||||||
|
this.textBoxDate.Name = "textBoxDate";
|
||||||
|
this.textBoxDate.ReadOnly = true;
|
||||||
|
this.textBoxDate.Size = new System.Drawing.Size(213, 27);
|
||||||
|
this.textBoxDate.TabIndex = 9;
|
||||||
|
//
|
||||||
|
// buttonSend
|
||||||
|
//
|
||||||
|
this.buttonSend.Location = new System.Drawing.Point(149, 326);
|
||||||
|
this.buttonSend.Name = "buttonSend";
|
||||||
|
this.buttonSend.Size = new System.Drawing.Size(109, 39);
|
||||||
|
this.buttonSend.TabIndex = 10;
|
||||||
|
this.buttonSend.Text = "Отправить";
|
||||||
|
this.buttonSend.UseVisualStyleBackColor = true;
|
||||||
|
this.buttonSend.Visible = false;
|
||||||
|
this.buttonSend.Click += new System.EventHandler(this.buttonSend_Click);
|
||||||
|
//
|
||||||
|
// FormLetter
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(636, 377);
|
||||||
|
this.Controls.Add(this.buttonSend);
|
||||||
|
this.Controls.Add(this.textBoxDate);
|
||||||
|
this.Controls.Add(this.labelDate);
|
||||||
|
this.Controls.Add(this.buttonReply);
|
||||||
|
this.Controls.Add(this.buttonClose);
|
||||||
|
this.Controls.Add(this.textBoxBody);
|
||||||
|
this.Controls.Add(this.labelBody);
|
||||||
|
this.Controls.Add(this.textBoxSubject);
|
||||||
|
this.Controls.Add(this.labelSubject);
|
||||||
|
this.Controls.Add(this.labelAdress);
|
||||||
|
this.Controls.Add(this.textBoxEmail);
|
||||||
|
this.Name = "FormLetter";
|
||||||
|
this.Text = "Письмо";
|
||||||
|
this.Load += new System.EventHandler(this.FormLetter_Load);
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private TextBox textBoxEmail;
|
||||||
|
private Label labelAdress;
|
||||||
|
private Label labelSubject;
|
||||||
|
private TextBox textBoxSubject;
|
||||||
|
private Label labelBody;
|
||||||
|
private TextBox textBoxBody;
|
||||||
|
private Button buttonClose;
|
||||||
|
private Button buttonReply;
|
||||||
|
private Label labelDate;
|
||||||
|
private TextBox textBoxDate;
|
||||||
|
private Button buttonSend;
|
||||||
|
}
|
||||||
|
}
|
152
SushiBar/SushiBarView/FormLetter.cs
Normal file
152
SushiBar/SushiBarView/FormLetter.cs
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using SushiBar;
|
||||||
|
using SushiBarBusinessLogic.MailWorker;
|
||||||
|
using SushiBarContracts.BindingModels;
|
||||||
|
using SushiBarContracts.BusinessLogicsContracts;
|
||||||
|
using SushiBarContracts.SearchModels;
|
||||||
|
using SushiBarContracts.ViewModels;
|
||||||
|
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;
|
||||||
|
using System.Windows.Forms.VisualStyles;
|
||||||
|
|
||||||
|
namespace SushiBarView
|
||||||
|
{
|
||||||
|
public partial class FormLetter : Form
|
||||||
|
{
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
private readonly IMessageInfoLogic _logic;
|
||||||
|
private readonly AbstractMailWorker _worker;
|
||||||
|
|
||||||
|
public MessageInfoViewModel? model;
|
||||||
|
public string? messageId;
|
||||||
|
|
||||||
|
public FormLetter(ILogger<FormLetter> logger, IMessageInfoLogic logic, AbstractMailWorker worker)
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
_logger = logger;
|
||||||
|
_logic = logic;
|
||||||
|
_worker = worker;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void FormLetter_Load(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(messageId))
|
||||||
|
{
|
||||||
|
ReloadLetter();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (model != null)
|
||||||
|
{
|
||||||
|
ConfigurateToCreateAnsver();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_logger.LogError("Для формы не переданно сведений о письме, на которое отвечаем!");
|
||||||
|
DialogResult = DialogResult.Abort;
|
||||||
|
Close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ReloadLetter()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("Загрузка существующего письма с id:{}", messageId);
|
||||||
|
model = _logic.ReadElement(new MessageInfoSearchModel
|
||||||
|
{
|
||||||
|
MessageId = messageId
|
||||||
|
});
|
||||||
|
if (model != null)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("Письмо найдено");
|
||||||
|
textBoxEmail.Text = model.SenderName;
|
||||||
|
textBoxDate.Text = model.DateDelivery.ToString();
|
||||||
|
textBoxSubject.Text = model.Subject;
|
||||||
|
textBoxBody.Text = model.Body;
|
||||||
|
|
||||||
|
|
||||||
|
if (model.IsReply)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("Письмо само и есть ответ");
|
||||||
|
buttonReply.Visible = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(model.ReplyMessageId))
|
||||||
|
{
|
||||||
|
_logger.LogInformation("У письма есть ответ.");
|
||||||
|
buttonReply.Text = "Прочитать ответ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_logger.LogWarning("Письмо с таким id не удалось найти");
|
||||||
|
DialogResult = DialogResult.Abort;
|
||||||
|
Close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ConfigurateToCreateAnsver()
|
||||||
|
{
|
||||||
|
textBoxEmail.Text = model.SenderName;
|
||||||
|
labelDate.Visible = false;
|
||||||
|
textBoxDate.Visible = false;
|
||||||
|
textBoxSubject.Text = $"re: {model.Subject}";
|
||||||
|
textBoxBody.ReadOnly = false;
|
||||||
|
buttonReply.Visible = false;
|
||||||
|
buttonSend.Visible = true;
|
||||||
|
_logger.LogInformation("Запущена форма создания нового письма - ответа");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buttonClose_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
DialogResult = DialogResult.Cancel;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buttonReply_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
var service = Program.ServiceProvider?.GetService(typeof(FormLetter));
|
||||||
|
if (service is FormLetter form)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(model.ReplyMessageId))
|
||||||
|
{
|
||||||
|
form.messageId = model.ReplyMessageId;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
form.model = model;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (form.ShowDialog() != DialogResult.Cancel)
|
||||||
|
{
|
||||||
|
buttonReply.Visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buttonSend_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (model == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
string subject = textBoxSubject.Text;
|
||||||
|
string text = textBoxBody.Text;
|
||||||
|
|
||||||
|
Task.Run(() => _worker.MailSendReplyAsync(new MailReplySendInfoBindingModel
|
||||||
|
{
|
||||||
|
MailAddress = model.SenderName,
|
||||||
|
Subject = subject,
|
||||||
|
Text = text,
|
||||||
|
ParentMessageId = model.MessageId,
|
||||||
|
}));
|
||||||
|
DialogResult = DialogResult.OK;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
120
SushiBar/SushiBarView/FormLetter.resx
Normal file
120
SushiBar/SushiBarView/FormLetter.resx
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
74
SushiBar/SushiBarView/FormMail.Designer.cs
generated
74
SushiBar/SushiBarView/FormMail.Designer.cs
generated
@ -28,10 +28,26 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
|
this.panel1 = new System.Windows.Forms.Panel();
|
||||||
this.dataGridView = new System.Windows.Forms.DataGridView();
|
this.dataGridView = new System.Windows.Forms.DataGridView();
|
||||||
|
this.buttonOpen = new System.Windows.Forms.Button();
|
||||||
|
this.numericUpDownPage = new System.Windows.Forms.NumericUpDown();
|
||||||
|
this.buttonPreveous = new System.Windows.Forms.Button();
|
||||||
|
this.buttonNext = new System.Windows.Forms.Button();
|
||||||
|
this.panel1.SuspendLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.numericUpDownPage)).BeginInit();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
|
// panel1
|
||||||
|
//
|
||||||
|
this.panel1.Controls.Add(this.dataGridView);
|
||||||
|
this.panel1.Location = new System.Drawing.Point(3, 1);
|
||||||
|
this.panel1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
|
||||||
|
this.panel1.Name = "panel1";
|
||||||
|
this.panel1.Size = new System.Drawing.Size(795, 431);
|
||||||
|
this.panel1.TabIndex = 0;
|
||||||
|
//
|
||||||
// dataGridView
|
// dataGridView
|
||||||
//
|
//
|
||||||
this.dataGridView.AllowUserToAddRows = false;
|
this.dataGridView.AllowUserToAddRows = false;
|
||||||
@ -43,25 +59,75 @@
|
|||||||
this.dataGridView.ReadOnly = true;
|
this.dataGridView.ReadOnly = true;
|
||||||
this.dataGridView.RowHeadersWidth = 51;
|
this.dataGridView.RowHeadersWidth = 51;
|
||||||
this.dataGridView.RowTemplate.Height = 29;
|
this.dataGridView.RowTemplate.Height = 29;
|
||||||
this.dataGridView.Size = new System.Drawing.Size(786, 270);
|
this.dataGridView.Size = new System.Drawing.Size(795, 431);
|
||||||
this.dataGridView.TabIndex = 0;
|
this.dataGridView.TabIndex = 2;
|
||||||
|
//
|
||||||
|
// buttonOpen
|
||||||
|
//
|
||||||
|
this.buttonOpen.Location = new System.Drawing.Point(806, 80);
|
||||||
|
this.buttonOpen.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
|
||||||
|
this.buttonOpen.Name = "buttonOpen";
|
||||||
|
this.buttonOpen.Size = new System.Drawing.Size(107, 31);
|
||||||
|
this.buttonOpen.TabIndex = 1;
|
||||||
|
this.buttonOpen.Text = "Прочитать";
|
||||||
|
this.buttonOpen.UseVisualStyleBackColor = true;
|
||||||
|
this.buttonOpen.Click += new System.EventHandler(this.buttonOpen_Click);
|
||||||
|
//
|
||||||
|
// numericUpDownPage
|
||||||
|
//
|
||||||
|
this.numericUpDownPage.Location = new System.Drawing.Point(825, 287);
|
||||||
|
this.numericUpDownPage.Name = "numericUpDownPage";
|
||||||
|
this.numericUpDownPage.Size = new System.Drawing.Size(85, 27);
|
||||||
|
this.numericUpDownPage.TabIndex = 4;
|
||||||
|
this.numericUpDownPage.ValueChanged += new System.EventHandler(this.numericUpDownPage_ValueChanged);
|
||||||
|
//
|
||||||
|
// buttonPreveous
|
||||||
|
//
|
||||||
|
this.buttonPreveous.Location = new System.Drawing.Point(825, 323);
|
||||||
|
this.buttonPreveous.Name = "buttonPreveous";
|
||||||
|
this.buttonPreveous.Size = new System.Drawing.Size(39, 29);
|
||||||
|
this.buttonPreveous.TabIndex = 5;
|
||||||
|
this.buttonPreveous.Text = "<-";
|
||||||
|
this.buttonPreveous.UseVisualStyleBackColor = true;
|
||||||
|
this.buttonPreveous.Click += new System.EventHandler(this.buttonPreveous_Click);
|
||||||
|
//
|
||||||
|
// buttonNext
|
||||||
|
//
|
||||||
|
this.buttonNext.Location = new System.Drawing.Point(872, 323);
|
||||||
|
this.buttonNext.Name = "buttonNext";
|
||||||
|
this.buttonNext.Size = new System.Drawing.Size(39, 29);
|
||||||
|
this.buttonNext.TabIndex = 6;
|
||||||
|
this.buttonNext.Text = "->";
|
||||||
|
this.buttonNext.UseVisualStyleBackColor = true;
|
||||||
|
this.buttonNext.Click += new System.EventHandler(this.buttonNext_Click);
|
||||||
//
|
//
|
||||||
// FormMail
|
// FormMail
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(786, 270);
|
this.ClientSize = new System.Drawing.Size(925, 428);
|
||||||
this.Controls.Add(this.dataGridView);
|
this.Controls.Add(this.buttonNext);
|
||||||
|
this.Controls.Add(this.buttonPreveous);
|
||||||
|
this.Controls.Add(this.numericUpDownPage);
|
||||||
|
this.Controls.Add(this.buttonOpen);
|
||||||
|
this.Controls.Add(this.panel1);
|
||||||
this.Name = "FormMail";
|
this.Name = "FormMail";
|
||||||
this.Text = "Письма";
|
this.Text = "Письма";
|
||||||
this.Load += new System.EventHandler(this.FormMail_Load);
|
this.Load += new System.EventHandler(this.FormMail_Load);
|
||||||
|
this.panel1.ResumeLayout(false);
|
||||||
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.numericUpDownPage)).EndInit();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
private Panel panel1;
|
||||||
private DataGridView dataGridView;
|
private DataGridView dataGridView;
|
||||||
|
private Button buttonOpen;
|
||||||
|
private NumericUpDown numericUpDownPage;
|
||||||
|
private Button buttonPreveous;
|
||||||
|
private Button buttonNext;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,5 +1,10 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
using DocumentFormat.OpenXml.Spreadsheet;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using SushiBar;
|
||||||
|
using SushiBarBusinessLogic.BusinessLogics;
|
||||||
|
using SushiBarContracts.BindingModels;
|
||||||
using SushiBarContracts.BusinessLogicsContracts;
|
using SushiBarContracts.BusinessLogicsContracts;
|
||||||
|
using SushiBarContracts.SearchModels;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
@ -16,6 +21,8 @@ namespace SushiBarView
|
|||||||
{
|
{
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private readonly IMessageInfoLogic _logic;
|
private readonly IMessageInfoLogic _logic;
|
||||||
|
private int currentPage = 1;
|
||||||
|
private int pageLength = 2;
|
||||||
|
|
||||||
public FormMail(ILogger<FormMail> logger, IMessageInfoLogic logic)
|
public FormMail(ILogger<FormMail> logger, IMessageInfoLogic logic)
|
||||||
{
|
{
|
||||||
@ -28,12 +35,21 @@ namespace SushiBarView
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var list = _logic.ReadList(null);
|
var list = _logic.ReadList(new MessageInfoSearchModel()
|
||||||
|
{
|
||||||
|
PageLength = pageLength,
|
||||||
|
PageIndex = currentPage
|
||||||
|
|
||||||
|
});
|
||||||
|
numericUpDownPage.Value = pageLength;
|
||||||
if (list != null)
|
if (list != null)
|
||||||
{
|
{
|
||||||
dataGridView.DataSource = list;
|
dataGridView.DataSource = list;
|
||||||
dataGridView.Columns["MessageId"].Visible = false;
|
dataGridView.Columns["MessageId"].Visible = false;
|
||||||
dataGridView.Columns["ClientId"].Visible = false;
|
dataGridView.Columns["ClientId"].Visible = false;
|
||||||
|
dataGridView.Columns["ReplyMessageId"].Visible = false;
|
||||||
|
dataGridView.Columns["Reply"].Visible = false;
|
||||||
|
dataGridView.Columns["IsReply"].Visible = false;
|
||||||
dataGridView.Columns["Body"].AutoSizeMode =
|
dataGridView.Columns["Body"].AutoSizeMode =
|
||||||
DataGridViewAutoSizeColumnMode.Fill;
|
DataGridViewAutoSizeColumnMode.Fill;
|
||||||
}
|
}
|
||||||
@ -50,5 +66,50 @@ namespace SushiBarView
|
|||||||
{
|
{
|
||||||
LoadData();
|
LoadData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void buttonOpen_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (dataGridView.SelectedRows.Count <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var service = Program.ServiceProvider?.GetService(typeof(FormLetter));
|
||||||
|
if (service is FormLetter form)
|
||||||
|
{
|
||||||
|
string? messageId = dataGridView.SelectedRows[0].Cells["MessageId"].Value.ToString();
|
||||||
|
if (messageId == null) return;
|
||||||
|
form.messageId = messageId;
|
||||||
|
|
||||||
|
if (!Convert.ToBoolean(dataGridView.SelectedRows[0].Cells["IsReaded"].Value))
|
||||||
|
{
|
||||||
|
_logic.Update(new MessageInfoBindingModel
|
||||||
|
{
|
||||||
|
MessageId = messageId,
|
||||||
|
IsReaded = true,
|
||||||
|
ReplyMessageId = dataGridView.SelectedRows[0].Cells["ReplyMessageId"].Value?.ToString()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
form.ShowDialog();
|
||||||
|
LoadData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buttonPreveous_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
currentPage = Math.Max(1, currentPage - 1);
|
||||||
|
LoadData();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buttonNext_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
currentPage++;
|
||||||
|
LoadData();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void numericUpDownPage_ValueChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
pageLength = Math.Max(1, (int)numericUpDownPage.Value);
|
||||||
|
LoadData();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,8 +61,9 @@ namespace SushiBarView
|
|||||||
dataGridView.Columns["SushiId"].Visible = false;
|
dataGridView.Columns["SushiId"].Visible = false;
|
||||||
dataGridView.Columns["ClientId"].Visible = false;
|
dataGridView.Columns["ClientId"].Visible = false;
|
||||||
dataGridView.Columns["ClientEmail"].Visible = false;
|
dataGridView.Columns["ClientEmail"].Visible = false;
|
||||||
dataGridView.Columns["ImplementerId"].Visible = false;
|
dataGridView.Columns["ClientEmail"].Visible = false;
|
||||||
}
|
dataGridView.Columns["ImplementerId"].Visible = false;
|
||||||
|
}
|
||||||
_logger.LogInformation("Загрузка заказов");
|
_logger.LogInformation("Загрузка заказов");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -79,6 +80,8 @@ namespace SushiBarView
|
|||||||
form.ShowDialog();
|
form.ShowDialog();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void sushiToolStripMenuItem_Click(object sender, EventArgs e)
|
private void sushiToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var service = Program.ServiceProvider?.GetService(typeof(FormSushis));
|
var service = Program.ServiceProvider?.GetService(typeof(FormSushis));
|
||||||
|
@ -114,7 +114,8 @@ namespace SushiBarView
|
|||||||
services.AddTransient<FormReportOrders>();
|
services.AddTransient<FormReportOrders>();
|
||||||
services.AddTransient<FormReportShop>();
|
services.AddTransient<FormReportShop>();
|
||||||
services.AddTransient<FormReportGroupedOrders>();
|
services.AddTransient<FormReportGroupedOrders>();
|
||||||
}
|
services.AddTransient<FormLetter>();
|
||||||
|
}
|
||||||
private static void MailCheck(object obj) => ServiceProvider?.GetService<AbstractMailWorker>()?.MailCheck();
|
private static void MailCheck(object obj) => ServiceProvider?.GetService<AbstractMailWorker>()?.MailCheck();
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user