diff --git a/CarCenterDatabaseImplement/Models/Car.cs b/CarCenterDatabaseImplement/Models/Car.cs new file mode 100644 index 0000000..52962cf --- /dev/null +++ b/CarCenterDatabaseImplement/Models/Car.cs @@ -0,0 +1,98 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.Extensions; +using CarCenterContracts.ViewModels; +using CarCenterDataModels; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq.Expressions; +using CarCenterDataModels.ProxyModels; + +namespace CarCenterDatabaseImplement.Models +{ + public class Car : ICarModel + { + public int ImplementerId { get; private set; } + public string Name { get; private set; } = string.Empty; + public double Price { get; set; } + + public DateOnly DateOfReceipt { get; private set; } + + public DateOnly DateOfPassage { get; private set; } + + + private Dictionary? _cachedClients = null; + [NotMapped] + public Dictionary ClientsModel => + _cachedClients ??= Clients.Select(x => (ClientByCarModel)x).ToDictionary(x => x.ClientId, x => x); + + public int Id { get; private set; } + + [Required] + public Implementer? Client { get; private set; } + [Required] + public List Clients { get; private set; } = new(); + + [Required] + public List Requirements { get; private set; } = new(); + + public static Car Create(CarBindingModel model) => + model.CastWithCommonProperties(); + + public static implicit operator CarViewModel?(Car? model) + { + if (model == null) + { + return null; + } + + model._cachedClients = null; + var res = model.CastWithCommonProperties(); + res.DirectorLogin = model.Client?.Login ?? string.Empty; + res.RequirementViewModels = model.Requirements? + .Select(x => (RequirementViewModel)x.Requirement) + .ToList() ?? new(); + foreach (var clientByCar in model.Clients) + { + if (clientByCar.Client != null) + { + res.ClientViewModels.Add(clientByCar.Client.GetViewModel()); + } + else + { + res.ClientViewModels = new(); + break; + } + } + return res; + } + + public void Update(CarBindingModel model) + { + Price = model.Price; + DateOfPassage = model.DateOfPassage; + } + + public void UpdateClients(CarCenterDb context, CarBindingModel model) + { + var oldClients = context.ClientsByCars.Where(x => x.CarId == model.Id).ToDictionary(x => x.ClientId, x => x); + var newClients = model.ClientsModel.ToDictionary( + x => x.Key, + x => + { + var res = x.Value.CastWithCommonProperties(); + res.ClientId = x.Key; + res.CarId = Id; + return res; + }); + context.RemoveRange(oldClients.Where(x => !newClients.ContainsKey(x.Key)).Select(x => x.Value)); + context.SaveChanges(); + context.AddRange (newClients.Where(x => !oldClients.ContainsKey(x.Key)).Select(x => x.Value)); + oldClients + .Where(x => newClients.ContainsKey(x.Key)) + .Select(x => x.Value).ToList() + .ForEach(x => x.DateOfClient = newClients[x.ClientId].DateOfClient); + context.SaveChanges(); + _cachedClients = null; + } + } +} diff --git a/CarCenterDatabaseImplement/Models/Implementer.cs b/CarCenterDatabaseImplement/Models/Implementer.cs new file mode 100644 index 0000000..d3efea1 --- /dev/null +++ b/CarCenterDatabaseImplement/Models/Implementer.cs @@ -0,0 +1,34 @@ +using CarCenterContracts.BindingModels; +using CarCenterContracts.Extensions; +using CarCenterContracts.ViewModels; +using CarCenterDataModels; +using System.ComponentModel.DataAnnotations; + +namespace CarCenterDatabaseImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; set; } + [Required] + public string FirstName { get; private set; } = string.Empty; + [Required] + public string LastName { get; private set; } = string.Empty; + + [Required] + public string Login { get; private set; } = string.Empty; + [Required] + public string Password { get; private set; } = string.Empty; + + public string PhoneNumber { get; set; } = string.Empty; + + [Required] + public List? Cars { get; private set; } + + public static Implementer Create(ImplementerBindingModel model) + { + return model.CastWithCommonProperties(); + } + + public static implicit operator ImplementerViewModel?(Implementer? model) => model?.CastWithCommonProperties(); + } +} diff --git a/CarCenterDatabaseImplement/Models/RequirementByCar.cs b/CarCenterDatabaseImplement/Models/RequirementByCar.cs new file mode 100644 index 0000000..384ea1c --- /dev/null +++ b/CarCenterDatabaseImplement/Models/RequirementByCar.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; +using CarCenterDataModels.ProxyModels; + +namespace CarCenterDatabaseImplement.Models +{ + public class RequirementByCar : RequirementByCarModel + { + [Required] + public Requirement? Requirement { get; private set; } + [Required] + public Car? Car { get; set; } + } +}