public IEnumerable <ApplicationEvent> Process(TransactionProcessorCommand command) { var processor = _transactionProcessors.FirstOrDefault(x => x.CanProcess(command.Transaction, command.BankOperation)); if (processor == null) { throw new ArgumentException("Can't process operation. No processor found.", "command"); } return(processor.Process(command)); }
private IEnumerable<ApplicationEvent> OnFatalError(TransactionProcessorCommand command, Exception exception) { command.Transaction.Fail(Messages.UnknownTransactionError); var bankOperationId = command.BankOperation == null ? null : (long?)command.BankOperation.Id; var operation = command.BankOperation == null ? null : command.BankOperation.ToModel<BankOperation, BankOperationModel>(); var transaction = command.Transaction.ToModel<TransactionModel>(); var events = new List<ApplicationEvent>() { new TransactionProcessedEvent(command.OperationId, transaction, bankOperationId) }; if (operation != null) { events.Add(new OperationProgressEvent(command.OperationId, operation)); } return events; }
public IEnumerable<ApplicationEvent> Process(TransactionProcessorCommand command) { var policy = _policies.FirstOrDefault(x => x.AppliesTo(command.Transaction, command.BankOperation)); if (command.Transaction.Status != ProcessStatus.Pending) { _logger.Warn("Transaction #{0} was passed to processor in invalid state.", command.Transaction.Id); return Enumerable.Empty<ApplicationEvent>(); } if (policy == null) { throw new ArgumentException("Can't process transaction. No policy found.", "command"); } var dynamicPolicy = (dynamic) policy; try { return Process(dynamicPolicy, command); } catch (Exception ex) { return OnFatalError(command, ex); } }
private IEnumerable<ApplicationEvent> Process(CompletePolicy policy, TransactionProcessorCommand command) { command.Transaction.Complete(policy.GetPostDateUtc(command.Transaction, command.BankOperation)); var bankOperationId = command.BankOperation == null ? null : (long?)command.BankOperation.Id; var operation = command.BankOperation == null ? null : command.BankOperation.ToModel<BankOperation, BankOperationModel>(); var transaction = command.Transaction.ToModel<TransactionModel>(); var events = new List<ApplicationEvent>() { new TransactionProcessedEvent(command.OperationId, transaction, bankOperationId) }; if (operation != null) { events.Add(new OperationProgressEvent(command.OperationId, operation)); } return events; }
private IEnumerable<ApplicationEvent> Process(PostponePolicy policy, TransactionProcessorCommand command) { var transactionModel = command.Transaction.ToModel<TransactionModel>(); var operationId = command.BankOperation == null ? null : (long?)command.BankOperation.Id; var @event = new TransactionProgressEvent(command.OperationId, transactionModel, operationId); return new List<ApplicationEvent>() { new PostponedEvent(@event, policy.GetScheduledDateUtc(command.Transaction, command.BankOperation)) }; }