аля монтера ара

This commit is contained in:
aleksandr chegodaev 2024-04-30 18:51:45 +04:00
parent 18c17156f1
commit bb4b669d7c
2 changed files with 230 additions and 0 deletions

View File

@ -0,0 +1,82 @@
using CarCenterContracts.BindingModels;
using CarCenterContracts.SearchModels;
using CarCenterContracts.StoragesContracts;
using CarCenterContracts.ViewModels;
using CarCenterDatabaseImplement.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore.Query;
namespace CarCenterDatabaseImplement.Implements
{
public class AccountStorage : IAccountStorage
{
private static IIncludableQueryable<Account, Client?> Accounts(CarCenterDb context)
=> context.Accounts
.Include(x => x.ClientByCar).ThenInclude(x => x.Car)
.Include(x => x.ClientByCar).ThenInclude(x => x.Client);
public List<AccountViewModel> GetFullList()
{
using var context = new CarCenterDb();
return Accounts(context)
.Select(x => (AccountViewModel)x)
.ToList();
}
public List<AccountViewModel> GetFilteredList(AccountSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model), "Получена пустая поисковая модель");
}
if (model.DateFrom.HasValue && !model.DateTo.HasValue || model.DateTo.HasValue && !model.DateFrom.HasValue)
{
throw new ArgumentException("Получена поисковая модель только с началом или концом периода");
}
if (!model.DateFrom.HasValue && !model.ClientId.HasValue)
{
throw new ArgumentNullException(nameof(model.ClientId), "Получена поисковая модель без ClientId");
}
if (!model.DateFrom.HasValue && !model.CarId.HasValue)
{
throw new ArgumentNullException(nameof(model.CarId), "Получена поисковая модель без CarId");
}
using var context = new CarCenterDb();
if (model.DateFrom.HasValue)
{
return Accounts(context)
.Where(x => model.DateFrom.Value <= x.DateOfAccount && x.DateOfAccount <= model.DateTo.Value)
.Select(x => (AccountViewModel)x)
.ToList();
}
return Accounts(context)
.Where(x => x.ClientByCar != null &&
x.ClientByCar.ClientId == model.ClientId &&
x.ClientByCar.CarId == model.CarId)
.Select(x => (AccountViewModel)x)
.ToList();
}
public AccountViewModel? GetElement(AccountSearchModel model)
{
using var context = new CarCenterDb();
return Accounts(context)
.FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id));
}
public AccountViewModel? Insert(AccountBindingModel model)
{
if (model == null)
{
return null;
}
var newAccount = Account.Create(model);
using var context = new CarCenterDb();
context.Accounts.Add(newAccount);
context.SaveChanges();
return newAccount;
}
}
}

View File

@ -0,0 +1,148 @@
using System.Security.Cryptography.X509Certificates;
using CarCenterContracts.BindingModels;
using CarCenterContracts.SearchModels;
using CarCenterContracts.StoragesContracts;
using CarCenterContracts.ViewModels;
using CarCenterDatabaseImplement.Models;
using Microsoft.EntityFrameworkCore;
namespace CarCenterDatabaseImplement.Implements
{
public class CarStorage : ICarStorage
{
private void CheckSearchModel(CarSearchModel model)
{
if (model == null)
throw new ArgumentNullException("Передаваемая модель для поиска равна нулю", nameof(model));
if (!model.Id.HasValue && !model.ImplementerId.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && model.ClientsIds == null)
throw new ArgumentException("Все передаваемые поля поисковой модели оказались пусты или равны null");
if (model.DateFrom.HasValue != model.DateTo.HasValue)
throw new ArgumentException($"Не указано начало {model.DateFrom} или конец {model.DateTo} периода для поиска по дате.");
}
public CarViewModel? Delete(CarBindingModel model)
{
using var context = new CarCenterDb();
var element = context.Cars.FirstOrDefault(x => x.Id == model.Id);
if (element != null)
{
context.Cars.Remove(element);
context.SaveChanges();
return element;
}
return null;
}
public List<AccountViewModel> GetAccountsFromCarAndClient(CarSearchModel modelCar, ClientSearchModel modelClient)
{
if (!modelCar.Id.HasValue)
{
throw new ArgumentNullException(nameof(modelCar), "Получена поисковая модель без Id");
}
if (!modelClient.Id.HasValue)
{
throw new ArgumentNullException(nameof(modelClient), "Получена поисковая модель без Id");
}
using var context = new CarCenterDb();
var clientByCar = context.ClientsByCars
.Include(x => x.Accounts)
.FirstOrDefault(x => x.ClientId == modelClient.Id && x.CarId == modelCar.Id);
if (clientByCar?.Accounts == null)
{
throw new InvalidOperationException(
$"Не существует связи между данным клиентом(Id={modelClient.Id}) и талоном(Id={modelCar.Id})");
}
return clientByCar.Accounts.Select(account => (AccountViewModel)account).ToList();
}
public CarViewModel? GetElement(CarSearchModel model)
{
using var context = new CarCenterDb();
if (!model.Id.HasValue)
{
return null;
}
return context.Cars
.Include(x => x.Client)
.Include(x => x.Clients)
.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id);
}
public List<CarViewModel> GetFilteredList(CarSearchModel model)
{
CheckSearchModel(model);
if (model.Id.HasValue)
{
var res = GetElement(model);
return res != null ? new() { res } : new();
}
using var context = new CarCenterDb();
var query = context.Cars.Include(x => x.Client);
IQueryable<Car>? resultQuery = null;
if (model.ImplementerId.HasValue)
{
return query
.Where(x => model.ImplementerId == x.ImplementerId)
.Select(x => (CarViewModel)x)
.ToList();
}
if (model.DateTo.HasValue)
resultQuery = query
.Include(x => x.Clients)
.ThenInclude(x => x.Client)
.Include(x => x.Requirements)
.ThenInclude(x => x.Requirement)
.Where(x => model.DateFrom <= x.DateOfReceipt && x.DateOfReceipt <= model.DateTo);
else if (model.ClientsIds != null)
resultQuery = query
.Include(x => x.Clients)
.ThenInclude(x => x.Client)
.Where(x => x.Clients.Any(x => model.ClientsIds.Contains(x.ClientId)));
return resultQuery?
.Select(x => (CarViewModel)x)
.ToList() ?? new();
}
public List<CarViewModel> GetFullList()
{
using var context = new CarCenterDb();
return context.Cars
.Include(x => x.Client)
.Include(x => x.Clients)
.Select(x => (CarViewModel)x)
.ToList();
}
public CarViewModel? Insert(CarBindingModel model)
{
var newCar = Car.Create(model);
if (newCar == null)
{
return null;
}
using var context = new CarCenterDb();
context.Cars.Add(newCar);
context.SaveChanges();
newCar.UpdateClients(context, model);
context.SaveChanges();
return newCar;
}
public CarViewModel? Update(CarBindingModel model)
{
using var context = new CarCenterDb();
var Carvisit = context.Cars.FirstOrDefault(x => x.Id == model.Id);
if (Carvisit == null)
{
return null;
}
Carvisit.Update(model);
Carvisit.UpdateClients(context, model);
context.SaveChanges();
return Carvisit;
}
}
}