public async Task <Result> CreateForCounterparty(Counterparty counterparty, Currencies currency) { return(await Result.Success() .Ensure(IsCounterpartyVerified, "Account creation is only available for verified counterparties") .Map(CreateAccount) .Tap(LogSuccess) .OnFailure(LogFailure)); bool IsCounterpartyVerified() => new[] { CounterpartyStates.ReadOnly, CounterpartyStates.FullAccess }.Contains(counterparty.State); async Task <CounterpartyAccount> CreateAccount() { var account = new CounterpartyAccount { Balance = 0, CounterpartyId = counterparty.Id, Currency = Currencies.USD, // Only USD currency is supported Created = _dateTimeProvider.UtcNow() }; _context.CounterpartyAccounts.Add(account); await _context.SaveChangesAsync(); return(account); } void LogSuccess(CounterpartyAccount account) { _logger.LogCounterpartyAccountCreationSuccess( $"Successfully created account for counterparty: '{counterparty.Id}', account id: {account.Id}"); } void LogFailure(string error) { _logger.LogCounterpartyAccountCreationFailure($"Failed to create account for counterparty {counterparty.Id}, error {error}"); } }
private bool AreCurrenciesMatch(CounterpartyAccount account, PaymentCancellationData data) => account.Currency == data.Currency;
private bool AreCurrenciesMatch(CounterpartyAccount account, MoneyAmount amount) => account.Currency == amount.Currency;
private bool AreCurrenciesMatch(CounterpartyAccount account, PaymentData paymentData) => account.Currency == paymentData.Currency;