From bb4b669d7ceddf8114c7bc8bd3c8a06e05190fb9 Mon Sep 17 00:00:00 2001 From: aleksandr chegodaev Date: Tue, 30 Apr 2024 18:51:45 +0400 Subject: [PATCH] =?UTF-8?q?=D0=B0=D0=BB=D1=8F=20=D0=BC=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=20=D0=B0=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Implements/AccountStorage.cs | 82 ++++++++++ .../Implements/CarStorage.cs | 148 ++++++++++++++++++ 2 files changed, 230 insertions(+) create mode 100644 CarCenterDatabaseImplement/Implements/AccountStorage.cs create mode 100644 CarCenterDatabaseImplement/Implements/CarStorage.cs diff --git a/CarCenterDatabaseImplement/Implements/AccountStorage.cs b/CarCenterDatabaseImplement/Implements/AccountStorage.cs new file mode 100644 index 0000000..c7ebaf8 --- /dev/null +++ b/CarCenterDatabaseImplement/Implements/AccountStorage.cs @@ -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 Accounts(CarCenterDb context) + => context.Accounts + .Include(x => x.ClientByCar).ThenInclude(x => x.Car) + .Include(x => x.ClientByCar).ThenInclude(x => x.Client); + + public List GetFullList() + { + using var context = new CarCenterDb(); + return Accounts(context) + .Select(x => (AccountViewModel)x) + .ToList(); + } + + public List 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; + } + } +} diff --git a/CarCenterDatabaseImplement/Implements/CarStorage.cs b/CarCenterDatabaseImplement/Implements/CarStorage.cs new file mode 100644 index 0000000..870520c --- /dev/null +++ b/CarCenterDatabaseImplement/Implements/CarStorage.cs @@ -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 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 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? 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 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; + } + } +}