using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using AutoMapper; using Microsoft.EntityFrameworkCore; using Npgsql; using PuferFishContracts.DataModels; using PuferFishContracts.Exceptions; using PuferFishContracts.StoragesContracts; using PuferFishDataBase.Models; namespace PuferFishDataBase.Implementations; internal class BuyerStorageContract : IBuyerStorageContract { private readonly PuferFishDbContext _dbContext; private readonly Mapper _mapper; public BuyerStorageContract(PuferFishDbContext dbContext) { _dbContext = dbContext; var config = new MapperConfiguration(cfg => { cfg.CreateMap(); cfg.CreateMap(); }); _mapper = new Mapper(config); } public List GetList() { try { return [.. _dbContext.Buyers.Select(x => _mapper.Map(x))]; } catch (Exception ex) { _dbContext.ChangeTracker.Clear(); throw new StorageException(ex); } } public BuyerDataModel? GetElementById(string id) { try { return _mapper.Map(GetBuyerById(id)); } catch (Exception ex) { _dbContext.ChangeTracker.Clear(); throw new StorageException(ex); } } public BuyerDataModel? GetElementByFIO(string fio) { try { return _mapper.Map(_dbContext.Buyers.FirstOrDefault(x => x.FIO == fio)); } catch (Exception ex) { _dbContext.ChangeTracker.Clear(); throw new StorageException(ex); } } public BuyerDataModel? GetElementByPhoneNumber(string phoneNumber) { try { return _mapper.Map(_dbContext.Buyers.FirstOrDefault(x => x.PhoneNumber == phoneNumber)); } catch (Exception ex) { _dbContext.ChangeTracker.Clear(); throw new StorageException(ex); } } public void AddElement(BuyerDataModel buyerDataModel) { try { _dbContext.Buyers.Add(_mapper.Map(buyerDataModel)); _dbContext.SaveChanges(); } catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict") { _dbContext.ChangeTracker.Clear(); throw new ElementExistsException("Id", buyerDataModel.Id); } catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Buyers_PhoneNumber" }) { _dbContext.ChangeTracker.Clear(); throw new ElementExistsException("PhoneNumber", buyerDataModel.PhoneNumber); } catch (Exception ex) { _dbContext.ChangeTracker.Clear(); throw new StorageException(ex); } } public void UpdElement(BuyerDataModel buyerDataModel) { try { var element = GetBuyerById(buyerDataModel.Id) ?? throw new ElementNotFoundException(buyerDataModel.Id); _dbContext.Buyers.Update(_mapper.Map(buyerDataModel, element)); _dbContext.SaveChanges(); } catch (ElementNotFoundException) { _dbContext.ChangeTracker.Clear(); throw; } catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Buyers_PhoneNumber" }) { _dbContext.ChangeTracker.Clear(); throw new ElementExistsException("PhoneNumber", buyerDataModel.PhoneNumber); } catch (Exception ex) { _dbContext.ChangeTracker.Clear(); throw new StorageException(ex); } } public void DelElement(string id) { try { var element = GetBuyerById(id) ?? throw new ElementNotFoundException(id); _dbContext.Buyers.Remove(element); _dbContext.SaveChanges(); } catch (ElementNotFoundException) { _dbContext.ChangeTracker.Clear(); throw; } catch (Exception ex) { _dbContext.ChangeTracker.Clear(); throw new StorageException(ex); } } private Buyer? GetBuyerById(string id) => _dbContext.Buyers.FirstOrDefault(x => x.Id == id); }