namespace MyOffice.Services.Currency; using Core; using Data.Models.Currencies; using Data.Repositories.Currency; using MyOffice.Services.Currency.Domain; public class CurrencyService { private readonly ICurrencyGlobalRepository _currencyGlobalRepository; private readonly ICurrencyRepository _currencyRepository; private readonly ICurrencyRateRepository _currencyRateRepository; public CurrencyService( ICurrencyGlobalRepository currencyGlobalRepository, ICurrencyRepository currencyRepository, ICurrencyRateRepository currencyRateRepository ) { _currencyGlobalRepository = currencyGlobalRepository; _currencyRepository = currencyRepository; _currencyRateRepository = currencyRateRepository; } public List GetGlobalAll() { return _currencyGlobalRepository.GetAll(); } public List GetAll(Guid userId) { return _currencyRepository.GetAll(userId); } public Dictionary GetAllWithRates(Guid userId) { var list = _currencyRepository.GetAll(userId); return list.ToDictionary( x => x, x => _currencyRateRepository.GetLastRates(x.Id, 1).FirstOrDefault() ); } public Exec AddCurrency(Guid userId, Currency currency) { if (currency == null) throw new ArgumentNullException(nameof(currency)); var result = new Exec(AddCurrencyStatus.success); var exists = _currencyRepository.GetByGlobalCurrency(userId, currency.CurrencyGlobalId); if (exists != null) { return result.Set(exists, AddCurrencyStatus.exists); } currency.Id = Guid.NewGuid(); currency.UserId = userId; if (!_currencyRepository.Add(currency)) { return result.Set(AddCurrencyStatus.failed); } return result.Set(currency); } public Exec AddCurrencyRate(Guid userId, Guid currencyId, CurrencyRate currencyRate) { if (currencyRate == null) throw new ArgumentNullException(nameof(currencyRate)); var result = new Exec(CurrencyAddRateStatus.success); var exists = _currencyRepository.Get(userId, currencyId); if (exists == null) { return result.Set(CurrencyAddRateStatus.not_found); } currencyRate.CurrencyId = exists.Id; currencyRate.DateTime = currencyRate.DateTime.Date; var rate = _currencyRateRepository.GetAtDate(currencyRate.CurrencyId, currencyRate.DateTime); if (rate.All(x => x.Rate != currencyRate.Rate)) { if (_currencyRateRepository.AddRate(currencyRate)) { return result.Set(currencyRate); } } return result.Set(CurrencyAddRateStatus.failed); } }