feat: первая версия контрактов для хранения по кладовщику

This commit is contained in:
2025-04-26 12:10:12 +04:00
parent 3ae7c03f1c
commit 853d483ea5
3 changed files with 340 additions and 0 deletions

View File

@@ -0,0 +1,116 @@
using AutoMapper;
using BankContracts.DataModels;
using BankContracts.Exceptions;
using BankContracts.StorageContracts;
using BankDatabase.Models;
using Microsoft.EntityFrameworkCore;
using Npgsql;
namespace BankDatabase.Implementations;
/// <summary>
/// реализация контракта хранилища для кредитной программы
/// </summary>
internal class CreditProgramStorageContract : ICreditProgramStorageContract
{
private readonly BankDbContext _dbContext;
private readonly Mapper _mapper;
public CreditProgramStorageContract(BankDbContext dbContext)
{
_dbContext = dbContext;
var config = new MapperConfiguration(x =>
{
x.CreateMap<CreditProgram, CreditProgramDataModel>();
x.CreateMap<CreditProgramDataModel, CreditProgram>();
});
_mapper = new Mapper(config);
}
public List<CreditProgramDataModel> GetList(string? storekeeperId = null, string? periodId = null)
{
try
{
var query = _dbContext.CreditPrograms.AsQueryable();
if (storekeeperId is not null)
{
query = query.Where(x => x.StorekeeperId == storekeeperId);
}
if (periodId is not null)
{
query = query.Where(x => x.PeriodId == periodId);
}
return [.. query.Select(x => _mapper.Map<CreditProgramDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex.Message);
}
}
public CreditProgramDataModel? GetElementById(string id)
{
try
{
return _mapper.Map<CreditProgramDataModel>(GetCreditProgramById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex.Message);
}
}
public void AddElement(CreditProgramDataModel creditProgramDataModel)
{
try
{
_dbContext.CreditPrograms.Add(_mapper.Map<CreditProgram>(creditProgramDataModel));
_dbContext.SaveChanges();
}
catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException($"Id {creditProgramDataModel.Id}");
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_CreditPrograms_Name" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException($"PhoneNumber {creditProgramDataModel.Name}");
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex.Message);
}
}
public void UpdElement(CreditProgramDataModel creditProgramDataModel)
{
try
{
var element = GetCreditProgramById(creditProgramDataModel.Id) ?? throw new ElementNotFoundException($"id: {creditProgramDataModel.Id}");
_dbContext.CreditPrograms.Update(_mapper.Map(creditProgramDataModel, element));
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_CreditPrograms_Name" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException($"PhoneNumber {creditProgramDataModel.Name}");
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex.Message);
}
}
private CreditProgram? GetCreditProgramById(string id) => _dbContext.CreditPrograms.FirstOrDefault(x => x.Id == id);
}

View File

@@ -0,0 +1,123 @@
using AutoMapper;
using BankContracts.DataModels;
using BankContracts.Exceptions;
using BankContracts.StorageContracts;
using BankDatabase.Models;
using Microsoft.EntityFrameworkCore;
using Npgsql;
namespace BankDatabase.Implementations;
/// <summary>
/// реализация контракта хранилища для валюты
/// </summary>
internal class CurrencyStorageContract : ICurrencyStorageContract
{
private readonly BankDbContext _dbContext;
private readonly Mapper _mapper;
public CurrencyStorageContract(BankDbContext dbContext)
{
_dbContext = dbContext;
var config = new MapperConfiguration(x =>
{
x.CreateMap<CurrencyDataModel, Currency>();
x.CreateMap<Currency, CurrencyDataModel>();
});
_mapper = new Mapper(config);
}
public List<CurrencyDataModel> GetList(string? storekeeperId = null)
{
try
{
var query = _dbContext.Currencies.AsQueryable();
if (storekeeperId is not null)
{
query = query.Where(x => x.StorekeeperId == storekeeperId);
}
return [.. query.Select(x => _mapper.Map<CurrencyDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex.Message);
}
}
public CurrencyDataModel? GetElementById(string id)
{
try
{
return _mapper.Map<CurrencyDataModel>(GetCurrencyById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex.Message);
}
}
public CurrencyDataModel? GetElementByAbbreviation(string abbreviation)
{
try
{
return _mapper.Map<CurrencyDataModel>(_dbContext.Currencies.FirstOrDefault(x => x.Abbreviation == abbreviation));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex.Message);
}
}
public void AddElement(CurrencyDataModel currencyDataModel)
{
try
{
_dbContext.Currencies.Add(_mapper.Map<Currency>(currencyDataModel));
_dbContext.SaveChanges();
}
catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException($"Id {currencyDataModel.Id}");
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Currencies_Abbreviation" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException($"Abbreviation {currencyDataModel.Abbreviation}");
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex.Message);
}
}
public void UpdElement(CurrencyDataModel currencyDataModel)
{
try
{
var element = GetCurrencyById(currencyDataModel.Id) ?? throw new ElementNotFoundException($"id: {currencyDataModel.Id}");
_dbContext.Currencies.Update(_mapper.Map(currencyDataModel, element));
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Currencies_Abbreviation" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException($"Abbreviation {currencyDataModel.Name}");
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex.Message);
}
}
private Currency? GetCurrencyById(string id) => _dbContext.Currencies.FirstOrDefault(x => x.Id == id);
}

View File

@@ -0,0 +1,101 @@
using AutoMapper;
using BankContracts.DataModels;
using BankContracts.Exceptions;
using BankContracts.StorageContracts;
using BankDatabase.Models;
namespace BankDatabase.Implementations;
/// <summary>
/// реализация контракта хранилища для срока
/// </summary>
internal class PeriodStorageContract : IPeriodStorageContract
{
private readonly BankDbContext _dbContext;
private readonly Mapper _mapper;
public PeriodStorageContract(BankDbContext dbContext)
{
_dbContext = dbContext;
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Period, PeriodDataModel>();
cfg.CreateMap<PeriodDataModel, Period>();
});
_mapper = new Mapper(config);
}
public List<PeriodDataModel> GetList(DateTime? startDate = null, DateTime? endDate = null, string? storekeeperId = null)
{
try
{
var query = _dbContext.Periods.AsQueryable();
if (startDate is not null)
{
query = query.Where(x => x.StartTime <= startDate);
}
if (endDate is not null)
{
query = query.Where(x => x.EndTime <= endDate);
}
if (storekeeperId is not null)
{
query = query.Where(x => x.StorekeeperId == storekeeperId);
}
return [..query.Select(x => _mapper.Map<PeriodDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex.Message);
}
}
public PeriodDataModel? GetElementById(string id)
{
try
{
return _mapper.Map<PeriodDataModel>(GetPeriodById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex.Message);
}
}
public void AddElement(PeriodDataModel periodDataModel)
{
try
{
_dbContext.Periods.Add(_mapper.Map<Period>(periodDataModel));
_dbContext.SaveChanges();
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex.Message);
}
}
public void UpdElement(PeriodDataModel periodDataModel)
{
try
{
var element = GetPeriodById(periodDataModel.Id) ?? throw new ElementNotFoundException(periodDataModel.Id);
_dbContext.Periods.Update(_mapper.Map(periodDataModel, element));
_dbContext.SaveChanges();
} catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex.Message);
}
}
private Period? GetPeriodById(string id) => _dbContext.Periods.FirstOrDefault(x => x.Id == id);
}