Реализовано отправка и принятие изделий магазина на клиенте и сервере

Достаточно костыльно но пофиг
This commit is contained in:
Данияр Аглиуллов 2023-03-08 19:35:48 +04:00
parent 3735eb81b8
commit fde6a6b5c4
6 changed files with 58 additions and 22 deletions

View File

@ -96,5 +96,7 @@ namespace ConfectioneryDatabaseImplement.Models
}
_pastryComponents = null;
}
public static implicit operator ConfectioneryContracts.ViewModels.PastryViewModel(ConfectioneryDatabaseImplement.Models.Pastry model) => model.GetViewModel;
}
}

View File

@ -2,6 +2,7 @@
using ConfectioneryContracts.BusinessLogicsContracts;
using ConfectioneryContracts.SearchModels;
using ConfectioneryContracts.ViewModels;
using ConfectioneryDatabaseImplement.Models;
using ConfectioneryDataModels.Models;
using Microsoft.AspNetCore.Mvc;
using System.Text.Json;
@ -36,13 +37,41 @@ namespace ConfectioneryRestApi.Controllers
}
}
/// <summary>
/// Получает на вход айди магазина и по нему возвращает магазин
/// </summary>
/// <param name="id">The identifier.</param>
/// <returns>
/// Кортеж из магазина, итератора с изделиями которые находятся в магазине и итератора с количеством этих изделий.
/// </returns>
/// Почему изделия и их количество не находятся в одном кортеже? потому что тогда он их не сериализует
/// и я не знаю почему.
/// Также, к сожалению, приходится явно присваивать каждое поле из IPastyModel в PastyViewModel, поскольку
/// нельзя сериализовать интерфейс, и при это нельзя его неявно кастануть к PastryViewModel, даже если в
/// истинном типе ConfectioneryDatabaseImplement.Pastry такой каст есть.
/// Сделать же каст в PastryViewModel из IPastryModel нельзя, потому что запрещен каст с интерфейсами.
/// Единственный нормальный вариант создать отдельную сущность, где объединить изделия и их количество,
/// и уже ее хранить в магазине и соответственно ее передавать. Но поскольку для этого нужно перелопатить пол-проекта
/// и получить минус баллы на pr я откажусь от подобной идеи.
[HttpGet]
public ShopViewModel? GetJsonShop(int id)
public Tuple<ShopViewModel, IEnumerable<PastryViewModel>, IEnumerable<int>>? GetShopWithPastries(int id)
{
try
{
return _logic.ReadElement(new() { Id = id });
var shop = _logic.ReadElement(new() { Id = id });
if (shop == null)
{
return null;
}
return Tuple.Create(shop,
shop.Pastries.Select(x => new PastryViewModel ()
{
Id = x.Value.Item1.Id,
Price = x.Value.Item1.Price,
PastryName = x.Value.Item1.PastryName,
}),
shop.Pastries.Select(x => x.Value.Item2));
}
catch (Exception ex)
{
@ -73,7 +102,7 @@ namespace ConfectioneryRestApi.Controllers
public void DeleteShop(ShopBindingModel model) => CRUDShop(() => _logic.Delete(model));
[HttpPost]
public void AddPastryInShop(Tuple<ShopSearchModel, IPastryModel, int> countPastryForShop)
public void AddPastryInShop(Tuple<ShopSearchModel, PastryViewModel, int> countPastryForShop)
{
CRUDShop(() => _logic.AddPastry(countPastryForShop.Item1, countPastryForShop.Item2, countPastryForShop.Item3));
}

View File

@ -98,13 +98,16 @@ namespace ConfectioneryShopApp.Controllers
}
[HttpGet]
public Tuple<string, ShopViewModel?> GetTablePastriesFromShop(int shop)
public Tuple<string, ShopViewModel>? GetTablePastriesFromShop(int shop)
{
var sh = APIClient.GetRequest<ShopViewModel>($"api/shop/getjsonshop?id={shop}");
var result = APIClient.GetRequest<Tuple<ShopViewModel, IEnumerable<PastryViewModel>, IEnumerable<int>>?>($"api/shop/getshopwithpastries?id={shop}");
if (result == null)
{
return null;
}
var shopModel = result.Item1;
var resultHtml = "";
if (sh != null)
{
foreach (var (item, count) in sh.Pastries.Values)
foreach (var (item, count) in result.Item2.Zip(result.Item3))
{
resultHtml += "<tr>";
resultHtml += $"<td>{item?.PastryName ?? string.Empty}</td>";
@ -112,8 +115,7 @@ namespace ConfectioneryShopApp.Controllers
resultHtml += $"<td>{count}</td>";
resultHtml += "</tr>";
}
}
return Tuple.Create(resultHtml, sh);
return Tuple.Create(resultHtml, shopModel);
}
[HttpGet]
@ -189,7 +191,7 @@ namespace ConfectioneryShopApp.Controllers
}
APIClient.PostRequest("api/shop/addpastryinshop", Tuple.Create(
new ShopSearchModel() { Id = shop },
new PastryBindingModel() { Id = pastry },
new PastryViewModel() { Id = pastry },
count
));
Response.Redirect("Index");

View File

@ -7,7 +7,7 @@
}
<div class="text-center">
<h1 class="display-4">Заказы</h1>
<h1 class="display-4">Магазины</h1>
</div>

View File

@ -58,10 +58,13 @@
url: "/Home/GetTablePastriesFromShop",
data: { shop: shop },
success: function (result) {
if (result != null)
{
$('#name').val(result.item2.name);
$('#address').val(result.item2.address);
$('#table-pastries').html(result.item1);
}
}
});
};
}

View File

@ -23,7 +23,7 @@
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Заказы</a>
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Магазины</a>
</li>
</ul>
</div>