2023-05-08 18:39:29 +04:00

113 lines
4.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using SoftwareInstallationContracts.BindingModels;
using SoftwareInstallationContracts.BusinessLogicsContracts;
using SoftwareInstallationContracts.SearchModels;
using SoftwareInstallationContracts.ViewModels;
using SoftwareInstallationDatabaseImplement.Models;
using SoftwareInstallationDataModels.Models;
using Microsoft.AspNetCore.Mvc;
using System.Text.Json;
using System.Net.Http.Headers;
using System.Text;
namespace SoftwareInstallationRestApi.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class ShopController : Controller
{
private readonly ILogger _logger;
private readonly IShopLogic _logic;
public ShopController(IShopLogic logic, ILogger<ShopController> logger)
{
_logger = logger;
_logic = logic;
}
[HttpGet]
public List<ShopViewModel>? GetShops()
{
try
{
return _logic.ReadList(null);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка получения списка магазинов");
throw;
}
}
/// <summary>
/// Получает на вход айди магазина и по нему возвращает магазин
/// </summary>
/// <param name="id">The identifier.</param>
/// <returns>
/// Кортеж из магазина, итератора с изделиями которые находятся в магазине и итератора с количеством этих изделий.
/// </returns>
/// Почему изделия и их количество не находятся в одном кортеже? потому что тогда он их не сериализует
/// и я не знаю почему.
/// Также, к сожалению, приходится явно присваивать каждое поле из IPastyModel в PastyViewModel, поскольку
/// нельзя сериализовать интерфейс, и при это нельзя его неявно кастануть к PackageViewModel, даже если в
/// истинном типе SoftwareInstallationDatabaseImplement.Package такой каст есть.
/// Сделать же каст в PackageViewModel из IPackageModel нельзя, потому что запрещен каст с интерфейсами.
/// Единственный нормальный вариант создать отдельную сущность, где объединить изделия и их количество,
/// и уже ее хранить в магазине и соответственно ее передавать. Но поскольку для этого нужно перелопатить пол-проекта
/// и получить минус баллы на pr я откажусь от подобной идеи.
[HttpGet]
public Tuple<ShopViewModel, IEnumerable<PackageViewModel>, IEnumerable<int>>? GetShopWithPackages(int id)
{
try
{
var shop = _logic.ReadElement(new() { Id = id });
if (shop == null)
{
return null;
}
return Tuple.Create(shop,
shop.Packages.Select(x => new PackageViewModel ()
{
Id = x.Value.Item1.Id,
Price = x.Value.Item1.Price,
PackageName = x.Value.Item1.PackageName,
}),
shop.Packages.Select(x => x.Value.Item2));
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка получения магазина");
throw;
}
}
[HttpPost]
public void CRUDShop(Action action)
{
try
{
action.Invoke();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка операции CRUD - {operation} с магазином", action.Method.Name);
throw;
}
}
[HttpPost]
public void UpdateShop(ShopBindingModel model) => CRUDShop(() => _logic.Update(model));
[HttpPost]
public void CreateShop(ShopBindingModel model) => CRUDShop(() => _logic.Create(model));
[HttpPost]
public void DeleteShop(ShopBindingModel model) => CRUDShop(() => _logic.Delete(model));
[HttpPost]
public void AddPackageInShop(Tuple<ShopSearchModel, PackageViewModel, int> countPackageForShop)
{
CRUDShop(() => _logic.AddPackage(countPackageForShop.Item1, countPackageForShop.Item2, countPackageForShop.Item3));
}
}
}