контракты для agency и supplies

This commit is contained in:
2025-03-26 18:02:17 +04:00
parent ce473a3725
commit ea790d5d17
5 changed files with 260 additions and 13 deletions

View File

@@ -12,16 +12,13 @@ using System.Xml.Linq;
namespace MagicCarpetContracts.DataModels;
public class TourDataModel(string id, string tourName, string tourCountry, double price, TourType tourType,
List<TourSuppliesDataModel> supplies, List<TourAgencyDataModel> agency) : IValidation
public class TourDataModel(string id, string tourName, string tourCountry, double price, TourType tourType) : IValidation
{
public string Id { get; private set; } = id;
public string TourName { get; private set; } = tourName;
public string TourCountry { get; private set; } = tourCountry;
public double Price { get; private set; } = price;
public TourType Type { get; private set; } = tourType;
public List<TourSuppliesDataModel> Supplies { get; private set; } = supplies;
public List<TourAgencyDataModel> Agency { get; private set; } = agency;
public void Validate()
{
@@ -37,9 +34,5 @@ public class TourDataModel(string id, string tourName, string tourCountry, doubl
throw new ValidationException("Field Price is less than or equal to 0");
if (Type == TourType.None)
throw new ValidationException("Field Type is empty");
if ((Supplies?.Count ?? 0) == 0)
throw new ValidationException("The tour must include supplies");
if ((Agency?.Count ?? 0) == 0)
throw new ValidationException("The tour must include agency");
}
}

View File

@@ -0,0 +1,148 @@
using AutoMapper;
using MagicCarpetContracts.DataModels;
using MagicCarpetContracts.Exceptions;
using MagicCarpetContracts.StoragesContracts;
using MagicCarpetDatabase.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MagicCarpetDatabase.Implementations;
public class AgencyStorageContract : IAgencyStorageContract
{
private readonly MagicCarpetDbContext _dbContext;
private readonly Mapper _mapper;
public AgencyStorageContract(MagicCarpetDbContext dbContext)
{
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Agency, AgencyDataModel>()
.ConstructUsing(src => new AgencyDataModel(
src.Id,
src.Type,
src.Count,
_mapper.Map<List<TourAgencyDataModel>>(src.Tours)
));
cfg.CreateMap<AgencyDataModel, Agency>();
cfg.CreateMap<TourAgencyDataModel, TourAgency>().ReverseMap();
});
_mapper = new Mapper(config);
}
public List<AgencyDataModel> GetList()
{
try
{
return [.. _dbContext.Agencies.Select(x => _mapper.Map<AgencyDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public AgencyDataModel GetElementById(string id)
{
try
{
return _mapper.Map<AgencyDataModel>(GetAgencyById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void AddElement(AgencyDataModel agencyDataModel)
{
try
{
_dbContext.Agencies.Add(_mapper.Map<Agency>(agencyDataModel));
_dbContext.SaveChanges();
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void UpdElement(AgencyDataModel agencyDataModel)
{
try
{
var element = GetAgencyById(agencyDataModel.Id) ?? throw new ElementNotFoundException(agencyDataModel.Id);
_dbContext.Agencies.Update(_mapper.Map(agencyDataModel, element));
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void DelElement(string id)
{
try
{
var element = GetAgencyById(id) ?? throw new ElementNotFoundException(id);
_dbContext.Agencies.Remove(element);
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public bool CheckComponents(SaleDataModel saleDataModel)
{
using (var transaction = _dbContext.Database.BeginTransaction())
{
foreach (SaleTourDataModel sale_tour in saleDataModel.Tours)
{
var tour = _dbContext.Tours.FirstOrDefault(x => x.Id == sale_tour.TourId);
var agency = _dbContext.Agencies.FirstOrDefault(x => x.Type == tour.Type && x.Count >= sale_tour.Count);
if (agency == null)
{
transaction.Rollback();
return false;
}
if (agency.Count - sale_tour.Count == 0)
{
DelElement(agency.Id);
}
else
{
agency.Count -= sale_tour.Count;
}
}
transaction.Commit();
_dbContext.SaveChanges();
return true;
}
}
private Agency? GetAgencyById(string id) => _dbContext.Agencies.FirstOrDefault(x => x.Id == id);
}

View File

@@ -0,0 +1,100 @@
using AutoMapper;
using MagicCarpetContracts.DataModels;
using MagicCarpetContracts.Exceptions;
using MagicCarpetContracts.StoragesContracts;
using MagicCarpetDatabase.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MagicCarpetDatabase.Implementations;
public class SuppliesStorageContract : ISuppliesStorageContract
{
private readonly MagicCarpetDbContext _dbContext;
private readonly Mapper _mapper;
public SuppliesStorageContract(MagicCarpetDbContext dbContext)
{
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Supplies, SuppliesDataModel>()
.ConstructUsing(src => new SuppliesDataModel(
src.Id,
src.Type,
src.ProductuionDate,
src.Count,
_mapper.Map<List<TourSuppliesDataModel>>(src.Tours)
));
cfg.CreateMap<SuppliesDataModel, Supplies>();
cfg.CreateMap<TourSuppliesDataModel, TourSupplies>().ReverseMap();
});
_mapper = new Mapper(config);
}
public List<SuppliesDataModel> GetList(DateTime? startDate = null)
{
try
{
return [.. _dbContext.Supplieses.Select(x => _mapper.Map<SuppliesDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public SuppliesDataModel GetElementById(string id)
{
try
{
return _mapper.Map<SuppliesDataModel>(GetSuppliesById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void AddElement(SuppliesDataModel suppliesDataModel)
{
try
{
_dbContext.Supplieses.Add(_mapper.Map<Supplies>(suppliesDataModel));
_dbContext.SaveChanges();
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
public void UpdElement(SuppliesDataModel suppliesDataModel)
{
try
{
var element = GetSuppliesById(suppliesDataModel.Id) ?? throw new ElementNotFoundException(suppliesDataModel.Id);
_dbContext.Supplieses.Update(_mapper.Map(suppliesDataModel, element));
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex);
}
}
private Supplies? GetSuppliesById(string id) => _dbContext.Supplieses.FirstOrDefault(x => x.Id == id);
}

View File

@@ -7,6 +7,7 @@ using Microsoft.EntityFrameworkCore;
using Npgsql;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -23,10 +24,7 @@ internal class TourStorageContract : ITourStorageContract
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Tour, TourDataModel>()
.ConstructUsing(src => new TourDataModel(src.Id, src.TourName, src.TourCountry, src.Price, src.Type));
cfg.CreateMap<TourDataModel, Tour>();
cfg.CreateMap<TourHistory, TourHistoryDataModel>();
cfg.AddMaps(typeof(Tour));
});
_mapper = new Mapper(config);
}

View File

@@ -9,7 +9,7 @@ using System.Threading.Tasks;
namespace MagicCarpetDatabase;
internal class MagicCarpetDbContext(IConfigurationDatabase configurationDatabase) : DbContext
public class MagicCarpetDbContext(IConfigurationDatabase configurationDatabase) : DbContext
{
private readonly IConfigurationDatabase? _configurationDatabase = configurationDatabase;
@@ -38,6 +38,10 @@ internal class MagicCarpetDbContext(IConfigurationDatabase configurationDatabase
.HasFilter($"\"{nameof(Post.IsActual)}\" = TRUE");
modelBuilder.Entity<SaleTour>().HasKey(x => new { x.SaleId, x.TourId });
modelBuilder.Entity<TourSupplies>().HasKey(x => new { x.SuppliesId, x.TourId });
modelBuilder.Entity<TourAgency>().HasKey(x => new { x.AgencyId, x.TourId });
}
public DbSet<Client> Clients { get; set; }
@@ -55,4 +59,8 @@ internal class MagicCarpetDbContext(IConfigurationDatabase configurationDatabase
public DbSet<SaleTour> SaleTours { get; set; }
public DbSet<Employee> Employees { get; set; }
public DbSet<Supplies> Supplieses { get; set; }
public DbSet<Agency> Agencies { get; set; }
public DbSet<TourSupplies> TourSupplieses { get; set; }
public DbSet<TourAgency> TourAgensies { get; set; }
}