public async Task SaveAsync(StatementModel model, string storageKey, bool isEncrypted)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
if (storageKey.IsNothing())
{
throw new ArgumentNullException(nameof(storageKey));
}
var transactionSet = this.mapper.ToDto(model);
transactionSet.VersionHash = VersionHash;
transactionSet.StorageKey = storageKey;
transactionSet.Checksum = CalculateTransactionCheckSum(transactionSet);
if (model.AllTransactions.Count() != transactionSet.Transactions.Count())
{
throw new StatementModelChecksumException(
string.Format(
CultureInfo.InvariantCulture,
"Only {0} out of {1} transactions have been mapped correctly. Aborting the save, to avoid data loss and corruption.",
transactionSet.Transactions.Count,
model.AllTransactions.Count()));
}
var writer = this.readerWriterSelector.SelectReaderWriter(isEncrypted);
using (var stream = writer.CreateWritableStream(storageKey))
{
using (var streamWriter = new StreamWriter(stream))
{
WriteHeader(streamWriter, transactionSet);
foreach (var transaction in transactionSet.Transactions)
{
var line = new StringBuilder();
line.Append(transaction.TransactionType);
line.Append(",");
line.Append(transaction.Description);
line.Append(",");
line.Append(transaction.Reference1);
line.Append(",");
line.Append(transaction.Reference2);
line.Append(",");
line.Append(transaction.Reference3);
line.Append(",");
line.Append(transaction.Amount);
line.Append(",");
line.Append(transaction.Date.ToString("O", CultureInfo.InvariantCulture));
line.Append(",");
line.Append(transaction.BudgetBucketCode);
line.Append(",");
line.Append(transaction.Account);
line.Append(",");
line.Append(transaction.Id);
line.Append(",");
await streamWriter.WriteLineAsync(line.ToString());
}
await streamWriter.FlushAsync();
}
}
}