ISEbd-21_Putilin_P.A._Preca.../PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/ShopStorage.cs
2023-05-10 00:08:21 +04:00

137 lines
4.7 KiB
C#
Raw Permalink 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 Microsoft.EntityFrameworkCore;
using PrecastConcretePlantContracts.BindingModels;
using PrecastConcretePlantContracts.SearchModels;
using PrecastConcretePlantContracts.StoragesContract;
using PrecastConcretePlantContracts.ViewModels;
using PrecastConcretePlantDataModels.Models;
namespace PrecastConcretePlantDatabaseImplement
{
public class ShopStorage : IShopStorage
{
public ShopViewModel? Delete(ShopBindingModel model)
{
using var context = new PrecastConcretePlantDatabase();
var element = context.Shops.FirstOrDefault(x => x.Id == model.Id);
if (element != null)
{
context.Shops.Remove(element);
context.SaveChanges();
return element.GetViewModel;
}
return null;
}
public ShopViewModel? GetElement(ShopSearchModel model)
{
if (!model.Id.HasValue)
{
return null;
}
using var context = new PrecastConcretePlantDatabase();
return context.Shops
.Include(x => x.ShopReinforceds)
.ThenInclude(x => x.Reinforced)
.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id)
?.GetViewModel;
}
public List<ShopViewModel> GetFilteredList(ShopSearchModel model)
{
if (string.IsNullOrEmpty(model.Name))
{
return new();
}
using var context = new PrecastConcretePlantDatabase();
return context.Shops
.Include(x => x.ShopReinforceds)
.ThenInclude(x => x.Reinforced)
.Select(x => x.GetViewModel)
.Where(x => x.Name.Contains(model.Name ?? string.Empty))
.ToList();
}
public List<ShopViewModel> GetFullList()
{
using var context = new PrecastConcretePlantDatabase();
return context.Shops
.Include(x => x.ShopReinforceds)
.ThenInclude(x => x.Reinforced)
.Select(shop => shop.GetViewModel)
.ToList();
}
public ShopViewModel? Insert(ShopBindingModel model)
{
using var context = new PrecastConcretePlantDatabase();
using var transaction = context.Database.BeginTransaction();
try
{
var newShop = Shop.Create(context, model);
if (newShop == null)
{
return null;
}
if (context.Shops.Any(x => x.Name == newShop.Name))
{
throw new Exception("Не должно быть два магазина с одним названием");
}
context.Shops.Add(newShop);
context.SaveChanges();
transaction.Commit();
return newShop.GetViewModel;
}
catch
{
transaction.Rollback();
throw;
}
}
public ShopViewModel? Update(ShopBindingModel model)
{
using var context = new PrecastConcretePlantDatabase();
var shop = context.Shops.FirstOrDefault(x => x.Id == model.Id);
if (shop == null)
{
return null;
}
shop.Update(model);
shop.UpdateReinforceds(context, model);
context.SaveChanges();
return shop.GetViewModel;
}
public bool SellReinforceds(IReinforcedModel reinforced, int needCount)
{
using var context = new PrecastConcretePlantDatabase();
using var transaction = context.Database.BeginTransaction();
foreach (var sp in context.ShopReinforceds.Where(x => x.ReinforcedId == reinforced.Id))
{
var res = Math.Min(needCount, sp.Count);
sp.Count -= res;
needCount -= res;
if (sp.Count == 0) // Изделия больше нет в магазине, значит удаляем его
{
context.ShopReinforceds.Remove(sp);
}
if (needCount == 0) // Нельзя коммитить изменения в цикле, что использует контекст, поэтому выходим
{
break;
}
}
if (needCount == 0)
{
context.SaveChanges();
transaction.Commit();
}
else
{
transaction.Rollback();
}
return needCount == 0;
}
}
}