хочу каникулы

This commit is contained in:
aleksandr chegodaev 2024-04-30 19:54:09 +04:00
parent e974da95b5
commit f4f0834859
3 changed files with 145 additions and 0 deletions

View File

@ -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<int, ClientByCarModel>? _cachedClients = null;
[NotMapped]
public Dictionary<int, ClientByCarModel> 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<ClientByCar> Clients { get; private set; } = new();
[Required]
public List<RequirementByCar> Requirements { get; private set; } = new();
public static Car Create(CarBindingModel model) =>
model.CastWithCommonProperties<Car, CarBindingModel>();
public static implicit operator CarViewModel?(Car? model)
{
if (model == null)
{
return null;
}
model._cachedClients = null;
var res = model.CastWithCommonProperties<CarViewModel, Car>();
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<ClientByCar, ClientByCarModel>();
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;
}
}
}

View File

@ -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<Car>? Cars { get; private set; }
public static Implementer Create(ImplementerBindingModel model)
{
return model.CastWithCommonProperties<Implementer, ImplementerBindingModel>();
}
public static implicit operator ImplementerViewModel?(Implementer? model) => model?.CastWithCommonProperties<ImplementerViewModel, Implementer>();
}
}

View File

@ -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; }
}
}