public int Insert(Data.UserMoneyTransfer transfer) { using (var connection = GetNewConnection()) { try { var parameters = new DynamicParameters(transfer); parameters.Output(transfer, x => x.TransferId); connection.Execute(SqlInsert, parameters); return(transfer.TransferId); } catch (PostgresException ex) { if (ex.SqlState != "23505") { throw; } var sql = $"SELECT * FROM UserMoneyTransfer WHERE Reference = '{transfer.Reference}'"; var duplicate = connection.Query <Data.UserMoneyTransfer>(sql).Single(); if (transfer.UserId != duplicate.UserId || transfer.UserAccount != duplicate.UserAccount || transfer.Amount != duplicate.Amount || transfer.Currency != duplicate.Currency || transfer.Reference != duplicate.Reference) { throw; } throw new DuplicateException(ex.Message, ex.InnerException); } } }
public void UpdateStatus(Data.UserMoneyTransfer transfer, string newStatus) { transfer.Status = newStatus; using (var connection = GetNewConnection()) { connection.Execute(SqlUpdateStatus, new { transfer.TransferId, Status = newStatus }); } }
public void RegisterAcceptedOffer(Offer offer) { var transfer = new Data.UserMoneyTransfer { Currency = offer.Currency.ToString(), Amount = Math.Round(offer.BuySell == BuySell.Buy ? offer.Amount * offer.Price : -offer.Amount * offer.Price, 2), Reference = offer.Reference, OpenTimestamp = offer.OpenTimeStamp, Status = UserMoneyTransferStatus.New, UserId = offer.UserId, UserAccount = offer.UserAccount }; try { _dalTransfer.Insert(transfer); } catch (DuplicateException) { // Duplication should mean service call is being repetead as a recovery from error on callers side. // So a duplication is OK (implies a caller's crash during or after previous successful call). return; } UserMoneyTransferGenerator.RegisterNewTransfer(transfer); //if (offer.BuySell == BuySell.Buy) //{ // var solaris = EuwaxData.Solaris; // var data = new MoneyTransferData // { // FromSwift = solaris.SwiftCode, // FromIban = "CustomerIBAN", // ToSwift = solaris.SwiftCode, // ToIban = solaris.GetAccount(offer.Currency).Iban, // Amount = Math.Round(offer.Amount * offer.Price, 2) // }; // Queue.Enqueue(new TransferFromCustomerTask(_dependencyFactory, this, data)); //} //else //{ // var solaris = EuwaxData.Solaris; // var data = new MoneyTransferData // { // FromSwift = solaris.SwiftCode, // FromIban = solaris.GetAccount(offer.Currency).Iban, // ToSwift = solaris.SwiftCode, // ToIban = "CustomerIBAN", // Amount = Math.Round(offer.Amount * offer.Price, 2) // }; // Queue.Enqueue(new TransferToCustomerTask(_dependencyFactory, this, data)); //} }